以下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;
答案 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这样的程序说