PHP oci_bind_by_name 绑定函数 return 参数 -1 无效

PHP oci_bind_by_name binding function return parameter with -1 not working

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

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

并给出错误消息:

oci_execute(): ORA-06502: PL/SQL: numeric or value error: character string buffer too small

它也适用于 if 语句:

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

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

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

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

2) Example #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: numeric or value error: character string buffer too small

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