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
);

この手順の目的は、データベース内のアドレスを更新/追加することです。addIDnull の場合は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 呼び出しに問題があると思われます。しかし、私はそれが何であるかについての手がかりを持っていません!私はこのコードを他の場所で使用していますが、確かに、より単純な手順であり、正常に動作します。

ソースが何であるか、または私が探すことができるアイデアはありますか? それは私を少し怒っています!

4

1 に答える 1

0

OK: 問題が見つかりました!...

maxlength私の Oracle ライブラリ コードは、変数をバインドするときにプロパティの設定を怠っていたことが判明しました。私はこれを 32767 に設定しました。

于 2012-11-29T17:18:47.757 に答える