Невозможно использовать последовательность в буфере UNION Query
Мне нужно спулинга запроса с заголовками столбцов. Сам запрос выполняется правильно самостоятельно, а запрос фиктивного заголовка выполняется правильно в одиночку. Запрос использует последовательность для последовательной нумерации строк (они представляют эквивалент позиций строки заказа), и если я ОБЪЕДИНЯЮ, два запроса, которые я получаю, "указанный порядковый номер (CURRVAL или NEXTVAL) неуместен.
Заголовок 'query':
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 знает или заботится о запросе заголовка, который предшествует ему.
Единственный обходной путь, о котором я должен подумать, - это сначала использовать запрос данных (с последовательностью), чтобы ВСТАВИТЬ в таблицу, а затем ОБЪЕДИНИТЬ запрос заголовка с другим запросом к этой таблице (устраняя необходимость использовать последовательность в все в буферизованном запросе UNION. Я счастлив сделать это, но я хотел бы знать, почему мой текущий запрос терпит неудачу, и исправить это без ненужных операций чтения / записи.
1 ответ
Проверьте это. Он описывает ограничения последовательностей.
Они не допускаются в 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
переменная, если целью использования последовательности является обработка нескольких вызовов запроса.