[英]insert into select statement inside while loop in sp mysql
我有一個存儲過程,其中我在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 ;
您確實需要避免在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 ;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.