4

我已经结束了……看起来很傻,但想不通!

我想 UNLOAD 一个表,但有一个分隔符 '|' 在田野之间。这是用于卸载表的 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

4 回答 4

9

尝试更改您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))的列将被写入为固定长度字符串(无前导二进制长度字段)。

于 2011-06-03T13:51:59.367 回答
1

选择修剪(COLUMN1)||
'|' ||修剪(COLUMN2)||
'|' ||修剪(COLUMN3)||
'|' ||修剪(COLUMN4)||
'|' ||使用 UR 从 TABLEA 修剪(COLUMN5);

在选择语句中,您将修剪每一列的输出并附加“|” 使用连接运算符。由于使用修剪,列和“|”之间将没有空格。更多参考:IBM 修剪手册

于 2017-09-18T09:25:19.590 回答
0

使用 CHAR 函数:

SELECT  CHAR(COLUMN1                                   
   ,CHAR('|'),COLUMN2   
   ,CHAR('|'),COLUMN3  
   ,CHAR('|'),COLUMN4  
   ,CHAR('|'),COLUMN5)
FROM TABLEA  
WITH UR;
于 2017-08-18T14:38:43.003 回答
-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;**  
于 2016-04-25T09:33:58.820 回答