似乎“select into”无法使用以下代码。 我可以从sql查询中获取“select子句”中的数据但是使用测试过程代码,它只为每个out参数返回null值。 (应该返回一条记录)
谁能告诉我我做错了什么?
操作系统:Mac OSX DBM:MySQL WorkBench 6.1 MySQL:5.6.13
程序代码
DELIMITER $$
CREATE DEFINER= PROCEDURE `POLL_NEW_MESSAGE`(OUT DEVICEID INT, OUT ORGID INT, OUT MSGDATE VARCHAR(8), OUT MSGTIME VARCHAR(6), OUT BODY TEXT, OUT TOKEN VARCHAR(64))
BEGIN
DECLARE DEVICEID INT DEFAULT -1;
DECLARE ORGID INT DEFAULT -1;
DECLARE MSGDATE VARCHAR(8) DEFAULT NULL;
DECLARE MSGTIME VARCHAR(6) DEFAULT NULL;
DECLARE BODY TEXT DEFAULT NULL;
DECLARE TOKEN VARCHAR(64) DEFAULT NULL;
DECLARE UPDATED INT DEFAULT 0;
SELECT msg.device_id, msg.org_id, msg.msg_date, msg.msg_time, msg.body
INTO DEVICEID, ORGID, MSGDATE, MSGTIME, BODY
FROM pm_msg msg, pm_org org
WHERE msg.status = '0'
AND org.org_id = msg.org_id
AND org.status = 'G';
END
测试代码1
PREPARE s FROM ' CALL `POLL_NEW_MESSAGE`(@DEVICEID, @ORGID, @MSGDATE, @MSGTIME, @BODY, @TOKEN)';
execute s;
SELECT @DEVICEID, @ORGID, @MSGDATE, @MSGTIME, @BODY, @TOKEN;
测试代码2
CALL `POLL_NEW_MESSAGE`(@DEVICEID, @ORGID, @MSGDATE, @MSGTIME, @BODY, @TOKEN);SELECT @DEVICEID, @ORGID, @MSGDATE, @MSGTIME, @BODY, @TOKEN;
答案 0 :(得分:1)
您已将所有OUT
个变量声明为scalar
类型,但在select into
查询中,您尝试将它们存储为多个值。你正在做的方式..你最终会得到错误的结果,因为你已经将OUT变量声明为标量。因此,如果您的查询返回多行,那么您肯定会得到错误的结果。
SELECT msg.device_id, msg.org_id, msg.msg_date, msg.msg_time, msg.body
INTO DEVICEID, ORGID, MSGDATE, MSGTIME, BODY
FROM pm_msg msg, pm_org org
WHERE msg.status = '0'
AND org.org_id = msg.org_id
AND org.status = 'G'
LIMIT 1;
建议是,将表值参数作为OUT参数。
答案 1 :(得分:1)
在具有相同变量名称的过程中声明参数会导致问题。 一旦我删除了所有已经用作过程参数的变量声明,它就可以正常工作。
固定代码
DELIMITER $$
CREATE DEFINER= PROCEDURE `POLL_NEW_MESSAGE`(OUT DEVICEID INT, OUT ORGID INT, OUT MSGDATE VARCHAR(8), OUT MSGTIME VARCHAR(6), OUT BODY TEXT)
BEGIN
SELECT msg.device_id, msg.org_id, msg.msg_date, msg.msg_time, msg.body
INTO DEVICEID, ORGID, MSGDATE, MSGTIME, BODY
FROM pm_msg msg, pm_org org
WHERE msg.status = '0'
AND org.org_id = msg.org_id
AND org.status = 'G'
LIMIT 1;
END
答案 2 :(得分:0)
存储过程中声明的参数名称必须是UNIQUE。 (注意:这些名称不区分大小写) 即使声明的参数的名称与表中的列名相同,它也会返回NULL。