DB2查询的执行顺序,用于在文件名中追加日期并生成FTP卡

时间:2014-09-11 10:01:40

标签: sql db2 mainframe

有人可以解释下面查询的执行顺序吗?

以下查询用于将日期附加到文件名并生成相应的ftp卡。

SELECT CHAR('close',80) FROM SYSIBM.SYSDUMMY1
UNION ALL
SELECT CHAR('   /CSSC/Inbound/AP_MP_P2C_A47_Report/A47_"' ||
         SUBSTR(CHAR(CURRENT DATE,ISO),6,2) ||
         SUBSTR(CHAR(CURRENT DATE,ISO),9,2) ||
         SUBSTR(CHAR(CURRENT DATE,ISO),3,2) || '.TXT',80)
      FROM SYSIBM.SYSDUMMY1
UNION ALL
SELECT CHAR(
        'put ' ||
        X'27' ||
        'MCSP.WMCS11CD.OPENPOS.TABFILE.TEMP' ||
        X'27' ||
        ' +'
        ,80)
FROM
SYSIBM.SYSDUMMY1
UNION ALL
SELECT CHAR('ASCII',80) FROM SYSIBM.SYSDUMMY1
UNION ALL
SELECT CHAR('quit',80)  FROM SYSIBM.SYSDUMMY1;

结果是

ASCII                                                                           
put 'MCSP.WMCS11CD.OPENPOS.TABFILE.TEMP' +                                      
/CSSC/Inbound/AP_MP_P2C_A47_Report/A47_110914.TXT                                           
close                                                                           
quit

我理解了查询,但它是如何按上述顺序排列的。如果我更改了查询行,它会给出另一个输出(即订单很重要)

2 个答案:

答案 0 :(得分:0)

正如@mustaccio所说,除非你提供ORDER BY条款,否则没有订单。如果没有该子句,数据库引擎将选择最简单的"恢复数据的方法。在两次连续的查询运行之间,它甚至不能保证是相同的顺序。

如果您需要特定订单,则应添加一个提供排序的新字段,并使用ORDER BY子句:

SELECT text FROM (
    SELECT CHAR('ASCII',80), 1 FROM SYSIBM.SYSDUMMY1

        UNION ALL

    SELECT CHAR( 'put ' ||  X'27' ||
            'MCSP.WMCS11CD.OPENPOS.TABFILE.TEMP' ||
            X'27' || ' +' ,80), 2
    FROM SYSIBM.SYSDUMMY1

        UNION ALL

    SELECT CHAR('   /CSSC/Inbound/AP_MP_P2C_A47_Report/A47_' || 
                VARCHAR_FORMAT(CURRENT DATE, 'MMDDYY') || 
                '.TXT',80), 3
          FROM SYSIBM.SYSDUMMY1

    UNION ALL

    SELECT CHAR('close',80), 4 FROM SYSIBM.SYSDUMMY1

        UNION ALL

    SELECT CHAR('quit',80), 5  FROM SYSIBM.SYSDUMMY1
) AS A (text, num)
ORDER BY num

并非我已将DATE子字符串更改为VARCHAR_FORMAT的来电。此标量函数允许您指定如何将日期类型转换为字符串类型的格式。我认为它比使用子串更清楚。

答案 1 :(得分:0)

重申@mustaccio,没有任何东西可以控制订单。

您很幸运,因为数据库选择按顺序输出结果,因为数据库认为这是最简单的"或者"最便宜的"今天做的方式。我对它挑选的订单感到非常惊讶。猜测有很多试验和错误才能正确订购。

可以想象,随着任何给定修复(PTF)的安装,该命令会发生变化。

在我看来,这是一种非常糟糕的构建FTP脚本的方法。但如果你打算这样做,你应该这样做

with tbl (linenbr, stmt) as (
SELECT 4, CHAR('close',80) FROM SYSIBM.SYSDUMMY1
UNION ALL
SELECT 3, CHAR('   /CSSC/Inbound/AP_MP_P2C_A47_Report/A47_"' ||
         SUBSTR(CHAR(CURRENT DATE,ISO),6,2) ||
         SUBSTR(CHAR(CURRENT DATE,ISO),9,2) ||
         SUBSTR(CHAR(CURRENT DATE,ISO),3,2) || '.TXT',80)
      FROM SYSIBM.SYSDUMMY1
UNION ALL
SELECT 2, CHAR(
        'put ' ||
        X'27' ||
        'MCSP.WMCS11CD.OPENPOS.TABFILE.TEMP' ||
        X'27' ||
        ' +'
        ,80)
FROM
SYSIBM.SYSDUMMY1
UNION ALL
SELECT 1, CHAR('ASCII',80) FROM SYSIBM.SYSDUMMY1
UNION ALL
SELECT 5, CHAR('quit',80)  FROM SYSIBM.SYSDUMMY1
)
SELECT stmt from TBL
ORDER BY linenbr;