MySQL:获取所有procedure out参数null

时间:2014-05-28 02:55:42

标签: mysql stored-procedures mysql-workbench

似乎“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;

3 个答案:

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