【问题标题】:PHP oci_bind_by_name binding function return parameter with -1 not workingPHP oci_bind_by_name 绑定函数返回参数 -1 不起作用
【发布时间】:2019-11-13 20:17:55
【问题描述】:

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

oci_bind_by_name($stmt, ':result', $result, -1);

并给出错误消息:

oci_execute(): ORA-06502: PL/SQL: numeric or value error: 字符串缓冲区太小

它也适用于 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) 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: 字符串缓冲区太小

【问题讨论】:

    标签: php oracle codeigniter-3 oci8


    【解决方案1】:

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

    【讨论】:

    • 感谢 Christopher 非常感谢您的回答 :) 此外,当我尝试将 $result 与 35k 之类的大数据绑定时,它返回的警告消息为 oci_execute(): ORA-06502: PL/SQL: numeric或值错误。所以这将是一个可变绑定大小问题,或者这将是 PL/SQL 存储函数代码问题。
    • 4K 或 32K(在较新的数据库中)往往是 PHP 和数据库之间数据传输的魔法限制。您可能想了解如何使用 LOB,请参阅 oracle.com/technetwork/topics/php/… 的第 237 页上的“LOB 和 PL/SQL 过程”@
    • 感谢 Christopher 提供宝贵的解决方案 :)
    猜你喜欢
    • 2022-01-23
    • 2012-03-23
    • 2017-08-08
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 2014-12-14
    相关资源
    最近更新 更多