4

準備済みステートメントを次のように作成します。

pg_prepare('stm_name', 'SELECT ...');

今日、同じ名前のプリペアド ステートメントを 2 回宣言すると、問題が発生しました (誤って関数を 2 回呼び出す)。

Warning: pg_prepare() [function.pg-prepare]: Query failed: ERROR: prepared statement "insert_av" already exists in xxx on line 221

では、質問タイトルの通り、同じラベルのprepare文が既に存在するかどうかを確認し、場合によっては上書きする方法はありますか?

このエラーは私のミスによるものであり、コードの先頭で準備済みステートメントを宣言するだけで解決されることはわかっていますが、それらをより制御するための解決策があるかどうか疑問に思っています。

編集:

Milenの回答の後、準備されたステートメントがすでに使用されているかどうかを確認するのは非常に簡単です.pg_prepared_statementsテーブルのデータベースを照会するだけです:

try{
    $qrParamExist = pg_query_params("SELECT name FROM pg_prepared_statements WHERE name = $1", array($prepared_statement_name));
    if($qrParamExist){
        if(pg_num_rows($qrParamExist) != 0){
            echo 'parametized statement already created';
        }else{
            echo 'parametized statement not present';
        }
    }else{
        throw new Exception('Unable to query the database.');
    }
}catch(Exception $e){
    echo $e->getMessage();
}

しかし、毎回データベースにクエリを実行する必要があるため、これは良い解決策ではないと思います。

通常、準備済みステートメントはスクリプトの先頭で宣言され、再利用されますが、うまく接続されたクラスがあり、そのうちの 3 つだけを使用するときに 10 個の準備済みステートメントを宣言するのは好きではありません。

したがって、単純な PHP 配列を使用して、作成したステートメントを追跡し、isset()それが存在するか作成する必要があるかどうかを関数で確認します。

try{
    $prepare = pg_prepare('my_stmt_name', "SELECT ...");
    if($prepare){
        $this->rayPrepared['my_stmt_name'] = true;
    }else{
        throw new Exception('Prepared statement failed.');
    }
}catch(Exception $e){
    echo $e->getMessage();
}
4

3 に答える 3

0

これをphpで試したことはありませんが、アプリケーションでこれが実行可能である場合(ステートメントが1か所だけ必要で、名前で再度「フェッチ」する必要がない場合)、名前のないステートメントを準備してみてください。 http://www.postgresql.org/docs/8.4/interactive/libpq-exec.html言います:

PQprepare
...
stmtName は、名前のないステートメントを作成するために "" にすることができます。この場合、既存の名前のないステートメントは自動的に置き換えられます。それ以外の場合、ステートメント名が現在のセッションで既に定義されている場合はエラーになります。
php_pg は PQprepare を使用するため、これでうまくいくかもしれません。

于 2009-07-28T11:52:25.467 に答える
-4

なぜ準備済みステートメントを使用しているのですか? 同じステートメントを何度も使用する場合にのみ、パフォーマンス上の利点が得られます。

于 2009-07-28T16:51:58.557 に答える