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

Postgres RAISE EXCEPTIONはどのようにPDOExceptionに変換されますか?

    codeを使用する PDOExceptionのプロパティ SQLSTATEを取得するには 。 PDOException>

    SQLSTATEを制御するには エラーを発生させるPL/PgSQL関数によって生成された場合は、 RAISE ... SQLSTATE ドキュメントに従って

    もちろん、これが機能するためには、データベースドライバが SQLSTATEを正しく報告する必要があります。 。 php で実行できる次のスタンドアロンのサンプルコードに従って、PDOが少なくともPostgreSQL9.2を使用するPHP5.4.11でこれを実行することを確認しました。 コマンドライン実行可能ファイル:

    <?php
    $pdo = new PDO('pgsql:');
    
    $sql = <<<EOD
    CREATE OR REPLACE FUNCTION exceptiondemo() RETURNS void AS $$
    BEGIN
      RAISE SQLSTATE 'UE001' USING MESSAGE = 'error message';
    END;
    $$ LANGUAGE plpgsql
    EOD;
    
    $sth = $pdo->prepare($sql);
    if (!$sth->execute()) {
            die("Failed to create test function\n");
    }
    
    $sql = "SELECT exceptiondemo();";
    
    $sth = $pdo->prepare($sql);
    if (!$sth->execute()) {
            $ei = $sth->errorInfo();
            die("Function call failed with SQLSTATE " . $ei[0] . ", message " . $ei[2] . "\n");
    
            // Shortcut way:
            // die("Function call failed with SQLSTATE " . $sth->errorCode());
    }
    ?>
    

    出力は次のとおりです:

    Function call failed with SQLSTATE UE001, message ERROR:  error message
    

    2番目の$sth-> execute()のコードブロックを置き換えます これを使用してコードの最後に移動し、例外処理モードも正常に機能することを示します。

    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    try {
            $sth->execute();
    } catch (PDOException $err) {
            $ei = $err->errorInfo;
            die("Function call failed with SQLSTATE " . $ei[0] . ", message " . $ei[2] . "\n");
    
            // Alternate version to just get code:
            //die("Function call failed with SQLSTATE " . $err->getCode() . "\n");
    }
    



    1. Oracle-スタンドアロンのプロシージャや関数の代わりにパッケージを使用する必要があるのはなぜですか

    2. MySQL発音区別符号の鈍感な検索(スペイン語のアクセント)

    3. ORACLEのselectステートメントが間違っています

    4. ORA-12704:文字セットの不一致