To_CHAR结果不能进入VARCHAR2

时间:2013-07-16 13:02:59

标签: oracle plsql

有些奇怪我想要理解

让我们说我们有这个代码:

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可能存在问题吗?什么问题?什么解决方案?

谢谢

3 个答案:

答案 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”格式会覆盖无符号正数的默认前导空白