sql >> データベース >  >> RDS >> Oracle

すぐに変更シーケンスを実行しても機能しない

    両方のalter sequence ステートメントは機能していますが、その間の増分は発生していません。 nextval selectステートメントが出力をどこにも送信していないため、ループ内の呼び出しは評価されていません。 ドキュメント から 、あなたがしていることを正確に参照しているメモ:

    したがって、その値を何かに選択する必要があります:

    declare
     st VARCHAR(1024);
     val number;
    begin
      for x in (SELECT sequence_name FROM USER_SEQUENCES) loop
          st := 'ALTER SEQUENCE ' || x.sequence_name ||  ' INCREMENT BY 1000';
          execute immediate st;
          st := 'select ' || x.sequence_name ||  '.nextval from dual';
          execute immediate st into val;
          st := 'ALTER SEQUENCE ' || x.sequence_name ||  ' INCREMENT BY 1';
          execute immediate st;
      end loop;
    end;
    /
    

    valを追加しました 変数、およびinto val 2番目の句は即時実行します。

    現在機能していることを示すには:

    create sequence s42;
    
    Sequence s42 created.
    
    declare
     st VARCHAR(1024);
     n number;
    begin
      for x in (SELECT sequence_name FROM USER_SEQUENCES) loop
          st := 'ALTER SEQUENCE ' || x.sequence_name ||  ' INCREMENT BY 1000';
          execute immediate st;
          st := 'select ' || x.sequence_name ||  '.nextval from dual';
          execute immediate st into n;
          st := 'ALTER SEQUENCE ' || x.sequence_name ||  ' INCREMENT BY 1';
          execute immediate st;
      end loop;
    end;
    /
    
    anonymous block completed
    
    select s42.nextval from dual;
    
       NEXTVAL
    ----------
          1001 
    

    intoなし 条項、これはあなたが見ているものである1001ではなく1で戻ってきました。



    1. PostgreSQLの制約の問題

    2. MySQLを使用して複数の列でGROUPBYすることは可能ですか?

    3. パラメータをpostgre関数に渡し、ExecuteReaderを使用してデータを取得するにはどうすればよいですか?

    4. テーブル内のデータ範囲を制約するための宣言型アプローチ