使用整数数组作为参数调用存储过程?
Call a stored procedure with an integer array as argument?
我想将整数数组作为参数传递给存储过程,如何实现?
CREATE PROCEDURE rd22(unitList INT)
BEGIN
SELECT * FROM abet INNER JOIN a ON a.id = abet.alarm_source
AND a.unit IN (unitList)
WHERE abet.begin_timestamp = 1395874800000;
END
这是存储过程的样子,我想实现这样的结果:
SET @val = [1,2,3];
CALL rd22(@val);
我能想到的一种方法是传递一个字符串,然后以某种方式将其转换为整数。有没有其他微妙的方法来实现这个。
感谢您的宝贵时间。
干杯。
你不能这样做,当你在查询中将参数作为逗号分隔字符串传递时,它只会在执行 in clause
时取第一个值,你需要使用准备好的语句
CREATE PROCEDURE rd22(unitList varchar(100))
BEGIN
set @ul = unitList;
set @qry = concat("select * from abet INNER JOIN a ON a.id = abet.alarm_source and a.unit IN(",@ul,") WHERE abet.begin_timestamp = 1395874800000");
prepare stmt from @qry;
execute stmt;
END
调用方式为
SET @val = '1,2,3';
CALL rd22(@val);
这是mysql
中的一个测试用例
mysql> select * from test ;
+------+---------------------+---------------------+----------+
| id | created | resolved | status |
+------+---------------------+---------------------+----------+
| 1 | 2015-05-10 00:00:00 | 1970-01-01 00:00:00 | open |
| 2 | 2015-05-10 00:00:00 | 1970-01-01 00:00:00 | new |
| 3 | 2015-05-10 00:00:00 | 2015-05-12 00:00:00 | resolved |
| 4 | 2015-05-11 00:00:00 | 1970-01-01 00:00:00 | open |
| 5 | 2015-05-11 00:00:00 | 1970-01-01 00:00:00 | new |
| 6 | 2015-05-11 00:00:00 | 2015-05-11 00:00:00 | resolved |
| 7 | 2015-05-12 00:00:00 | 1970-01-01 00:00:00 | open |
| 8 | 2015-05-12 00:00:00 | 1970-01-01 00:00:00 | new |
| 9 | 2015-05-12 00:00:00 | 1970-01-01 00:00:00 | open |
+------+---------------------+---------------------+----------+
9 rows in set (0.00 sec)
mysql> delimiter //
mysql> CREATE PROCEDURE testin(vals varchar(100))
-> BEGIN
-> set @ul = vals;
-> set @qry = concat("select * from test where id IN(",@ul,")");
-> prepare stmt from @qry;
-> execute stmt;
-> END;//
Query OK, 0 rows affected (0.03 sec)
mysql> set @val = '3,4,6';
Query OK, 0 rows affected (0.00 sec)
mysql> call testin(@val);
+------+---------------------+---------------------+----------+
| id | created | resolved | status |
+------+---------------------+---------------------+----------+
| 3 | 2015-05-10 00:00:00 | 2015-05-12 00:00:00 | resolved |
| 4 | 2015-05-11 00:00:00 | 1970-01-01 00:00:00 | open |
| 6 | 2015-05-11 00:00:00 | 2015-05-11 00:00:00 | resolved |
+------+---------------------+---------------------+----------+
3 rows in set (0.01 sec)
我想将整数数组作为参数传递给存储过程,如何实现?
CREATE PROCEDURE rd22(unitList INT)
BEGIN
SELECT * FROM abet INNER JOIN a ON a.id = abet.alarm_source
AND a.unit IN (unitList)
WHERE abet.begin_timestamp = 1395874800000;
END
这是存储过程的样子,我想实现这样的结果:
SET @val = [1,2,3];
CALL rd22(@val);
我能想到的一种方法是传递一个字符串,然后以某种方式将其转换为整数。有没有其他微妙的方法来实现这个。
感谢您的宝贵时间。
干杯。
你不能这样做,当你在查询中将参数作为逗号分隔字符串传递时,它只会在执行 in clause
时取第一个值,你需要使用准备好的语句
CREATE PROCEDURE rd22(unitList varchar(100))
BEGIN
set @ul = unitList;
set @qry = concat("select * from abet INNER JOIN a ON a.id = abet.alarm_source and a.unit IN(",@ul,") WHERE abet.begin_timestamp = 1395874800000");
prepare stmt from @qry;
execute stmt;
END
调用方式为
SET @val = '1,2,3';
CALL rd22(@val);
这是mysql
中的一个测试用例mysql> select * from test ;
+------+---------------------+---------------------+----------+
| id | created | resolved | status |
+------+---------------------+---------------------+----------+
| 1 | 2015-05-10 00:00:00 | 1970-01-01 00:00:00 | open |
| 2 | 2015-05-10 00:00:00 | 1970-01-01 00:00:00 | new |
| 3 | 2015-05-10 00:00:00 | 2015-05-12 00:00:00 | resolved |
| 4 | 2015-05-11 00:00:00 | 1970-01-01 00:00:00 | open |
| 5 | 2015-05-11 00:00:00 | 1970-01-01 00:00:00 | new |
| 6 | 2015-05-11 00:00:00 | 2015-05-11 00:00:00 | resolved |
| 7 | 2015-05-12 00:00:00 | 1970-01-01 00:00:00 | open |
| 8 | 2015-05-12 00:00:00 | 1970-01-01 00:00:00 | new |
| 9 | 2015-05-12 00:00:00 | 1970-01-01 00:00:00 | open |
+------+---------------------+---------------------+----------+
9 rows in set (0.00 sec)
mysql> delimiter //
mysql> CREATE PROCEDURE testin(vals varchar(100))
-> BEGIN
-> set @ul = vals;
-> set @qry = concat("select * from test where id IN(",@ul,")");
-> prepare stmt from @qry;
-> execute stmt;
-> END;//
Query OK, 0 rows affected (0.03 sec)
mysql> set @val = '3,4,6';
Query OK, 0 rows affected (0.00 sec)
mysql> call testin(@val);
+------+---------------------+---------------------+----------+
| id | created | resolved | status |
+------+---------------------+---------------------+----------+
| 3 | 2015-05-10 00:00:00 | 2015-05-12 00:00:00 | resolved |
| 4 | 2015-05-11 00:00:00 | 1970-01-01 00:00:00 | open |
| 6 | 2015-05-11 00:00:00 | 2015-05-11 00:00:00 | resolved |
+------+---------------------+---------------------+----------+
3 rows in set (0.01 sec)