MySQL存储过程调用列表

时间:2015-07-17 17:28:17

标签: mysql stored-procedures

这是我的问题,我有一个存储过程(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)

2 个答案:

答案 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 ;