Как написать оператор DB2 SELECT в задании выгрузки для разделителей - PullRequest
4 голосов
/ 03 июня 2011

Я прошел через это ... кажется глупым, но не мог понять!

Я хочу РАЗГРУЗИТЬ стол, но с разделителем '|' между полями. Вот 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

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

Ответы [ 4 ]

8 голосов
/ 03 июня 2011

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

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

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

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

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

1 голос
/ 18 сентября 2017

ВЫБРАТЬ трим (КОЛОННА1) ||
'|' || отделка (COLUMN2) ||
'|' || отделка (колонка3) ||
'|' || отделка (column4) ||
'|' || отделка (COLUMN5) ИЗ ТАБЛИЦЫ С UR;

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

0 голосов
/ 18 августа 2017

Используйте функцию CHAR:

SELECT  CHAR(COLUMN1                                   
   ,CHAR('|'),COLUMN2   
   ,CHAR('|'),COLUMN3  
   ,CHAR('|'),COLUMN4  
   ,CHAR('|'),COLUMN5)
FROM TABLEA  
WITH UR;
0 голосов
/ 25 апреля 2016
 `**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;**  
...