Как написать оператор 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

Я не могу понять, почему это .. предшествует разделителю «|». Есть предположения, что означает это значение? Спасибо за интерес.


person Raja Reddy    schedule 03.06.2011    source источник


Ответы (3)


Попробуйте изменить SELECT следующим образом:

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

Размещение строковой константы '|' на входе создает на выходе строку символов переменной длины. Строкам символов переменной длины предшествует 2-байтовое двоичное поле, задающее длину строки. В вашем случае это будет 01 (попробуйте просмотреть вывод с HEX ON). Поскольку длина представляет собой двоичное целочисленное значение, оно не отображается так, как вы ожидали.

Скалярная функция CHAR преобразует строку символов переменной длины в строку символов фиксированной длины, чего вы и ожидали.

Примечание. DSNTIAUL отличается от SPUFI, с которым, я подозреваю, вы лучше знакомы. DSNTIAUL не преобразует выбранные данные в символы, в отличие от SPUFI. Таким образом, если вы использовали DSNTIAUL для выбора столбца, содержащего числовые данные (например, DECIMAL), они будут записаны в ваш выходной файл в двоичном виде. Данные VARCHAR будут записаны с начальным полем длиной 2 байта (как это было с символом «|» в вашем примере). Столбцы, определенные как символы фиксированной длины (например, CHAR(5)) будут записаны как строки символов фиксированной длины (без начального поля двоичной длины).

person NealB    schedule 03.06.2011
comment
Спасибо за ваш ответ, и да, это длина, написанная перед фактическим символом. Я попытался дать строку, и длина этой строки записывается. В любом случае спасибо за разрешение! - person Raja Reddy; 05.06.2011

ВЫБЕРИТЕ обрезку(COLUMN1)||
'|'||обрезать(COLUMN2)||
'|'||обрезать(COLUMN3)||< br> '|'||trim(COLUMN4)||
'|'||trim(COLUMN5) FROM TABLEA WITH UR;

В операторе select U обрежет вывод каждого столбца и добавит '|' с помощью оператора конкатенации. В результате использования обрезки между столбцом и '|' не будет пробелов.Дополнительная информация: IBM Manual On Trim

person Linus Nelson    schedule 18.09.2017

Используйте функцию СИМВОЛ:

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