PHP oci_bind_by_name绑定函数返回参数,-1不起作用

时间:2019-07-03 07:29:55

标签: php oracle codeigniter-3 oci8

我试图将$result变量绑定到PL / SQL存储函数,但是 如果我将$result变量绑定为

,它将不起作用
oci_bind_by_name($stmt, ':result', $result, -1);

并给出错误消息为:

  

oci_execute():ORA-06502:PL / SQL:数字或值错误:字符串缓冲区太小

它也适用于if语句:

oci_bind_by_name($stmt, ':result', $result, 1000);

但是我的PL / SQL存储函数返回了大量数据,所以我想使用最大长度为-1。

参考表格: https://www.php.net/manual/en/function.oci-bind-by-name.php

1)最大长度 设置数据的最大长度。如果将其设置为-1,则此函数将使用变量的当前长度来设置最大长度。在这种情况下,调用oci_bind_by_name()时,变量必须存在并包含数据。

2)示例#10绑定PL / SQL存储功能。

$sql = 'BEGIN :result := QUERY(:parameters); END;';      
$stmt = oci_parse($this->oracle_db->conn_id,$sql);   
oci_bind_by_name($stmt,':parameters',$parameters);   
oci_bind_by_name($stmt, ':result', $result, -1);   
oci_execute($stmt);   
oci_free_statement($stmt);   
oci_close($this->oracle_db->conn_id);   

错误消息:

  

oci_execute():ORA-06502:PL / SQL:数字或值错误:字符串缓冲区太小

1 个答案:

答案 0 :(得分:0)

您需要指定一个长度,以便OCI8在调用数据库之前知道要分配多少内存。否则,在调用$result之前,您将依靠oci_execute()的值;调用$result之前oci_execute() 的长度是允许返回的最大大小。我总是建议将大小传递给oci_bind_by_name(),以免出现令人讨厌的意外截断。