PL/SQLでシーケンスを削除して再作成する方法

このQ&Aのポイント
  • PL/SQLを使用して、シーケンスを削除して再度作成する方法についてアドバイスをいただけないでしょうか。
  • 具体的なSQL文を示し、PL/SQLで実行する方法についてのヒントをいただけたら助かります。
  • 既存のシーケンスを削除して新しく作成するためのPL/SQLのコード例や注意点について教えてください。
回答を見る
  • ベストアンサー

PL/SQLの文法

oracle8,windows95を使用しています。 PL/SQLで、シーケンスを削除して再度作成するという処理を書きたいのですが、PL/SQLはまったくの素人のためアドバイスをいただけたら、と思います。 実行したいのは、以下のSQL文です。 1) SQL>DROP SEQUENCE SQC_TEST 2) SQL>CREATE SEQUENCE SQC_TEST INCREMENT BY 1 START WITH 1 MAXVALUE 9999 MINVALUE 1 CYCLE; これを、PL/SQLで実行するにはどうかけばよいでしょうか? CREATE OR REPLACE PROCEDURE HC_CREATE_SEQ BEGIN DROP SEQUENCE SEQ_車両申請 FROM DUAL; CREATE SEQUENCE SQC_TEST INCREMENT BY 1 START WITH 1 MAXVALUE 9999 MINVALUE 1 CYCLE; END; / と書いてみましたがコンパイルに失敗しましたとおこられてしまいます。 ヒントだけでもいただけたら、と思います。 よろしくお願いいたします。

  • sunnys
  • お礼率95% (176/185)

質問者が選んだベストアンサー

  • ベストアンサー
  • chaff
  • ベストアンサー率30% (264/874)
回答No.1

PL/SQLでは、データ定義言語(DDL)は基本的には記述できません。 よって、 CREATE xxxx とか DROP xxxx なんて書くことはできないというわけです。 じゃあ方法はぜんぜんないかというと...そんなことはないわけで、PL/SQLについてくる「DBMS_SQLパッケージ」っていうものを使います。 ↓のサイトでもちらっと紹介していますが、詳細は 「PL/SQL パッケージ・プロシージャリファレンス」(ORACLE開発者マニュアルセット所収)を参照してください

参考URL:
http://www.mars.dti.ne.jp/~o-shin/new/kowaza/body1500.html
sunnys
質問者

お礼

回答ありがとうございます。 なるほど、そのままでは使えないんですね。 リファレンスが手元にないので参考URLを見てきます。 また質問するかもしれませんので宜しくお願いいたします。

sunnys
質問者

補足

できました!!(^O^)/ 参考URLが大変参考になりました。 どうもありがとうございました~ また何かありましたら宜しくお願いいたします!

関連するQ&A

  • oracleのシーケンスについて

    こんにちは。oracleのシーケンスについて教えてください。 次のようなシーケンスを作成します。 CREATE SEQUENCE SQC_TEST INCREMENT BY 1 START WITH 1 MAXVALUE 999999 MINVALUE 1 CASHE 20 CYCLE / この時、キャッシュ分の20という値は、いつどこでクリア?されるのか知りたいのです。 一番最初はシーケンスをクリエイトした時にキャッシュが20確保されると思うのですが、次にキャッシュが確保されるタイミングっていつなんでしょう? 最初の20を使い果たした時?それともシーケンスを作成してあるインスタンスをリブートした時?? というのは、設定したシーケンスが、実際発番していないのに一日ごとに20ずつカウントされていってるので原因をつきとめたいのです。 とりあえずはNOCACHEに設定してありますが、原因がわかれば、と思い質問させていただきました。 何かアドバイスいただけたらと思います。宜しくお願いいたします。

  • PL/SQLでCREATE SEQUENCEの呼び出し

    いつも参考にさせていただいてます。 select文で取得した日付の年下2桁をもとに 順序を取得したいと思っています。 CREATE SEQUENCEは seq_id_04 seq_id_05 seq_id_06   :    というように年ごとに作成されてあります。 seq_id_yy.nextval yyを取得した年に置き換えて実行したいのですが、 なかなかうまくいきません。 初めてのPL/SQLのため説明文におかしな部分があったらすみません。 ご存知の方がいましたら、ぜひぜひご教授ください。

  • SQL(Sequence)の問題が分かりません。

    こんにちは。 SQLの学習をしているのですが、Sequenceの問題で解き方が分からないため質問させて頂きます。 問題は以下となります。 A sequence was created with the DDL statement shown below: CREATE SEQUENCE my_seq START WITH 5 INCREMENT BY 5 CACHE 5 User1 successfully executes the following statements in Connection1: VALUES NEXT VALUE FOR my_seq INTO :con1hvar VALUES NEXT VALUE FOR my_seq INTO :con1hvar User2 successfully executes the following statement in Connection2: VALUES NEXT VALUE FOR my_seq INTO :con2hvar After User1 & User2 are finished, User3 executes the following statement in Connection3: SELECT NEXT VALUE FOR my_seq FROM sysibm.sysdummy1 Which value will be returned by the query? A. 20 B. 25 C. 50 D. 55 Answer: D 上記の解き方をご存じの方はご回答お願い致します。

  • CURRVALで絞り込み

    CREATE TABLE CTRL ( NO NUMBER    NOT NULL, DT NUMBER(8,0) NOT NULL ) CREATE SEQUENCE SQ_CTRLNO   START WITH 1   INCREMENT BY 1   NOMAXVALUE   NOMINVALUE   CYCLE; というテーブルがあり、トリガにてNOに自動採番します。 この時、現在の最新行を取得する為にシーケンスのCURRVALにて絞り込みを行いたいのですが、1行でSELECTする方法は無いでしょうか。 エラーにはなりますが、やりたい事は以下の通りです。 SELECT NO,DT FROM CTRL WHERE NO=SQ_CTRLNO.CURRVAL; ちなみにシーケンスはCYCLEなので並べ替えは使えません…。

  • PL/SQLのパフォーマンスについて

    PL/SQLで、元のプログラムから、部品プログラム(以下のTEST_BUHIN)を呼ぶ際の、 パフォーマンスについてお聞きしたいことがあります。 Oracle8i環境を使っています。 以下の2つをコンパイルすると考えてください。 -------------------------------------------------- CREATE OR REPLACE TYPE test_type as object (  COL1 NUMBER(11),  COL2 VARCHAR2(20),    (実際には、40項目くらいあります)   ); / -------------------------------------------------- CREATE OR REPLACE PACKAGE BODY TEST_BUHIN AS  PROCEDURE TESTINSERT(TESTDATA IN test_type)  AS  BEGIN   INSERT INTO TESTTABLE VALUES(    TESTDATA.COL1,TESTDATA.COL2, ・・・    (以下略) -------------------------------------------------- 今、TESTTABLEにINSERTするプログラムを作成したいのですが、 パフォーマンスを最優先に考えたいと思っています。 その場合、元のプログラム内にINSERT文を作るべきか、 部品(TEST_BUHIN)を使用すべきか迷っています。 パフォーマンスがほぼ同じであれば、部品(TEST_BUHIN)を使用したいと思っています。 部品を使うとパフォーマンスが極端に落ちるということであれば、 部品はコンパイルせずに、元のプログラム内にINSERT文を作成しようと思います。 オブジェクトタイプ型変数を引数として渡した場合、 パフォーマンスへの影響はあるのでしょうか? 自分でも調べてみたのですが、いまいち分かりませんでした。 あと、大きな引数を渡した場合に、メモリをたくさん使ってしまうのかどうかも気になります。 文章が分かりづらいと思いますので、みなさんのご意見などを見て補足させていただきます。 Oracle、PL/SQLに詳しい方、よろしくお願いいたします。

  • PL/SQLのエラー処理について

    PL/SQLを勉強し始めたのですが、テーブルを作成してから、データを流し込むという処理をしたいのですが、テーブルの作成に失敗しらたら、処理を終了させるという処理はできないのでしょうか? それとも、考え方が違うのでしょうか?アドバイスお願いします。 次のようにPL/SQLを作成しています。 例) declare curHandle1 INTEGER; begin curHandle1 := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(curHandle1, 'create table xxx as select * from xxx where ID=-1', DBMS_SQL.V7); DBMS_SQL.CLOSE_CURSOR(curHandle1); exception when OTHERS then エラーになったら、処理終了したい(次のブロックにいきたくない) end; declare begin      insert into xxx NOLOGGING values (1,'test'); end; よろしくお願いします。

  • Oracle8iで順序の値のリセット

    Oracle8.1.5上で現在稼動している順序があります。 わけあってこの値をスタート時の値1にリセットしたいのです。 どのような方法があるでしょうか? DROP SEQUENCEしてCREATE SEQUENCEは避けたいのですが どなたかご存知の方お願いします。

  • 【PL/SQL】IF文( EXIT WHEN )でプロシージャの実行結果から判断させたい

    Oracleで動くPL/SQLを作成してます。 プロシージャの実行結果をIF文に入れて、 実行結果からさらに処理を走らせたいのですが エラーが出てしまいます。 例) CREATE PROCEDURE TEST1(id NUMBER) BEGIN select NAME from TBLA where DID = id and ROWNUM <= 1; END; CREATE PROCEDURE TEST2(id NUMBER) BEGIN LOOP EXIT WHEN ( TEST1(id) is not null );☆ここがうまくいかない。 id := id + 1; END LOOP; END; TEST2のCreate時にTEST1は関数として存在しないというエラーメッセージが表示されます。 IF(EXIT WHEN)文中からはずして TEST1(id)のみの実行では、エラーが起きず IF文に入れるとエラーが起きるところまでは分かりました。 例はかなり簡略しているのですが、 どうしたらうまく動くのか分かる方がいれば 教えてもらいたいです。

  • SQL ServerのストアドでUPDATEを実行すると・・・

    SQL Serverのストアド中でUPDATEを実行すると OUTパラメータの値が取得できなくなってしまいます。 何か制約などあるのでしょうか? わかる方よろしくお願いします。 1.UPDATE文をコメントアウトすると取得できます。 2.UPDATEは正常に実行されています。 /**参考ソース**/ /** 下記プログラムは、引数で取得した文字列に 連番テーブルの値をインクリメントした値と 結合しOUTパラメータに、連番テーブルには、 インクリメント結果をセットしています。 **/ CREATE procedure xml_get_document_seq @inDate varchar(14), @outSeq varchar(18) output as begin declare @Work varchar(4) declare @Seq varchar(18) declare @Number decimal(5) declare @SeqDoc varchar(18) if not exists(SELECT SEQ FROM XML_DOCUMENT_SEQ) begin INSERT INTO XML_DOCUMENT_SEQ(SEQ) VALUES(0) end set @Seq = ISNULL(@inDate,'') SELECT @Number = SEQ FROM XML_DOCUMENT_SEQ set @Number = @Number + 1 if @Number > 9999 begin  set @Number = 1 end set @Work = ISNULL(convert(varchar,@Number),'') set @SeqDoc= @Seq + replicate('0', 4 - datalength(@Work)) + @Work UPDATE XML_DOCUMENT_SEQ SET SEQ = @Number Set @outSeq = @SeqDoc return @Number end GO

  • ODBC経由でMySQL5.0に auto_increment属性などを付加したテーブルを作成したい

    ODBC経由でMySQL5.0に auto_increment属性など付加した以下のテーブルを作成したいのですがODBCのSQL文はどう書けばよいのでしょうか? DROP TABLE IF EXISTS test; CREATE TABLE IF NOT EXISTS test ( a1 int(11) NOT NULL auto_increment, b1 enum('public','group','private') NOT NULL default 'public', c1 date NOT NULL default '0000-00-00', d1 mediumtext NOT NULL, PRIMARY KEY (`a1`) ) TYPE=MyISAM AUTO_INCREMENT=1 ; よろしくお願いします。