sql >> データベース >  >> RDS >> Mysql

MySQLストアドプロシージャが原因で`コマンドが同期していません`

    結果セットを返すストアドプロシージャを呼び出すと明らかになる厄介なバグ(または機能)があるようです。 。つまりINTO句のないselectステートメントで終わるストアドプロシージャ(以下の例を参照)。

    mysqliドライバーは(適切に)2つの結果セットを返します。 1つ目はストアドプロシージャから返されるもので、2つ目はダミーの空の結果セットです。これは、複数のクエリコマンドが発行されたようなものです。これに対する1つの解決策(通常の(SELECTなど)クエリで中断しない)は、正当な結果セット(最初のクエリ)を処理した後にこのダミーの結果セットを使用することです。

    phpコードの例

    function do_query($con, $sql)
    {
      if ( !($result = mysqli_query($con, $sql)) )
        throw new QueryException(mysqli_error($con));
      if ($result === true)
         return true;
      while ($row = mysqli_fetch_assoc( $result )) {
        // process rows
      }
      // Hack for procedures returning second dummy result set
      while(mysqli_more_results($con)) {
        mysqli_next_result($con);
        // echo "* DUMMY RS \n";
      }
    }
    

    ストアドプロシージャの例:

    CREATE PROCEDURE selectStaleHeaders()
    NOT DETERMINISTIC
    SELECT TT.*
    FROM one_pretty_table AS TT
      LEFT JOIN another AS AN on TT.fk_id = AN.id
    WHERE TT.id IS NULL;
    


    1. 注文を保存するにはどうすればよいですか?

    2. MySQLとは:概要

    3. MySQLで日、月、年を返す

    4. 挿入された行のPKガイドを取得するための最良の方法