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);

我正在使用 PHP 5 和 Oracle 10g。

有任何想法吗?

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 个绑定变量:1 和:2,您不能使用 :1 两次。

所以在你的例子中,因为 ":col1val" 被使用了两次,我建议你尝试使用 ":col5val" 来代替。另外,尝试按照脚本中变量出现的顺序进行绑定。

那是我的贡献:-) 让我们发布。

rgds。

于 2012-05-29T19:32:28.303 回答
0

您的声明是错误的,您需要 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 回答