题
我有一个包含数字类型列的表
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) 似乎很残酷,还有其他选择吗?
解决方案
你得到一个错误不是因为数量太大,而是因为你的to_char
的结果是22个字符长(21倍“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
其他提示
您可以通过用整数和小数位转换负值来确定转换后的 varchar2 的最大长度:
set serveroutput on
declare
n number;
begin
n := -4/3;
dbms_output.put_line(length(to_char(n)));
end;
/
对我来说输出是 41。
不隶属于 StackOverflow