我正在编写一些存储过程来自动化数据库上经常使用的查询,但我收到的似乎是非常奇怪的行为。
DELIMITER //
CREATE PROCEDURE SelectOrders(IN item VARCHAR(30), IN category VARCHAR(30))
BEGIN
SELECT
Order_ID,
Category,
Item,
Discount
FROM
Orders
WHERE
Item RLIKE item
AND Category LIKE category
如果我调用我的存储过程(CALL SelectOrders('.*', '%');
)以返回所有匹配项(即使用RLIKE
和LIKE
的通配符),它将返回结果,而不是预期结果,使用RLIKE
或LIKE
的列(因此,此示例中的项目和类别)将分别显示.*
或%
。
所以Orders
表包含 -
Order_ID || Category || Item || Discount
--------------------------------------------------
1 || Clothing || Hat || 0
2 || Books || Bible || 0
会返回 -
Order_ID || Category || Item || Discount
--------------------------------------------------
1 || % || .* || 0
2 || % || .* || 0
如果我更改了我传入的参数的值(例如.*at
参数的item
),它将返回表中的相关行(因此,在这种情况下, Order_ID 1)但它仍将显示IN
参数而不是返回的结果。
我不确定这里发生了什么。任何帮助将不胜感激。
答案 0 :(得分:1)
您应该为参数命名,使它们与列名不同。试试这个:
DELIMITER //
CREATE PROCEDURE SelectOrders(IN v_item VARCHAR(30), IN v_category VARCHAR(30))
BEGIN
SELECT Order_ID, Category, Item, Discount
FROM Orders
WHERE Item RLIKE v_item AND Category LIKE v_category
使用反引号对如何解释值没有影响。当您说Item RLIKE item
时,别名item
将解析为表格中的列。两次。您需要以不同方式命名变量以区分两者。