如何在卸载作业中为分隔符编写 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”,如何匹配所有行?
如何在junit中为Jooq Select Query编写单元测试