ストアド プロシージャにデータがありませんという警告: 「エラー 1329: ゼロ行がフェッチ、選択、または処理されました」
データベース プログラミングでは、ストアド プロシージャ多くの場合、複雑な操作をカプセル化し、データの整合性を確保するために使用されます。ただし、これらの手順でエラーが発生したり、予期しない警告が生成される場合があります。よくある問題の 1 つは、「エラー 1329: データがありません - フェッチ、選択、または処理された行はゼロです」というメッセージです。
この警告は通常、ストアド プロシージャがデータが返されない場合を明示的に処理しない場合に表示されます。これを解決するには、「NOT FOUND」状態を適切に処理する必要があります。 MySQL では、これは CONTINUE HANDLER ステートメントを使用して実現できます。
次の testing_proc ストアド プロシージャを考えてみましょう:
<code class="sql">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</code>
customer_tbl テーブルにデータがない状態でこのプロシージャが実行されると、トリガーが実行されます。 「エラー 1329」警告。これを防ぐには、次の CONTINUE HANDLER ステートメントをプロシージャの最後に追加します。
<code class="sql">DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;</code>
このステートメントは、行が見つからない場合に Done 変数を 1 に設定するように MySQL に指示します。これにより、カーソル ループが終了し、エラーの発生が防止されます。
あるいは、テーブルを含むプロシージャが成功した場合、その最後に「ダミー」ステートメントを追加することで警告を回避することもできます。例:
<code class="sql">SELECT name INTO l_name FROM customer_tbl LIMIT 1;</code>
このステートメントは行が確実にフェッチされ、警告がクリアされます。
「NOT FOUND」条件を適切に処理するか、ダミー ステートメントを追加することで、警告を取り除くことができます。データを返さないストアド プロシージャの「エラー 1329」警告。
以上がMySQL ストアド プロシージャで「エラー 1329: データなし - フェッチされた行がゼロ」を処理する方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。