2012-07-26 190 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它