1

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 ;
4

1 に答える 1

0

SQL で RBAR の方法で物事を行うことは本当に避ける必要があります。RBAR(リーバーと読みます)はロウ・バイ・アゴナイジング・ロウの略です。一度に 1 行ずつデータを挿入すると、後で重大なパフォーマンスの問題が発生する可能性があります。

私はあなたのテーブル構造を持っていませんが、ストアド プロシージャ全体を次のように変更すると、より高速で効率的になると思います。クエリに含まれるテーブルの 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 ;
于 2013-01-02T06:46:19.553 に答える