首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PHP中执行存储过程: ORA-01460:未实现或不合理的转换请求

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

Stack Overflow用户
提问于 2015-07-01 05:24:47
回答 2查看 1.3K关注 0票数 6

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

代码语言:javascript
复制
$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);

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

代码语言:javascript
复制
declare
    re varchar2(512);
begin

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

end;

插入已成功完成。这是我使用PHP和Oracle组合的第一个项目。因此,我不知道我的php是不正确的,还是问题在别处。这是来自OCI8的phpinfo()信息

代码语言:javascript
复制
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

PHP Version 5.5.17Oracle 9i,请帮我找出为什么我会收到这个警告。感谢您的阅读。

更新

下面的代码也是有效的:

代码语言:javascript
复制
$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);

如前所述,这是执行过程代码的简化版本,实际上我需要绑定48个参数in和一个OUT参数。它是否需要在statement_cache_size设置中对OCI8做些什么?我读过文档,但无法真正理解它是否与我的问题有关。

EN

回答 2

Stack Overflow用户

发布于 2017-09-26 20:39:58

请参阅这篇PHP文档,特别是本部分:

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

如果我很好地取消了您的代码,那么您将在循环中使用一个局部变量循环您的IN参数,因此在循环完成后调用oci_execute时,不能满足在范围内拥有所有值的要求。

票数 1
EN

Stack Overflow用户

发布于 2020-12-31 16:12:14

对于那些在for-each循环中绑定参数时有问题的人,请继续阅读。

答案之一这里有下面的注释,在一个示例代码片段中,它说明了在循环中绑定参数--这是有意义的。

代码语言:javascript
复制
foreach ($arr as $key => $val) { 
   // oci_bind_by_name($stid, $key, $val) does not work
   // because it binds each placeholder to the same location: $val
   // instead use the actual location of the data: $arr[$key]
}

根据上述声明,以下不工作

代码语言:javascript
复制
$arr = array(':a' => 1, ':b' => 2);
foreach ($arr as $key => $val) {    
    oci_bind_by_name($stid, $key, $val);
}

下面的工作,

代码语言:javascript
复制
$arr = array(':a' => 1, ':b' => 2);
foreach ($arr as $key => $val) {    
    oci_bind_by_name($stid, $key, $arr[$key]);
}

我希望有人会发现这是有用的:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31153130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档