2014-09-11 1 views
1

Не может ли кто-нибудь объяснить порядок выполнения ниже запроса?Порядок выполнения запроса 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 

я понял запрос, но, как это произошло в указанном выше порядке. если я меняю строку запроса, он дает другой результат (то есть вопросы порядка)

+0

В реляционной базе данных порядок набора результатов не определен _unless_ существует явное предложение 'ORDER BY'. – mustaccio

+0

есть. но как только я выполняю вышеуказанный запрос, я получаю вывод в порядке ASCII, put, close, quit. (Это ожидаемый результат, но любопытно узнать, что контролирует заказ). Еще одна вещь, которую нужно добавить, если вы посмотрите на вышеупомянутый запрос, вы можете видеть, что порядок запросов UNION отличается от результата. Если я изменяю запрос, обменивая места UNION, я получаю результат в другом порядке. Я также не использовал предложение «Заказ». –

ответ

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 , Эта скалярная функция позволяет указать формат преобразования типа даты в тип строки. Я думаю, что это намного яснее, чем использовать подстроки.

+0

Я запускал его много раз, и он дает мне тот же результат. Также, если изменить порядок текста в запросе, он дает результат с другим порядком. –

+0

@ B.K Вы много раз бегали _what_? Вы имеете в виду ваш запрос или запрос, предложенный bhamby? – user2338816

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;