2009-09-17 49 views
2

以下Oracle SQL代碼生成錯誤 「ORA-02287:這裏不允許序列號」:Oracle序列:這裏不允許CURRVAL?

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; 

回答

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> 

編輯

我們可以用返回的條款得到任何列的值,包括那些已經用默認值或觸發代碼設置的。

+0

我要檢索剛剛創建的記錄,包括所生成的序列,並分別設置在列的任何缺省值。 –

5

你不說你正在使用哪個版本的Oracle。過去在PL/SQL中可以使用序列的地方是有限制的 - 大多數情況下,如果不是所有的都在11G中。另外,SQL中有一些限制 - 請參閱this list

在這種情況下,你可能需要寫:

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

(評論後可進行編輯)。

+0

我使用Oracle 10g –

+0

在相同的錯誤 –

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; 
+0

使用子選擇結果,因此如何解決呢? –

+0

這取決於 - 您是否在PL/SQL塊中使用它?總的想法是,一旦你從第一次操作有它保存的序列值,並通過綁定變量在第二個查詢應用它。 – dpbradley

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; 
/
+0

這幾乎是我所需要的,但是當你的代碼被執行時,我會得到「在這個SELECT語句中有一個INTO子句」 –

+0

真的沒有必要使用select語句。您可以從insert語句的返回子句中獲取所需的所有數據。 –

+0

其實**有**需要我的應用程序中的選擇語句。我需要一個通用的解決方案來返回插入的完整記錄。現在,我已經通過使用「返回」並在之後運行單獨的select語句來返回「順序」列來解決它。不理想,但它能完成這項工作。 –

-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怎麼一回事,因爲你不能過濾序列順序條款。說喜歡@APC使用手續