2012-04-16 4 views
0

アプリケーション・コード内で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); 
+2

実行されないと言ったら、どうなりますか?私たちに何かを与えてください。エラーメッセージなどの出力を含め、動作を記述します。 – APC

+1

PHP内から「$ value」を「dual」の値として選択すると、結果セットのVALUE列には何が入っていますか? –

+0

@APC:質問を更新して詳細を追加します。クエリが実行されたかどうかを確認するためにエラーチェックを追加しました。それがマージステートメントである場合、それは挿入ステートメントですが、それはうまく動作しません。 –

答えて

1

OSは複数行のSQLを使用した問題、SOMあなたを持っている場合CHACKするために別のものがありますその中にSQLを含む文字列を構築する必要があるかもしれません。

+0

ありがとう!私はバインディングのPHPマニュアルを調べ、oci_bind_by_nameの例を見つけました。私はSQLステートメントで '$ val'の代わりにvalを使用し、値をrelaceするためにoci_parseの後にoci_bind_by_name()を使用しています。 –

関連する問題