2013-07-16 31 views
0

去有奇怪的財產以後我wouls想了解TO_CHAR結果不能用VARCHAR2

假設我們有這樣的代碼:

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

'LTRIM'應該做的伎倆。 –

回答

8

TO_CHAR結果的開頭有一個空間,使得其總長度爲7個字符。如果數字是負數,則該空間保留爲負號。如果您嘗試這個查詢,你會看到:

SELECT '[' || TO_CHAR(1, '000000') || ']' FROM DUAL; 

結果是:

[ 000001] 
^ space for a minus sign 

要得到的結果,而沒有空間,使用FM修改:

a := TO_CHAR(1, 'FM000000'); 
+0

令人難以置信。我雖然瘋了,'0001'= TO_CHAR(1,'0000')'不起作用。謝謝。 – lexicore

+0

'LTRIM'應該做到這一點。 –

0

注意在沒有符號格式的正數之前,前導空白僅出現。無論標記位置如何,在負數之前或任何有符號數之前都不會出現前導空白。「FM」格式改寫默認領先的空白無符號正數

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>