1

これがコードです...これは完全なコードではありません。最初のエラーが発生した場所までトリミングしました。

 FUNCTION get (  
    p_sql_o                         OUT VARCHAR2
  ) RETURN VARCHAR2 AS
  str_sql           VARCHAR2(4000);
  BEGIN
    str_sql := ' SELECT * FROM ( SELECT A.*, ROWNUM RNUM FROM ( ' ||
               ' SELECT item_code, ' ||
               ' item_desc, ' ||
               ' monitor, ' ||
               ' measured, ' ||
               ' inventory, ' ||
               ' (measured - inventory) adj_amount, ' ||
               ' (inventory_cost * measured) measured_cost, ' ||
               'inventory';
    RETURN str_sql;
  EXCEPTION
    WHEN OTHERS THEN
    RETURN NULL;
  END get;

明らかに、SQLは不完全ですが、私はそれを実行していません。SQL文字列を返すだけですが、それでもエラーが発生します。

ORA-06502:PL / SQL:数値または値のエラー:文字列バッファが小さすぎますORA-06512:6行目

これは困惑しています。なぜこれが当てはまるのかについて誰かが何か手がかりを持っていますか?

4

3 に答える 3

1

作成している SQL を動的に実行しようとしていないと言ったので、そこにあるものの構文と正確さ、または返される可能性のある長さは明らかに無関係です。p_sql_o OUTパラメータで何もしていないため、この問題も発生していません。それは本当にstr_sql犯人として残るだけであり、昨日ジャスティンが暗示したように、関数内で十分な大きさであると宣言されており、関数自体は問題なくコンパイルされているため、問題は呼び出されている方法にあるようです.

「インベントリ」を削除すると、その文字列の長さが 201 文字から 192 文字に短縮された場合に機能すると述べたので、呼び出し元でこの設定を 200 文字に設定したと思います。

declare
    str_sql varchar2(200);
    p_sql_o varchar2(4000);
begin
    str_sql := get(p_sql_o);
end;
/

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

これが報告している行番号は5、あなたが持っていたものではないことに注意してください6エラーがあるのは呼び出し元の行であり、関数内で代入が発生する行ではありません。str_sql varchar2(250);呼び出し元の宣言でそれを作成すると、機能します(ただし4000、関数の宣言と一致する可能性があります)。

declare
    str_sql varchar2(250);
    p_sql_o varchar2(4000);
begin
    str_sql := get(p_sql_o);
end;
/

PL/SQL procedure successfully completed.

ただし、p_sql_o設定したことがないため、まだ空になります。OUTパラメータが重複しているようです。おそらく、代わりに SQL 文字列をその中に入れるつもりでしたが、それは呼び出し側ですでに十分な大きさであると宣言されています。ただし、戻り値がどうなるかは明確ではありません。おそらく、OUTパラメーターを完全に削除し、戻り値を入れる呼び出し元の変数が十分な大きさであることを確認したいだけです。

于 2013-02-28T11:15:14.053 に答える
0

ここでは、p_sql_o を out パラメータとして使用しており、関数内に値を割り当てていません。そのため、p_sql_o は、この関数の行を呼び出した後、次のコードで以前に持っていた値を保持します。

定義したように、str_sql は 4000 文字しか保持できません。連結された文字列がその制限を超えると、文字列バッファが小さすぎる ORA-06512エラーが発生します。

文字列を連結して select ステートメントを作成する場合は、一重引用符を適切に使用しているかどうか、または単一引用符がまったくないかどうかを確認してください。これが発生すると、動的選択ステートメントの実行中に次のエラーが発生する可能性がありますORA-06502: PL/SQL: 数値または値のエラー:

于 2013-02-27T22:01:06.647 に答える
0

SP 外の DB に対して SQL スクリプトを実行してみましたか? これは、SQL 構文が正しいかどうか、および期待どおりに返されているかどうかを判断するのに役立ちます。4000 バイト以下の応答を期待しているようです。それが返されていると確信していますか?Where 句が表示されません。制限を超える複数の行を返している可能性がありますか? 確かに、私はストアド プロシージャに慣れていないので、気が進まないかもしれません。

于 2013-02-27T18:46:54.870 に答える