0

アプリケーション コードに実行されない oracle マージ クエリがあります。ただし、クエリをエコーアウトして sqldeveloper で実行すると、問題なく実行されます。奇妙なことに、この問題はマージ クエリでのみ発生します。直接挿入クエリを使用すると、すべてが正常に機能します。

コードサンプル:

$sql = "merge into table1 c using (select '$value' as value from table1  where ROWNUM=1) cd
    on (c.value = cd.value)
    when matched then
       update set c.col1 = '$col1val', c.col2= '$col2val'
    when not matched then
        insert (c.col2, c.col2, c.col3)
    values ('$col1val', '$col2val', '$col3val')";

$stid = oci_parse($conn, $sql); 
$result = oci_execute($stid);

//Checking to see if it ran properly
if(!$result)
{
  echo "query failed:  $sql";
}

echo $sql;  //If I copy what gets echoed onto the screen into my db gui and run it, I get '1 row merged' with no warnings or errors

上記のコード スニペットでは、常に「クエリに失敗しました」というステートメントが表示されます。さらに、データベースを確認すると、更新も挿入も行われていないことに気付きました。対照的に、マージ クエリを次のような単純な挿入クエリに変更するとします。

$sql = "insert into table1 (col1, col2, col3) 
        values ('$col1val', '$col2val', '$col3val')";
$stid = oci_parse($conn, $sql); 
$result = oci_execute($stid);

//Checking to see if it ran properly
if(!$result)
{
  echo "query failed:  $sql";
}

それから、まったく失敗しません。「クエリが失敗しました」というメッセージが表示されず、データベース テーブルに新しい行が表示されます。

これがマージクエリでのみ発生する理由がわかりません。参考までに、私は Oracle 10g と PHP 5 を使用しています。ありがとう。

** * ** * *回答が見つかりました* ** * ** *

Roger が指摘したように、クエリをバインドする必要がありました。これが私が問題を解決した方法です:

//REMOVE  single quoted variable ('$var') and used binding instead (:val)
$sql = "merge into table1 c using (select :value as value from table1  where ROWNUM=1) cd
    on (c.value = cd.value)
    when matched then
       update set c.col1 = :col1val, c.col2= :col2val
    when not matched then
        insert (c.col2, c.col2, c.col3)
    values (:col1val, :col2val, :col3val)";

$stid = oci_parse($conn, $sql); 

//BIND VALUES
oci_bind_by_name($stid, ":col1val", $col1val);
oci_bind_by_name($stid, ":col2val", $col2val);    
oci_bind_by_name($stid, ":col3val", $col3val);

$result = oci_execute($stid);
4

1 に答える 1

1

一部のオペレーティング システムでは、"$" などの特殊文字をどうにかしてエスケープする必要があります。また、OS で複数行の SQL に問題がある場合は、SQL を含む文字列を作成する必要があるかもしれません。

于 2012-04-17T12:14:11.267 に答える