我需要假脱机查询与列标题。查询本身正确运行,而虚拟标头查询单独正确运行。查询使用一个序列对行进行顺序编号(它们表示与订单行项相等),如果将两个查询进行UNION,则得到的指定序列号(CURRVAL或NEXTVAL)是不合适的。
头"查询":
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查询中使用序列)。我很高兴这样做,但我想知道为什么我当前的查询失败,并修复它没有其他不必要的读/写。
看看这个。它描述了序列的局限性。
在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
变量。