アプリケーション・コード内でoracleマージ問合せを実行しているだけです。クエリをエコーアウトしてsqldeveloperで実行すると、うまく動作します。そして奇妙なことに、私はマージクエリーに関してこの問題しか持っていません。まっすぐな挿入クエリでは、すべてうまく動作します。Oracle SQLのマージ・クエリーはGUIで動作し、PHPスクリプトでは失敗します
コードサンプル:上記のコードで
$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を使用しています。どんな助けでも大歓迎です。ありがとう。
*** ** * *答えは** ** を見つけました** *
ロジャーは、クエリが必要と指摘したように、拘束される。これは私が問題を解決する方法である:あなたが何らかの形で「$」などの特殊文字をエスケープする必要があるいくつかのオペレーティングシステムで
//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);
実行されないと言ったら、どうなりますか?私たちに何かを与えてください。エラーメッセージなどの出力を含め、動作を記述します。 – APC
PHP内から「$ value」を「dual」の値として選択すると、結果セットのVALUE列には何が入っていますか? –
@APC:質問を更新して詳細を追加します。クエリが実行されたかどうかを確認するためにエラーチェックを追加しました。それがマージステートメントである場合、それは挿入ステートメントですが、それはうまく動作しません。 –