执行DB2查询以在文件名中添加日期并生成FTP卡的顺序



有人能解释一下下面查询的执行顺序吗?

以下查询用于将日期附加到文件名并生成相应的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

我理解这个问题,但它是如何按照上面的顺序出现的。如果我更改查询行,它将给出另一个输出(即订单事项)

正如@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的调用。此标量函数允许您指定如何将日期类型转换为字符串类型的格式。我认为这比必须使用子字符串要清楚得多。

重申@mustaccio,没有什么可以控制订单。

幸运的是,DB选择按顺序输出结果,因为DB认为这是目前"最简单"或"最便宜"的方法。事实上,我对它选择的订单感到非常惊讶。猜测有很多尝试和错误,以使它的秩序正确。

该顺序可能会随着任何给定修复程序(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;

最新更新