这是我的问题,我有一个存储过程(Limited_Access_Users)我需要调用并传递一个ID列表,以便它进入一个变量,由where子句的cl_no(id_list)使用。
我在下面试过,但没有运气。每次只取第一个参数“1”而不是“20”。
CALL Limited_Access_Users('1,20')
CALL Limited_Access_Users(“1,20”)
存储过程
创建DEFINER = IDPAdmin
@ %
程序Limited_Access_Users
(
IN id_list TEXT)
BEGIN
选择DISTINCT c.c_no,cl_no,1
这 联系人c 在c.c_no = cn.c_no上加入contacts_notes cn 和(cn_status = 1或cn_status为null) 其中cl_no在(id_list)
中答案 0 :(得分:0)
由于id_list是一个字符串,因此您基本上是在说WHERE cl_no IN ("1,20")
而不是WHERE cl_no IN (1, 20)
。您可以通过在存储过程中构造PREPARE
d语句的查询来解决此问题。
像这样:
SET @Q := CONCAT("[first part of query]", the_list, "[the rest of the query]");
PREPARE thePS FROM @Q;
EXECUTE thePS;
DEALLOCATE PREPARE thePS;
有关SQL注入的警告适用,具体取决于存储过程的可访问性。
如果调用存储过程的代码恰好依赖于标识符,您可能希望使用比@Q更独特的会话变量名称。
答案 1 :(得分:0)
试一试:
DELIMITER $$
drop procedure if exists doSomething1234$$
CREATE PROCEDURE doSomething1234
(IN id_list TEXT)
BEGIN
-- note id_list is passed in like a string '1,2,3,7'
-- it will be wrapped for the in clause like in (1,2,3,7)
--
-- select DISTINCT c.c_no, cl_no, 1
-- FROM contacts c join contacts_notes cn
-- on c.c_no = cn.c_no and (cn_status =1 or cn_status is null)
-- where cl_no in (id_list)
set @sql1='select DISTINCT c.c_no, cl_no, 1 FROM contacts c join contacts_notes cn';
set @sql2=' on c.c_no = cn.c_no and (cn_status =1 or cn_status is null)';
set @sql3=concat(' where cl_no in (',id_list,')');
set @statement=concat(@sql1,@sql2,@sql3);
PREPARE stmt FROM @statement;
execute stmt;
deallocate prepare stmt;
END;
$$
DELIMITER ;