スキーマの管理に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を実行してみました。
だから私は問題を見つけました。以下は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;
そしてそれはうまくいった!
シーケンスを削除してから再作成する必要があります。STARTSWITH句を使用して、初期値を割り当てます。例:
CREATE SEQUENCE saas.ArtifactTypes_id_seq
START WITH 72;
また、シーケンスからNEXTVALを選択すると、自動的に1ずつインクリメントされます。