2011-06-03 53 views
4

我一直在這...看起來很愚蠢,但無法弄清楚!如何在分隔符的卸載作業中編寫DB2 SELECT語句

我想卸載一個表,但有一個分隔符'|'在田野之間。這裏是JCL用來卸表:

//JS020 EXEC PGM=IKJEFT01,      
//    DYNAMNBR=20       
//*            
//SYSTSPRT DD SYSOUT=*       
//SYSPRINT DD SYSOUT=*       
//SYSUDUMP DD SYSOUT=*       
//SYSPUNCH DD SYSOUT=*       
//*            
//SYSTSIN DD *         
    DSN SYSTEM(XXXX)         
    RUN PROGRAM(DSNTIAUL) PLAN(DSNTIAUL) PARM('SQL') 
//*            
//SYSREC00 DD DSN=TABLEA.UNLOAD.FILE,    
//    DISP=(NEW,CATLG,DELETE),   
//    UNIT=SYSDA,LRECL=80     
//SYSIN DD *         
    SELECT COLUMN1         
     ,'|',COLUMN2         
     ,'|',COLUMN3         
     ,'|',COLUMN4         
     ,'|',COLUMN5         
    FROM TABLEA         
    WITH UR;           
/*             
//*            

輸出產量

VALUEA..|VALUEB..|VALUEC..|VALUED..|VALUEE 
VALUEA..|VALUEB..|VALUEC..|VALUED..|VALUEE 
VALUEA..|VALUEB..|VALUEC..|VALUED..|VALUEE 
VALUEA..|VALUEB..|VALUEC..|VALUED..|VALUEE 
VALUEA..|VALUEB..|VALUEC..|VALUED..|VALUEE 

但我想有一個像下面

VALUEA|VALUEB|VALUEC|VALUED|VALUEE 
VALUEA|VALUEB|VALUEC|VALUED|VALUEE 
VALUEA|VALUEB|VALUEC|VALUED|VALUEE 
VALUEA|VALUEB|VALUEC|VALUED|VALUEE 
VALUEA|VALUEB|VALUEC|VALUED|VALUEE 

我無法弄清楚我們爲什麼...在分隔符「|」之前。任何猜測這個值是什麼意思?感謝您的關注。

回答

8

試着改變你SELECT如下:

SELECT COLUMN1         
     ,CHAR('|'),COLUMN2 
     ,CHAR('|'),COLUMN3 
     ,CHAR('|'),COLUMN4 
     ,CHAR('|'),COLUMN5 
FROM TABLEA 
WITH UR; 

放置在字符串中的輸入恆定'|'上創建輸出可變長度 字符串。可變長度字符串爲 ,前面是一個2字節的二進制字段,給出字符串的長度。 在你的情況下,這將是01(嘗試使用HEX ON查看輸出)。 由於長度是一個二進制整數值 它並不像您所期望的那樣顯示。

標量函數CHAR將長度字符串變量 轉換爲固定長度的字符串,其中 是您所期望的。

注意: DSNTIAUL與SPUFI不同,我猜你更熟悉SPUFI。 DSNTIAUL確實不是將所選數據轉換爲字符,SPUFI確實如此。因此,如果您使用的是DSNTIAUL來選擇包含數字數據的列(例如DECIMAL),則將以二進制形式將 寫入您的輸出文件。 VARCHAR數據將被寫入一個前導長度爲2字節的 長度字段(就像你例子中的'|'字符一樣)。定義爲固定長度字符(如CHAR(5))的列將被寫爲固定長度的字符串(前導二進制長度字段不爲 )。

+0

感謝您的回覆,是的它的長度寫在實際字符之前。我試圖給出一個字符串,並寫入該字符串的長度。無論如何感謝分辨率! – 2011-06-05 13:10:15

-1
`**SELECT COLUMN1 || CAST('|' AS CHAR(1)) 
    || COLUMN2 || CAST('|' AS CHAR(1)) 
    || COLUMN3 || CAST('|' AS CHAR(1)) 
    || COLUMN4 || CAST('|' AS CHAR(1)) 
    || COLUMN5 
FROM TABLEA 
WITH UR;** 
0

使用CHAR功能:

SELECT CHAR(COLUMN1         
    ,CHAR('|'),COLUMN2 
    ,CHAR('|'),COLUMN3 
    ,CHAR('|'),COLUMN4 
    ,CHAR('|'),COLUMN5) 
FROM TABLEA 
WITH UR; 
1

SELECT TRIM(COLUMN1)||
'|' || trim(COLUMN2)||
'|' || trim(COLUMN3)||
'|' || trim(COLUMN4)||
'|' || trim(COLUMN5)FROM TABLEA WITH UR;

在選擇語句U'll修剪每列的輸出並追加'|'使用連接運算符。由於使用修剪,列和'|'之間不會有空格。 For more Ref:IBM Manual On Trim

相關問題