有些奇怪我想要理解
让我们说我们有这个代码:
DECLARE
a varchar2(6);
BEGIN
a := '000001';
END;
这很好用。没问题
现在我们有了这个:
DECLARE
a varchar2(6);
BEGIN
a := TO_CHAR(1, '000000');
END;
不起作用:
ORA-06502:PL / SQL:数字或值错误:字符串缓冲区太小
为什么?
nls_language可能存在问题吗?什么问题?什么解决方案?
谢谢
答案 0 :(得分:8)
TO_CHAR
结果在开头有一个空格,总长度为7个字符。如果数字为负数,则该空格保留为减号。如果您尝试此查询,您会看到:
SELECT '[' || TO_CHAR(1, '000000') || ']' FROM DUAL;
结果是:
[ 000001]
^ space for a minus sign
要获得没有空格的结果,请使用FM
修饰符:
a := TO_CHAR(1, 'FM000000');
答案 1 :(得分:1)
或者,只需使用`LTRIM' :
SQL> set serveroutput on;
SQL> DECLARE
2 a VARCHAR2(6);
3 BEGIN
4 A := LTRIM(TO_CHAR(1, '000000'));
5 dbms_output.put_line(a);
6 END;
7 /
000001
PL/SQL procedure successfully completed.
SQL>
答案 2 :(得分:0)
请注意,前导空白仅在没有符号格式的正数之前显示。无论标志的位置如何,在负数之前或任何有符号数字之前都不会出现前导空白。 “FM”格式到会覆盖无符号正数的默认前导空白