web-dev-qa-db-ja.com

Oracle SQLに「存在しない場合はシーケンスを作成...」のようなものはありますか?

Oracle 8 DBを使用するアプリケーションの場合、SQL * Plusにコピーして貼り付けることができる、トリガーやシーケンスなどをセットアップするためのSQLスクリプトを提供しています。作成しようとしているシーケンスがすでに存在する場合、スクリプトがエラーで停止しないようにしたいと思います。トリガーの場合、これは「トリガーの作成または置換...」を使用して簡単に実行できますが、シーケンスの場合、これは機能しません。 「mysequenceが存在しない場合はシーケンスを作成...」も試しましたが、それもしませんでした。別の方法はありますか?

または、これが不可能な場合、mysequenceが存在しない場合にSQL * Plusがスクリプトを中止せずに「ドロップシーケンスmysequence」を実行する方法はありますか?

18
Timo

スクリプトが常にSQL * Plusで実行されることが確実な場合は、CREATESEQUENCEステートメントをディレクティブで囲んでエラーが発生しても続行できます。

WHENEVER SQLERROR CONTINUE
-- create sequences here, ignoring errors
WHENEVER SQLERROR EXIT SQL.SQLCODE

シーケンスの作成ステートメントに他のエラー(許可の問題、構文の失敗など)がある場合、それらは無視されることに注意してください。

8
dpbradley
DECLARE
  v_dummy NUMBER;
BEGIN
  -- try to find sequence in data dictionary
  SELECT 1
  INTO v_dummy
  FROM user_sequences
  WHERE sequence_name = 'MY_SEQUENCE_NAME';

  -- if sequence found, do nothing
EXCEPTION
  WHEN no_data_found THEN
    -- sequence not found, create it
    EXECUTE IMMEDIATE 'create sequence my_sequence_name';
END;
15
jva

好き:

DECLARE
  C NUMBER;
BEGIN
  SELECT COUNT(*) INTO C
  FROM ALL_TRIGGERS
  WHERE OWNER = 'YOUROWNER'
  AND TRIGGER_NAME = 'YOURTRIGGER';

  IF (C = 0) THEN
    EXECUTE IMMEDIATE '
      CREATE TRIGGER "YOUROWNER"."YOURTRIGGER"
        blah blah blah your trigger blah blah
    ';
  END IF;
END;
/
4
quillbreaker

確認してもいい user_sequenceテーブルを作成して作成中のシーケンスがすでに存在するかどうかを確認します。

davekのソリューションと同様:シーケンスを作成する前に、シーケンスをドロップして作成し、すべて動的SQLで関数を作成し、10個のシーケンスを作成する必要がある場合は、関数に処理を任せるという考え方です。 .。。

function crt_seq(p_seq_name varchar2)
return boolean
begin
   for i in (select 1 from user_sequence where sequence_name = upper(p_seq_name))
   loop
   ---- Already exists. You can drop and recreate or return false to error out
   execute immediate 'drop sequence '||p_seq_name;
   execute immediate 'create sequence '||p_seq_name||' start with 1 increment
                    by 1 nocache';
   end loop;
   return true;
exception
when others then
   return false;
end;

他のすべてのオプションをパラメータ化し、シーケンスを作成するための精巧な機能を使用できます。

1
Guru
DECLARE
  lsSeqName VARCHAR2(32 CHAR) := UPPER('MY_SEQUENCE_NAME');
  lnSeqCount NUMBER;
BEGIN
  -- try to find sequence in data dictionary
  SELECT count(1)
    INTO lnSeqCount
    FROM user_sequences
    WHERE UPPER(sequence_name) = lsSeqName;
  -- if sequence not found, create it
  IF lnSeqCount = 0 THEN
    EXECUTE IMMEDIATE 'CREATE SEQUENCE ' || lsSeqName || ' START WITH 1 MINVALUE 1 MAXVALUE 1000000000000000 INCREMENT BY 1 NOCYCLE CACHE 20 NOORDER';
  END IF;
END;
/

OR

-- helper method
PROCEDURE createSeqIfNotExists (
  isSeqName VARCHAR2
) IS
  lnSeqCount NUMBER;
BEGIN
  -- try to find sequence in data dictionary
  SELECT count(1)
    INTO lnSeqCount
    FROM user_sequences
    WHERE UPPER(sequence_name) = UPPER(isSeqName);
  -- if sequence not found, create it
  IF lnSeqCount = 0 THEN
    EXECUTE IMMEDIATE 'CREATE SEQUENCE ' || UPPER(isSeqName) || ' START WITH 1 MINVALUE 1 MAXVALUE 1000000000000000 INCREMENT BY 1 NOCYCLE CACHE 20 NOORDER';
  END IF;
END createSeqIfNotExists;

-- call method
BEGIN
  createSeqIfNotExists('MY_SEQUENCE_NAME');
END;
/
1