我试图将$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:数字或值错误:字符串缓冲区太小
答案 0 :(得分:0)
您需要指定一个长度,以便OCI8在调用数据库之前知道要分配多少内存。否则,在调用$result
之前,您将依靠oci_execute()
的值;调用$result
之前oci_execute()
的长度是允许返回的最大大小。我总是建议将大小传递给oci_bind_by_name()
,以免出现令人讨厌的意外截断。