ストアド プロシージャを含む 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 を挿入して設定します。null でない場合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
ます。後者の場合、私の PL/SQL パッケージではなく、PHP を介した OCI 呼び出しに問題があると思われます。しかし、私はそれが何であるかについての手がかりを持っていません!私はこのコードを他の場所で使用していますが、確かに、より単純な手順であり、正常に動作します。
ソースが何であるか、または私が探すことができるアイデアはありますか? それは私を少し怒っています!