ORA-06502 来自 PHP OCI 调用但不是 SQL Developer 的字符串缓冲区太小

Posted

技术标签:

【中文标题】ORA-06502 来自 PHP OCI 调用但不是 SQL Developer 的字符串缓冲区太小【英文标题】:ORA-06502 String Buffer Too Small from PHP OCI call but not SQL Developer 【发布时间】:2012-11-29 17:14:58 【问题描述】:

我编写了一个包含存储过程的 PL/SQL (Ora10gR2) 包。标题如下所示:

procedure updateAddress(
  sid       in     varchar2,
  addID     in out number,
  roomNo    in     varchar2,
  poBox     in     varchar2,
  add1      in     varchar2,
  add2      in     varchar2,
  add3      in     varchar2,
  add4      in     varchar2,
  add5      in     varchar2,
  postCode  in     varchar2,
  country   in     varchar2,
  phone1    in     varchar2,
  phone2    in     varchar2,
  success   out    number
);

此过程的目的是更新/附加数据库中的地址。如果addID为空,则插入并设置addID为新插入的地址ID;如果addID 不为空,它只会更新(我还没有写过这段代码)...无论如何,很简单。

在 SQL Developer 中调用此过程绝对可以正常工作。例如,以下内容完美运行:

set serveroutput on;

declare
  addID number;
  status number;
begin
  addID := null;

  mypackage.updateaddress('XXX11341976', addID, null, null, 'somewhere', 'else', 'NCx 1234', 'UA', null, null, null, null, null, status);

  dbms_output.put_line('Status ' || status || ' - New ID ' || addID);
end;
/

它会输出类似Status 20 - New ID 3 的内容,其中 20 是我的所有 OK 代码,如果我查询地址表,新地址将作为 ID 3 坐在那里。

但是,当我从使用 OCI8 的 php 脚本调用此代码时,我收到 ORA-06502 错误:

ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 1

我知道这个错误通常表明您试图将过多的数据放入某种类型;例如,将999 放入number(2) 等。但是,我的SP 并非如此:对类型没有限制,就像我说的那样,它在SQL Developer 中运行良好。同样,我没有在 SP 的任何地方使用dbms_output

当我将 PHP 脚本硬编码为与上述 PL/SQL 块完全相同的参数时,或者即使我完全删除了过程的主体并将其替换为 success := 20,也会发生这种情况。后者让我相信通过 PHP 调用 OCI 存在一些问题,而不是我的 PL/SQL 包。但是,我不知道它可能是什么!诚然,我在其他地方使用此代码,过程更简单,而且效果很好。

任何想法可能是来源,或者我可以寻找什么?这让我有点生气!

【问题讨论】:

【参考方案1】:

好的:我找到了问题!...

原来我的 Oracle 库代码在绑定变量时忽略了设置 maxlength 属性。我将它设置为 32767,你瞧,它可以工作了!!

【讨论】:

以上是关于ORA-06502 来自 PHP OCI 调用但不是 SQL Developer 的字符串缓冲区太小的主要内容,如果未能解决你的问题,请参考以下文章

ORA-06502:PL/SQL:数字或值错误:NULL 索引表键值 ORA-06512:在“OJC.JC_MASTER”,第 129 行

C# ORA-06502 中的存储过程

PL/SQL - 防止 ORA-06502

ORA 06502 错误 PL/SQL

ORA-06502: PL/SQL: 数字或值错误,我贴出来,大家帮我改一下,以前没怎么写过存储过程。。

PL/SQL: 数字或值错误 - ORA-06502