質問: PL/SQLでSEQUENCEを再作成しようとしています。 やりたいことは 1. Aテーブルで100000~800000の間で最大のseqの値を取得 2. 取得したseqに+1をする 3. seqの値を初期値として、再度SEQを作成する ``` DECLARE lastNumberTmp NUMBER; -- SEQ_ZD034MST01の現在値 BEGIN --実行の始まり SELECT max(seq) into lastNumberTmp from A where seq between 100000 and 800000; lastNumberTmp := lastNumberTmp + 1; -- *********************************************** -- * シーケンス再生成 * -- *********************************************** DROP SEQUENCE "ZDUSER"."SEQ_A"; CREATE SEQUENCE "ZDUSER"."SEQ_A" MINVALUE lastNumberTmp MAXVALUE 900000 INCREMENT BY 1 START WITH 200000 CACHE 20 NOORDER NOCYCLE NOPARTITION; DBMS_OUTPUT.PUT_LINE('seqの現在値'); DBMS_OUTPUT.PUT_LINE(lastNumberTmp); COMMIT; END; --実行の終わり / ``` しかし、以下のエラーが出てしまいます。 ``` ND; --実行の終わり エラー・レポート - ORA-06550: 行11、列5: PLS-00103: 記号"DROP"が見つかりました。 次のうちの1つが入るとき: ( begin case declare end exception exit for goto if loop mod null pragma raise return select update while with << continue close current delete fetch lock insert open rollback savepoint set sql execute commit forall merge pipe purge 06550. 00000 - "line %s, column %s:\n%s" *Cause: Usually a PL/SQL compilation error. *Action: ``` ネットで検索しましたがイマイチよくわからないので、どなたかご教示いただけると助かります。
回答: DROP SEQUENCE, CREATE SEQUENCE はDMLではなく、DDLなのでPL/SQLではEXECUTE IMMEDIATE文 を使う必要があります。 DROP SEQUENCE, CREATE SEQUENCE するとその SEQUENCE を使っているOracle Object の STATUS が 'INVALID' になってしまうので、安全のためコンパイルしておきたいです。 STATUS が 'INVALID'にならないように、EXECUTE IMMEDIATE でALTER SEQUENCE を使っては?