web-dev-qa-db-ja.com

Oracle:シーケンスを特定の値に設定する

スキーマの管理にliquibaseを使用しています。たくさんの挿入ステートメントがあります。プライマリID番号をハードコーディングしました。すべての挿入が完了したら、シーケンス値をテーブルの主キーの最大値より1大きい値に変更したいと思います。このために、以下に示すようにPL/SQLを作成しました。ただし、select ArtifactTypes_id_seq.nextval from dual;を実行すると、0が増加します。

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
devang

だから私は問題を見つけました。以下は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;

そしてそれはうまくいった!

10
devang

シーケンスを削除してから再作成する必要があります。STARTSWITH句を使用して、初期値を割り当てます。例:

CREATE SEQUENCE saas.ArtifactTypes_id_seq
  START WITH 72;

また、シーケンスからNEXTVALを選択すると、自動的に1ずつインクリメントされます。

6
PaddyC