不能在假脱机的UNION查询中使用序列



我需要假脱机查询与列标题。查询本身正确运行,而虚拟标头查询单独正确运行。查询使用一个序列对行进行顺序编号(它们表示与订单行项相等),如果将两个查询进行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变量。

相关内容

  • 没有找到相关文章

最新更新