2013-06-17 9 views
1

Мне нужно запрограммировать запрос с заголовками столбцов. Сам запрос выполняется правильно сам по себе, а запрос фиктивного заголовка выполняется правильно. Запрос использует последовательность для последовательного номера строк (они представляют собой эквивалент позиций заказа), и если I UNION два запроса, я получаю «указанный порядковый номер (CURRVAL или NEXTVAL), является неуместным.Невозможно использовать последовательность в буферизованном запросе UNION

Заголовок 'запрос':

SELECT 
'ITEM_NUMBER, 
    BM_NUMBER, 
    CREATION_DATE' 
FROM DUAL; 

запрос данных:

SELECT 
    seq.nextval||';'|| 
    BM_NUMBER||';'|| 
    CREATION_DATE 
FROM BIG_TABLE; 

Оба запуска и возвращения именно то, что я ожидал.

SELECT 
'ITEM_NUMBER, 
    BM_NUMBER, 
    CREATION_DATE' 
FROM DUAL 
UNION 
SELECT 
    seq.nextval||';'|| 
    BM_NUMBER||';'|| 
    CREATION_DATE 
FROM BIG_TABLE; 

возвращает ошибку. Я ожидал ошибку неявного преобразования типов и имел TO_CHAR() последовательность, которая не имела никакого значения и не была проблемой. Я также ожидал бы, что запрос данных будет полностью независим от запроса заголовка и, следовательно, не будет иметь никакого отношения к тому, как работает последовательность. Другими словами, я не понимаю, когда вызов seq.nextval знает или интересуется запросом заголовка, который предшествует ему.

Единственным обходным решением, о котором я достаточно острый, было бы сначала использовать запрос данных (с последовательностью) к INSERT в таблицу, затем UNION запрос заголовка с другим запросом к этой таблице (исключая необходимость используйте эту последовательность вообще в буферизованном запросе UNION. Я рад это сделать, но я хотел бы знать, почему мой текущий запрос завершается с ошибкой, и исправить его, не требуя при этом ненужных чтений/записей.

ответ

1

Проверьте this. описывает ограничения последовательностей.

Они не разрешены в union. Я не знаю, распространяется ли ограничение на union all. Вы можете попробовать:

SELECT 
'ITEM_NUMBER, 
    BM_NUMBER, 
    CREATION_DATE' 
FROM DUAL 
UNION all 
SELECT 
    seq.nextval||';'|| 
    BM_NUMBER||';'|| 
    CREATION_DATE 
FROM BIG_TABLE; 

Если это не работает, вы можете использовать вместо rownum:

SELECT 
'ITEM_NUMBER, 
    BM_NUMBER, 
    CREATION_DATE' 
FROM DUAL 
UNION all 
SELECT 
    cast(rownum as varchar2(255))||';'|| 
    BM_NUMBER||';'|| 
    CREATION_DATE 
FROM BIG_TABLE; 

Вы могли бы хотеть иметь offset переменную, если цель в использовании последовательности, чтобы работать с несколькими вызовами запрос.

+0

Решено. Я никогда не думаю, чтобы использовать rownum для чего угодно. В этом случае это не только работает, я считаю, что это действительно правильно - ITEM_NUMBER не имеет другого значения, чем предоставленный rownum, и нет смысла в порядке/последовательности. Надеюсь, я могу сказать большое спасибо. –