昨日、非常に興味深い(そして予想外の)ことに気づきました。ダミーテーブルに存在するすべての値を取得することにより、TableA の 3 つの列を更新するタスク (実稼働環境で) を与えられました (いくつかの明らかな理由により、テーブルと列の名前を変更しています)。両方のテーブルの主キーは列 A です。このタスクは非常に単純で、いくつかの方法で実行できることはわかっていますが、そのためのストアド プロシージャ (以下に示す) を作成することにしました。
ストアド プロシージャの実行が終了すると、列 B、C、および statusCode が同じ値を持っていることに気付きました (つまり、何千ものレコードがこれら 3 つの列で同じ値を持っていました)。誰かが何がうまくいかなかったのか教えてもらえますか?
1) このストアド プロシージャのどこが間違っていますか (または不足していますか)。(ダミー テーブルにも数千のレコードがありました) 2) ストアド プロシージャを作成する以外に、このタスクを実行する最善の方法は何ですか?
PS: MySQL ワークベンチを使用して本番環境でこのストアド プロシージャを作成 (実行) したところ、プロシージャの実行中に「MySQL サーバーへの接続が失われました」という例外が発生しましたが、このプロシージャをリモート マシンでは、手順の実行中にサーバーが中断されることはありませんでした。
これが私のストアドプロシージャです。
DELIMITER $$
CREATE DEFINER=`ABC`@`%` PROCEDURE `RetrieveExtractionData`()
BEGIN
DECLARE claimlisttraversed BOOLEAN DEFAULT FALSE;
DECLARE a VARCHAR(20);
DECLARE b INTEGER;
DECLARE c INTEGER;
DECLARE claimlist CURSOR FOR SELECT
`dummytable`.`A`,
`dummytable`.`B`,
`dummytable`.`C`
FROM `ABC`.`dummytable`;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET claimlisttraversed = TRUE;
OPEN claimlist;
claimlistloop: LOOP
FETCH claimlist INTO a, b, c;
IF claimlisttraversed THEN
CLOSE claimlist;
LEAVE claimlistloop;
END IF;
UPDATE `ABC`.`TableA`
SET
`B` = b,
`C` = c,
`statuscode` = 'Sent'
WHERE `A` = a;
END LOOP claimlistloop;
END