如何在卸载作业中为分隔符编写 DB2 SELECT 语句

Posted

技术标签:

【中文标题】如何在卸载作业中为分隔符编写 DB2 SELECT 语句【英文标题】:How to write DB2 SELECT statement in unload job for delimiters 【发布时间】:2011-06-03 11:56:46 【问题描述】:

我已经完成了这个...看起来很傻但想不通!

我想 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

我无法弄清楚为什么 .. 在分隔符“|”之前。任何猜测该值是什么意思?感谢您的关注。

【问题讨论】:

【参考方案1】:

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

【讨论】:

感谢您的回复,是的,它的长度写在实际字符之前。我试图给出一个字符串并写入该字符串的长度。无论如何感谢您的解决方案!【参考方案2】:

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

在选择语句中,你将修剪每一列的输出并附加'|'使用连接运算符。由于使用修剪,列和“|”之间将没有空格。For more Ref:IBM Manual On Trim

【讨论】:

【参考方案3】:

使用CHAR函数:

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

【讨论】:

【参考方案4】:
 `**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;**  

【讨论】:

以上是关于如何在卸载作业中为分隔符编写 DB2 SELECT 语句的主要内容,如果未能解决你的问题,请参考以下文章

如果 SQL :parameter 在 DB2 JDBC 中为“ALL”,如何匹配所有行?

函数DB2表函数

如何在junit中为Jooq Select Query编写单元测试

如何在python中为Hadoop Map Reduce作业编写组合器和分区器?我如何在Hadoop Job中调用它

如何在 DB2 中获取字符分隔的子字符串?

如何卸载新 WooCommerce 2.3.x 加载的 select2 脚本/样式?