To_CHAR结果不能进入VARCHAR2

mlw*_*mos 0 oracle plsql

有些奇怪我想要理解

假设我们有这个代码:

DECLARE
a varchar2(6);

BEGIN
  a := '000001';
END;
Run Code Online (Sandbox Code Playgroud)

这很好用.没问题

现在我们有了这个:

DECLARE
a varchar2(6);

BEGIN
  a := TO_CHAR(1, '000000');
END;
Run Code Online (Sandbox Code Playgroud)

这是行不通的:

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

为什么?

nls_language有问题吗?什么问题?有什么办法?

谢谢

Ed *_*bbs 8

该TO_CHAR结果在开头一空间,使得其总长度为7个字符.如果数字为负数,则该空格保留为减号.如果您尝试此查询,您会看到:

SELECT '[' || TO_CHAR(1, '000000') || ']' FROM DUAL;
Run Code Online (Sandbox Code Playgroud)

结果是:

[ 000001]
 ^ space for a minus sign
Run Code Online (Sandbox Code Playgroud)

要获得没有空格的结果,请使用FM修饰符:

a := TO_CHAR(1, 'FM000000');
Run Code Online (Sandbox Code Playgroud)