2

以下 Oracle SQL 代码生成错误“ ORA-02287: sequence number not allowed here ”:

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;
4

5 回答 5

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 子句来获取任何列的值,包括那些已经使用默认值或触发代码设置的值。

于 2009-09-17T12:28:02.237 回答
5

你没有说你使用的是什么版本的 Oracle。过去,在 PL/SQL 中可以使用序列的位置存在限制——如果不是全部都在 11G 中消失的话,大多数情况下。此外,SQL 中也有限制 - 请参阅此列表

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

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

(评论后编辑)。

于 2009-09-17T12:12:15.750 回答
4

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

宣布
  -- ...
  last_rowid 行ID;
  -- ...
开始
  -- ...
  INSERT INTO Customer (CustomerID,Name) VALUES (Customer_Seq.nextval,'AAA') RETURNING rowid INTO last_rowid;
  SELECT * FROM Customer where rowid = last_rowid;
  -- ...
结尾;
/
于 2009-09-17T12:51:30.503 回答
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;
于 2009-09-17T12:21:04.353 回答
-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 中对序列执行 Where 子句,因为您无法过滤序列。使用@APC 说的程序

于 2013-04-06T19:28:44.907 回答