ホームページ  >  記事  >  データベース  >  MySQL ストアド プロシージャで「エラー 1329: データなし - フェッチされた行がゼロ」を処理する方法?

MySQL ストアド プロシージャで「エラー 1329: データなし - フェッチされた行がゼロ」を処理する方法?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-26 14:29:30903ブラウズ

How to Handle

ストアド プロシージャにデータがありませんという警告: 「エラー 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。