2012-07-26 70 views
7

我正在使用liquibase管理我的模式。我有一堆插入語句。我已經硬編碼的主要ID號碼。在完成所有插入操作後,我想將序列值更改爲比表中主鍵的最大值多1。爲此我寫了一個PL/SQL,如下所示。但是,當我執行select ArtifactTypes_id_seq.nextval from dual;仍增加0.1Oracle:將序列設置爲特定值

SET SERVEROUTPUT ON SIZE 1000000 
DECLARE 
    sequence_id NUMBER; 
BEGIN 

    SELECT NVL(MAX(idArtifactType), 0) + 1 INTO sequence_id FROM ArtifactTypes; 
    EXECUTE IMMEDIATE 'ALTER SEQUENCE saas.ArtifactTypes_id_seq INCREMENT BY ' || sequence_id; 
    EXECUTE IMMEDIATE 'SELECT ArtifactTypes_id_seq.nextval FROM dual'; 
    EXECUTE IMMEDIATE 'ALTER SEQUENCE saas.ArtifactTypes_id_seq INCREMENT BY 1'; 
    DBMS_OUTPUT.put_line('Executed "ALTER SEQUENCE saas.ArtifactTypes_id_seq INCREMENT BY ' || sequence_id || '"'); 
END; 
/

的DBMS_OUTPUT提供了以下輸出 -
Executed "ALTER SEQUENCE saas.ArtifactTypes_id_seq INCREMENT BY 71"

凡是我失蹤了呢?我做錯了嗎? 注意:我嘗試從SQLDeveloper執行這些SQL。

回答

8

所以我找到了問題。下面應該是PL/SQL -

SET SERVEROUTPUT ON SIZE 1000000 
DECLARE 
    sequence_id NUMBER; 
    temp_seq NUMBER; 
BEGIN 
    SELECT NVL(MAX(idArtifactType), 0) + 1 INTO sequence_id FROM ArtifactTypes; 
    EXECUTE IMMEDIATE 'ALTER SEQUENCE saas.ArtifactTypes_id_seq INCREMENT BY ' || sequence_id; 
    SELECT ArtifactTypes_id_seq.nextval into temp_seq FROM dual; 
    EXECUTE IMMEDIATE 'ALTER SEQUENCE saas.ArtifactTypes_id_seq INCREMENT BY 1'; 
    DBMS_OUTPUT.put_line('Executed "ALTER SEQUENCE saas.ArtifactTypes_id_seq INCREMENT BY ' || sequence_id || '"'); 
END; 
/

下面的語句 -
EXECUTE IMMEDIATE 'SELECT ArtifactTypes_id_seq.nextval FROM dual';
改爲
SELECT ArtifactTypes_id_seq.nextval into temp_seq FROM dual;

和它的工作!

5

您需要刪除序列,然後重新創建它,使用開始與子句來分配初始值,例如:

CREATE SEQUENCE saas.ArtifactTypes_id_seq 
    START WITH 72; 

而且,從序列中選擇的NEXTVAL自動遞增1它