MySql将游标提取到变量中并返回null
问题是(在循环中)的fetchinto没有将值放入变量中。我已经看过了,但是这个表已经被填充了 事务表如下所示:MySql将游标提取到变量中并返回null,mysql,stored-procedures,Mysql,Stored Procedures,问题是(在循环中)的fetchinto没有将值放入变量中。我已经看过了,但是这个表已经被填充了 事务表如下所示: CREATE TABLE `transactionentry` ( `transactionid` bigint(20) NOT NULL AUTO_INCREMENT, ... PRIMARY KEY (`transactionid`), ... ) ENGINE=InnoDB AUTO_INCREMENT=651 DEFAULT CHARSET=u
CREATE TABLE `transactionentry` (
`transactionid` bigint(20) NOT NULL AUTO_INCREMENT,
...
PRIMARY KEY (`transactionid`),
...
) ENGINE=InnoDB AUTO_INCREMENT=651 DEFAULT CHARSET=utf8;
存储过程:
PROCEDURE `doTxnHouseKeeping`()
BEGIN
-- Loop invariant
DECLARE noEntries INTEGER DEFAULT FALSE;
-- Error codes
DECLARE code CHAR(5) DEFAULT '00000';
DECLARE msg TEXT;
-- Txn vars
DECLARE transactionId BIGINT(20);
DECLARE lastTransactionId BIGINT(20) DEFAULT 0;
-- testing
DECLARE counter INT(11) DEFAULT 0;
DEClARE txnEntryCur CURSOR FOR
SELECT
`transactionid`
FROM
`transactionentry`
LIMIT 1;
DECLARE CONTINUE HANDLER FOR
NOT FOUND SET noEntries = TRUE;
DECLARE EXIT HANDLER FOR
SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1
code = RETURNED_SQLSTATE, msg = MESSAGE_TEXT;
SELECT CONCAT('Error fetching transaction entries code: ', code, ' message: ', msg);
END;
OPEN txnEntryCur;
mainLoop: LOOP
FETCH
txnEntryCur
INTO
transactionId;
IF noEntries THEN
LEAVE mainLoop;
END IF;
IF transactionId IS NOT NULL THEN
INSERT INTO debugTable (`bigintval`) VALUES (transactionId);
ELSE
INSERT INTO debugTable (`strval`) VALUES ('transactionId is NULL');
END IF;
SET counter = counter + 1;
END LOOP mainLoop;
CLOSE txnEntryCur;
SELECT CONCAT("Count: ", counter);
END
运行存储过程将返回以下结果:
+--------------------------+
|CONCAT("Count: ", counter)|
+--------------------------+
| Count: 1|
+--------------------------+
调试表中的结果是:
+------------+---------+-----------------------+
|iddebugTable|bigintval| strval|
+------------+---------+-----------------------+
| 1| NULL|"transactionId is NULL"|
+------------+---------+-----------------------+
这意味着该值未复制到中
运行SQL时(与存储过程中一样),它返回:
+-------------+
|transactionid|
+-------------+
| 591|
+-------------+
尝试为变量
transactionId
提供默认值
...
DECLARE transactionId BIGINT(20) DEFAULT 0
...
并且还替换
DECLARE noEntries INTEGER DEFAULT FALSE;
与
因为您想将其用作
布尔值
并在后面的过程中将其设置为真
。我发现了问题,这很奇怪。它不会导致任何错误和/或异常,只是不会将任何值放入变量中。解决方案是将游标declare语句更改为:
DECLARE txnEntryCur CURSOR FOR
SELECT
`transactionid`
FROM
`transactionentry`
LIMIT 1;
致:
甚至文档也没有指出这可能是个问题()
如果我从多个表中进行选择,那么我只会完全限定SQL语句的SELECT(和WHERE)部分,因此在更复杂的查询中不会用到它
我希望这将在将来为某人节省一些时间。您的问题在于:
DECLARE transactionId BIGINT(20);
您声明了一个名为transactionId
的变量,因此执行此操作时:
DEClARE txnEntryCur CURSOR FOR
SELECT
`transactionid`
FROM
`transactionentry`
LIMIT 1;
光标的select选择您声明的变量,这就是完全限定字段的原因。但是,如果您不想完全限定select中的字段,可以重命名变量。谢谢您的回复。不,不起作用,调试表中的条目现在是0(非空),但不是select语句返回的值,即591。noEntries是一个布尔值,但在所有的调整中,它最终都是一个INT,甚至修复它也没有帮助。我使用
table.field
解决了我的问题,而只使用了字段名。谢谢多蠢的虫子啊。我花了一个小时才找到你的帖子。。。谢谢非常感谢分享这个。奇怪的虫子在这个阳光明媚的星期天早上测试了我一段时间的理智,我本来应该做些更有趣的事情。
DECLARE transactionId BIGINT(20);
DEClARE txnEntryCur CURSOR FOR
SELECT
`transactionid`
FROM
`transactionentry`
LIMIT 1;