PHP 5 oci_execute():ORA-01008:并非所有变量都绑定

时间:2012-04-19 15:10:38

标签: oracle oracle10g

我在尝试合并时遇到了这个错误:

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。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

问题是在oci_parse()之前调用了oci_bind_by_name()。需要首先调用oci_parse()。

答案 1 :(得分:0)

我不知道“oci_bind_by_name”是如何工作的,但我知道oracle下的EXECUTE IMMEDIATE语句需要为你想要影响的值的每个实例都有一个绑定变量,例如,如果你使用两次VAL1,你仍然需要使用2个绑定变量:1 AND:2,你不能使用:1两次。

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

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

RGDS。

答案 2 :(得分:0)

您的statemt错误,您需要为cd中的值使用别名

使用(从双选中选择:col1val col1)合并到tablespace.tb1 c中                 开启(c.col1 = cd.col1)                 当不匹配时                     插入(c.col2,c.col1,c.col3,c.col4)                     值(:col2val,:col1val,:col3val,:col4val)“;