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

Другие вопросы по тегам