アプリケーション コードに実行されない 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);