mysql - 带有变量方法、查询和限制的 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 是极限
解决方案
欢迎来到论坛。你搞错了——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 中执行此操作,但如果不查找,我不确定。
我希望这会有所帮助,并希望有更直接知识的人可以更好地帮助您。
推荐阅读
- spring-mvc - 无法提取响应:没有找到适合响应类型 [boolean] 和内容类型 [text/html;charset=iso-8859-1] 的 HttpMessageConverter
- javascript - 如何在没有 JavaScript 的情况下获取浏览器时区
- php - I want to make my long reference link dynamic with htaccess
- html - CSS如何对齐不同卡片表上的内容,例如
- javascript - vue中的简单验证
- javascript - JS递归代码抛出最大调用堆栈大小错误
- css - 让 SVG 加号出现在选项卡的右侧,而不是包含 div 的右侧
- java - Jackson 泛型类型的反序列化 - 尝试解析的子类型时缺少类型
- android - 应用程序手动关闭时未触发 AlarmManager
- javascript - '{ identifier: string; 类型的参数 }' 不可分配给“ConcatArray”类型的参数
'