首页 > 解决方案 > 带有变量方法、查询和限制的 mySQL 存储过程

问题描述

您好我对 mySQL 很陌生,我正在尝试编写一个存储过程。我已经在互联网上搜索过类似的问题,但我找不到任何结果。

我正在尝试为我的 web 应用程序创建搜索功能,您可以在其中在数据库中搜索结果,但是有不同的搜索方法(按姓名、姓氏、地址等)。查询的结果也应该有限制(1、5、10、20)。我的想法是这样的:

CREATE PROCEDURE SelectTopResults @query varchar(60), @method varchar(20), @limited int(3)
AS
SELECT * FROM customer WHERE @method = %@query% LIMIT @limited
GO;

这不运行。这个程序的想法是否正确?那我应该如何解决它?还是有另一种更好的方法来做到这一点?

提前致谢。


编辑:这是用 PHP 访问的。我的想法是编写一个基本上可以做到的代码:

$sql = 'EXEC SelectTopResults @method = ?, @query = ?, @limited = ?;'

编辑2:已解决,非常感谢!:)

对于那些对代码感兴趣的人:

DELIMITER //
CREATE PROCEDURE selectTopResults(IN col varchar(64), IN limited int(3), searchquery varchar(60))
BEGIN
    SET @s = CONCAT("SELECT * FROM customer WHERE ",col," LIKE '%",searchquery,"%' LIMIT ",limited);
    PREPARE stmt FROM @s;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END
//
DELIMITER ;

也适用于通配符,可以通过以下方式调用:

CALL selectTopResults('column_name', 5, 'query');

其中 5 是极限

标签: mysqlstored-procedures

解决方案


欢迎来到论坛。你搞错了——MySQL 手册中有一些关于存储过程的内容,但我在第一次尝试时永远找不到它。幸运的是,有很多教程,如果你在 google、bing 或其他地方搜索它们。试试这个,例如:https ://www.mysqltutorial.org/introduction-to-sql-stored-procedures.aspx

因此,要使您的程序正常工作:

DELIMITER $$

CREATE PROCEDURE SelectTopResults (
  query varchar(60), 
  method varchar(20), 
  limited int(3)
)
BEGIN
  ...
END$$

DELIMITER ;

使用DELIMITER语句来更改表示语句结束的内容是正常的 - 否则,当您输入进入过程的语句时,您将收到错误消息。接下来,您需要在参数周围加上圆括号,并且@在它们的名称之前没有。

您可能想知道为什么我将参数列表分成几行;这只是我的风格 - 我觉得它更容易阅读参数的开始和结束位置。最后,关于你的SELECT陈述:

SELECT * FROM customer WHERE @method = %@query% LIMIT @limited

我不确定你在这里尝试什么 - 首先,你需要松开@s - 那是你设置的变量SET,我相信(我是从记忆中写的,因为我不在我的手册附近),而不是变量和过程或函数中的参数。但更重要的是,您不能将参数method用作表列的名称 - 为此您需要将其构造SELECT为字符串并执行。据我所知,这被称为“动态 SQL”;我认为您可以在 MySQL 中执行此操作,但如果不查找,我不确定。

我希望这会有所帮助,并希望有更直接知识的人可以更好地帮助您。


推荐阅读