1

我需要使用列标题假脱机查询。查询本身可以正确运行,而虚拟标头查询可以单独正确运行。该查询使用序列对行进行顺序编号(它们代表订单行项目的等价物),如果我将两个查询联合起来,我得到的“指定的序列号(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 的调用何时知道或关心它之前的标头查询。

我足够敏锐想到的唯一解决方法是首先使用数据查询(带有序列)插入到表中,然后将标题查询与针对该表的另一个查询联合起来(消除使用序列的需要)全部在假脱机的 UNION 查询中。我很高兴这样做,但我想知道为什么我当前的查询失败并在没有其他不必要的读/写的情况下修复它。

4

1 回答 1

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如果使用序列的目的是处理查询的多次调用,您可能需要一个变量。

于 2013-06-17T16:14:09.170 回答