2

タイプNumberの列を含むテーブルがあります

create table tmp (
    /*other fields*/
    some_field Number
)

PL SQLスクリプトでは、そのフィールドをvarcharに変換したいと思います。ただし、長さがわからないので例外が発生します

例外メッセージはORA-06502です:PL / SQL:数値または値のエラー:文字stringバッファが小さすぎます

v_some_field varchar(21);
/*...*/
v_some_field := TO_CHAR(some_field,'999999999999999999999');

v_some_fieldバッファーをどのように宣言する必要がありますか?varchar(32767)に設定するのはかなり野蛮なようですが、他に方法はありますか?

4

2 に答える 2

9

数値が大きすぎるためではなく、結果to_charが22文字の長さ(21x "9" +記号の場合は1文字)であるためにエラーが発生します。

SQL> DECLARE
  2     some_field   NUMBER := 123;
  3     v_some_field VARCHAR(21);
  4  BEGIN
  5     v_some_field := TO_CHAR(some_field, '999999999999999999999');
  6  END;
  7  /

ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 6

SQL> DECLARE
  2     some_field   NUMBER := 123;
  3     v_some_field VARCHAR(22);
  4  BEGIN
  5     v_some_field := TO_CHAR(some_field, '999999999999999999999');
  6  END;
  7  /

PL/SQL procedure successfully completed
于 2009-10-19T13:20:29.163 に答える
0

整数と小数の数字で負の値を変換することにより、変換されたvarchar2の最大長を決定できます。

set serveroutput on
declare
   n number;
begin
   n := -4/3;
   dbms_output.put_line(length(to_char(n)));
end;
/

出力は私にとって41です。

于 2009-10-20T10:19:52.080 に答える