2

マージを行おうとすると、このエラーが発生します。

PHP Warning:  oci_execute(): ORA-01008: not all variables bound

クエリにあるすべての値がoci_bind_by_name()関数を使用してバインドされていること、およびデータが有効であることを確認しました。

これが私のコードです:

//Sample values just to test
$col1val = 'test1';
$col2val = 'test2';
$col3val = 'test3';
$col4val = 'test4';

        $sql = "merge into tablespace.tb1 c using (select :col1val from dual) cd
                on (c.col1 = cd.col1)
                when not matched then
                    insert (c.col2, c.col1, c.col3, c.col4) 
                    values (:col2val, :col1val, :col3val, :col4val)";



        oci_bind_by_name($stid, ":col1val", $col1val);
        oci_bind_by_name($stid, ":col2val", $col2val);  
        oci_bind_by_name($stid, ":col3val", $col3val);          
        oci_bind_by_name($stid, ":col4val", $col4val);

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

PHP5とOracle10gを使用しています。

何か案は?

4

3 に答える 3

4

問題は、oci_bind_by_name()以前に呼び出されていたことでしたoci_parse()oci_parse()最初に呼び出す必要があります。

于 2012-06-26T22:22:04.400 に答える
0

「oci_bind_by_name」がどのように機能するかはわかりませんが、oracleの下のEXECUTE IMMEDIATEステートメントには、影響を与える値のインスタンスごとにバインド変数が必要になることはわかっています。たとえば、VAL1を2回使用している場合は、引き続き2つのバインド変数:1 AND:2を使用する必要があります。:1を2回使用することはできません。

したがって、あなたの例では、「:col1val」が2回使用されているため、代わりに「:col5val」を使用することをお勧めします。また、スクリプト内の変数の出現順にバインドしてみてください。

それは私の貢献のためです:-)私たちを投稿してください。

rgds。

于 2012-05-29T19:32:28.303 に答える
0

あなたのstatemtが間違っている、あなたはcdの値のエイリアスが必要でした

(select:col1val col1 from dual)cd on(c.col1 = cd.col1)を使用してtablespace.tb1 cにマージし、一致しない場合は(c.col2、c.col1、c.col3、c.col4)の値を挿入します( :col2val、:col1val、:col3val、:col4val) ";

于 2019-06-21T07:05:21.403 に答える