2

我有一个包含 Number 类型列的表

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

在 PL SQL 脚本中,我想将该字段转换为 varchar。但是,我不知道它的长度,所以我得到了一个例外

异常消息是 ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小

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"+一个字符):

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 回答