0

我编写了一个包含存储过程的 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为null,则插入并设置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

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

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

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

4

1 回答 1

0

OK:我发现问题了!...

结果是我的 Oracle 库代码在maxlength绑定变量时忽略了设置属性。我将它设置为 32767,你瞧,它有效!!

于 2012-11-29T17:18:47.757 回答