ストアド プロシージャにデータがありませんという警告:「エラー 1329: ゼロ行がフェッチ、選択、または処理されました」
データベース プログラミング、ストアド プロシージャ多くの場合、複雑な操作をカプセル化し、データの整合性を確保するために使用されます。ただし、これらの手順でエラーが発生したり、予期しない警告が生成される場合があります。よくある問題の 1 つは、「エラー 1329: データがありません - フェッチ、選択、または処理された行はゼロです」というメッセージです。
この警告は通常、ストアド プロシージャがデータが返されない場合を明示的に処理しない場合に表示されます。これを解決するには、「NOT FOUND」状態を適切に処理する必要があります。 MySQL では、これは CONTINUE HANDLER ステートメントを使用して実現できます。
次の testing_proc ストアド プロシージャを考えてみましょう:
CREATE PROCEDURE `testing_proc`()
READS SQL DATA
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE l_name VARCHAR(20);
DECLARE my_cur CURSOR FOR
SELECT name FROM customer_tbl;
OPEN my_cur;
my_cur_loop:
LOOP FETCH my_cur INTO l_name;
IF done = 1 THEN
LEAVE my_cur_loop;
END IF;
INSERT INTO names_tbl VALUES(l_name);
END LOOP my_cur_loop;
CLOSE my_cur;
END
customer_tbl テーブルにデータがない状態でこのプロシージャを実行すると、「エラー 1329」警告がトリガーされます。これを防ぐために、次の CONTINUE HANDLER ステートメントをプロシージャの最後に追加できます:
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
このステートメントは MySQL に次のように指示します。行が見つからない場合は、done 変数を 1 に設定します。これにより、カーソル ループが終了し、エラーの発生が防止されます。
あるいは、テーブルが関与し、成功したプロシージャの最後に「ダミー」ステートメントを追加することで、警告を回避することもできます。例:
SELECT name INTO l_name FROM customer_tbl LIMIT 1;
このステートメントは行が確実にフェッチされ、警告がクリアされます。
適切に処理することで、 「NOT FOUND」条件を指定するか、ダミー ステートメントを追加すると、データを返さないストアド プロシージャでの「エラー 1329」警告を排除できます。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3