gpt4 book ai didi

mysql - 在 sp mysql 的 while 循环中插入 select 语句

转载 作者:行者123 更新时间:2023-11-30 23:24:09 29 4
gpt4 key购买 nike

我有一个存储过程,其中我在 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)代表 row by agonizing row。当逐行逐行插入数据时,您以后可能会遇到严重的性能问题。

我没有你的表结构,但我怀疑你可以将整个存储过程更改为以下内容,这样会更快、更高效。如果您可以发布查询中涉及的表的 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 ;

关于mysql - 在 sp mysql 的 while 循环中插入 select 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14117362/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com