Oracle序列:CURRVAL不允许在这里?

时间:2009-09-17 12:08:51

标签: oracle sequence

以下Oracle SQL代码生成错误“ ORA-02287:此处不允许序列号 ”:

INSERT INTO Customer (CustomerID,Name) VALUES (Customer_Seq.nextval,'AAA');
SELECT * FROM Customer where CustomerID=Customer_Seq.currval;

第二行(SELECT语句)发生错误。我真的不明白这个问题,因为这确实有效:

INSERT INTO Customer (CustomerID,Name) VALUES (Customer_Seq.nextval,'AAA');
SELECT Customer_Seq.currval from dual;

5 个答案:

答案 0 :(得分:8)

您已发布了一些示例代码,因此不清楚您要实现的目标。如果你想知道指定的值,比如传递给其他一些程序,你可以这样做:

SQL> var dno number
SQL> insert into dept (deptno, dname, loc)
  2      values (deptno_seq.nextval, 'IT', 'LONDON')
  3      returning deptno into :dno
  4  /

1 row created.

SQL> select * from dept
  2  where deptno = :dno
  3  /

    DEPTNO DNAME          LOC
---------- -------------- -------------
        55 IT             LONDON

SQL>

修改

我们可以使用RETURNING子句获取任何列的值,包括那些已使用默认值或触发器代码设置的列。

答案 1 :(得分:5)

您没有说出您使用的是哪个版本的Oracle。过去在PL / SQL中可以使用序列的地方存在限制 - 大多数情况下,如果不是全部都在11G中消失了。此外,SQL中存在限制 - 请参阅this list

在这种情况下,您可能需要写:

SELECT Customer_Seq.currval INTO v_id FROM DUAL; 
SELECT * FROM Customer where CustomerID=v_id;

(评论后编辑)。

答案 2 :(得分:4)

这并不能直接回答你的问题,但也许你想做的事情可以使用INSERT的RETURNING子句来解决?

DECLARE
  -- ...
  last_rowid rowid;
  -- ...
BEGIN
  -- ...
  INSERT INTO Customer (CustomerID,Name) VALUES (Customer_Seq.nextval,'AAA') RETURNING rowid INTO last_rowid;
  SELECT * FROM Customer where rowid = last_rowid;
  -- ...
END;
/

答案 3 :(得分:3)

您不能在WHERE子句中使用序列 - 它在您的上下文中看起来很自然,但Oracle不允许在比较表达式中使用该引用。

[编辑]

这将是一个PL / SQL实现:

declare
v_custID number;
cursor custCur is
  select customerid, name from customer
   where customerid = v_custID;
begin
select customer_seq.nextval into v_custID from dual;
insert into customer (customerid, name) values (v_custID, 'AAA');
commit;
for custRow in custCur loop
 dbms_output.put_line(custRow.customerID||' '|| custRow.name); 
end loop;
end;

答案 4 :(得分:-2)

您尚未创建任何

sequence 

首先创建其循环和缓存的任何序列。这是一些基本的例子

Create Sequence seqtest1
Start With 0             -- This Is Hirarchy Starts With 0
Increment by 1           --Increments by 1
Minvalue 0               --With Minimum value 0
Maxvalue 5               --Maximum Value 5. So The Cycle Of Creation Is Between 0-5
Nocycle                  -- No Cycle Means After 0-5 the Insertion Stopes
Nocache   --The cache Option Specifies How Many Sequence Values Will Be Stored In Memory For Faster Access

你不能在SQL中的Sequence上使用Where子句,因为你无法过滤序列。使用像@APC这样的程序说