我编写了一个包含存储过程的 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
我知道这个错误通常表明您试图将太多数据放入某种类型;例如,放入999
等number(2)
。但是,我的 SP 并非如此:对类型没有限制,就像我说的,它在 SQL Developer 中运行良好。同样,我没有dbms_output
在 SP 的任何地方使用。
当我将 PHP 脚本硬编码为与上述 PL/SQL 块完全相同的参数时,或者即使我完全删除了过程的主体并将其替换为success := 20
. 后者让我相信通过 PHP 调用 OCI 存在一些问题,而不是我的 PL/SQL 包。但是,我不知道它可能是什么!诚然,我在其他地方使用此代码,过程更简单,而且效果很好。
任何想法可能是来源,或者我可以寻找什么?这让我有点发疯!