在子查询中使用sequence.nextval

时间:2015-08-19 11:58:41

标签: sql oracle

我想创建一个模板(通过SQL),可以直接复制到MS Excel中。

一般来说这很顺利,然而,我遇到了应该存储Excel公式的字段的问题。该字段应该用于根据Excel工作表的其中一列中的用户输入在Excel文件中创建INSERT语句。

这是我的代码:

SELECT
-- some other fields here
[...],
(SELECT '="INSERT INTO MyTable VALUES(" &C' || CREATE_INSERTS_TEMP_SEQ.nextval || '&",''THIS COLUMN IS TO BE FILLED BY USER IN EXCEL'',''"&D' || CREATE_INSERTS_TEMP_SEQ.currval || '&"'',14,sysdate);"' FROM DUAL) As SQL_Statement
FROM myTable;

我收到错误消息ORA-02287: sequence number not allowed here

为什么我的子查询中不允许这样做?知道如何解决这个问题吗?

我必须能够访问这些值才能创建一个正常运行的Excel公式,因为这些数字是对各个Excel行的引用......

2 个答案:

答案 0 :(得分:3)

The documentation包含限制,包括:

  

CURRVAL和NEXTVAL不能在这些地方使用:

     
      
  • 子查询
  •   
  • ...
  •   

但是你不需要子查询:

SELECT
-- some other fields here
[...],
'="INSERT INTO MyTable VALUES(" &C' || CREATE_INSERTS_TEMP_SEQ.nextval
  || '&",''THIS COLUMN IS TO BE FILLED BY USER IN EXCEL'',''"&D'
  || CREATE_INSERTS_TEMP_SEQ.currval || '&"'',14,sysdate);"' As SQL_Statement
FROM myTable;

此表单不会产生错误。

我怀疑曾经有一个原因在子查询中不允许它是因为它不清楚或确定性地执行子查询的次数。如果它在这种情况下有用,那么你可能对表中的每一行都有相同的insert语句,这可能不是你的意图。

答案 1 :(得分:2)

在旧版本的Oracle中,您无法在sequence.NEXTVAL语句中使用INSERT。您必须有SELECTNEXTVAL放入变量中,然后使用变量INSERT。

较新版本的oracle允许INSERT使用sequence.NEXTVAL