我有一个存储过程,我在while循环中插入select语句。 存储过程是成功创建的,但是当我执行它时会说0行受影响。 对于单个数据值的while循环,sp返回数据。但是当同一个查询在while循环中时,它会返回0行受影响。
问题是什么
DELIMITER $$
CREATE PROCEDURE WhileLoopProc1234(INOUT indate DATE,INOUT outdate DATE)
BEGIN
DECLARE x DATE;
DECLARE y DATE;
DECLARE z DATE;
CREATE TABLE temp2( cardno VARCHAR(10),datevalue DATE );
SET x = indate;
SET y = outdate;
WHILE x!=y DO
INSERT INTO temp2( cardno,datevalue)
select CARDNO,x from test_prefixmaster
where CARDNO not in ( select CARDNO from test_prefixtransactions where Date(S_DateTime)=x);
SET x = x + 1;
END WHILE;
SELECT * from temp2;
DROP TABLE temp2;
END$$
DELIMITER ;
答案 0 :(得分:0)
你真的需要避免在SQL中使用RBAR方式。 RBAR(发音为REEBAR)代表争吵行。在逐行插入行的情况下将数据插入一行时,您可能会在以后遇到严重的性能问题。
我没有你的表结构,但我怀疑你可以将整个存储过程更改为以下内容,它会更快,更有效。如果您可以为查询中涉及的表发布CREATE TABLE语句,我将能够确保此查询是正确的。根据我的理解,您正在尝试找到test_prefixmaster中不存在的日期范围的CARDNO。
因此,您的整个存储过程可以如下所示:
DELIMITER $$
CREATE PROCEDURE WhileLoopProc1234(INOUT indate DATE,INOUT outdate DATE)
BEGIN
SELECT tst_pfMaster.CARDNO
,tst_pfTran.S_DateTime
FROM test_prefixmaster tst_pfMaster
LEFT JOIN test_prefixtransactions tst_pfTran
ON tst_pfMaster.CARDNO = tst_pfTran.CARDNO
WHERE (tst_pfMaster.CARDNO IS NULL)
AND (
(DATE(S_DateTime)>=indate)
AND (DATE(S_DateTime)<=outdate)
)
END$$
DELIMITER ;