在PHP中执行存储过程:ORA-01460:请求未实现或不合理的转换

Cԃա*_*ԃաԃ 5 php oracle stored-procedures

在PHP中执行存储过程给出了ORA-01460.这是php中的简化(原始有超过48个输入值)代码:

$proc_sql = "BEGIN CREATE_RECORD(:b1, :b2, :b3, :b4, :b5, :b6); END;";

$bind = array("bind 1", "bind 2", "bind 3", "bind 4", "bind 5", "OUT DUMMY");

$stmt = oci_parse($conn, $proc_sql);

$i = 1;

$outval = "";

foreach($bind as $val){
    $tmp =":b".$i;
    if($i < count($bind)){
        oci_bind_by_name($stmt,$tmp,$val);
    }else{
        oci_bind_by_name($stmt, $tmp, $outval, 512);
    }
    $i++;
}
oci_execute($stmt);
Run Code Online (Sandbox Code Playgroud)

最后一行产生警告.但是,如果我直接在SQL Developer中运行查询:

declare
    re varchar2(512);
begin

CREATE_RECORD('bind 1', 'bind 2', 'bind 3', 'bind 4', 'bind 5', re);
dbms_output.put_line(re);

end;
Run Code Online (Sandbox Code Playgroud)

插入成功完成.这是我与PHP和Oracle组合的第一个项目.所以我不知道我的php是不正确还是问题出在其他地方.这是来自的OCI8信息phpinfo():

oci8

OCI8 Support    enabled
OCI8 DTrace Support disabled
OCI8 Version    2.0.8
Oracle Run-time Client Library Version  10.2.0.3.0
Oracle Compile-time Instant Client Version  10.2

Directive                        Local Value             Master Value

oci8.default_prefetch                100                     100
oci8.events                          Off                     Off
oci8.max_persistent                   -1                      -1
oci8.old_oci_close_semantics         Off                     Off
oci8.persistent_timeout               -1                      -1
oci8.ping_interval                    60                      60
oci8.privileged_connect              Off                     Off
oci8.statement_cache_size             20                      20
Run Code Online (Sandbox Code Playgroud)

PHP Version 5.5.17Oracle 9i 请帮助看看为什么我会收到这样的警告.谢谢你的阅读.

UPDATE

以下代码也有效:

$proc_sql = "BEGIN CREATE_RECORD('bind 1', 'bind 2', 'bind 3', 'bind 4', 'bind 5', :b6); END;";
$stmt = oci_parse($conn, $proc_sql);
$outval = "";
oci_bind_by_name($stmt, ':b6', $outval, 512);
Run Code Online (Sandbox Code Playgroud)

正如我上面所说,这是执行程序代码的简化版本,实际上我需要绑定48个参数IN和一个OUT参数.是否必须statement_cache_size在OCI8设置中执行某些操作?我已经阅读了文档,但无法理解它是否与我的问题有关.

Dav*_*nek 1

请参阅这段 PHP 文档,尤其是这部分:

绑定调用告诉 Oracle 从哪个内存地址读取数据。对于 IN 绑定,调用 oci_execute() 时该地址需要包含有效数据。这意味着变量绑定必须保留在作用域内直到执行。如果不这样做,可能会出现意外结果或错误,例如“ORA-01460:请求的转换未实现或不合理”。对于 OUT 绑定,症状之一是未在 PHP 变量中设置值。

如果我很好地理解您的代码,您将在循环内使用局部变量来循环 IN 参数,因此当您在循环完成后调用 oci_execute 时,您不能满足将所有值包含在范围内的需求。