programing

Oracle SQL에 "존재하지 않는 경우 create sequence..."와 같은 것이 있습니까?

minimums 2023. 6. 17. 08:55
반응형

Oracle SQL에 "존재하지 않는 경우 create sequence..."와 같은 것이 있습니까?

Oracle 8 DB를 사용하는 애플리케이션의 경우 SQL*Plus에 복사하여 붙여넣을 수 있는 트리거, 시퀀스 등을 설정하는 SQL 스크립트를 제공합니다.내가 만들려는 시퀀스가 이미 존재하는 경우 스크립트가 오류와 함께 중지되지 않았으면 합니다.트리거의 경우 "create or replace trigger..."를 사용하여 쉽게 이 작업을 수행할 수 있지만 시퀀스의 경우에는 작동하지 않습니다.또한 "만약 내 시퀀스가 존재하지 않는다면 시퀀스를 생성하세요..."를 시도했지만 역시 그렇지 않았습니다.다른 대안이 있습니까?

또는 이것이 불가능한 경우 SQL*Plus가 스크립트를 중단하지 않고 "drop sequence mysequence"를 수행할 수 있는 방법이 있습니까?

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;

스크립트가 항상 SQL*Plus에서 실행되는 것이 확실하다면 CREATE SEQUENCE 문에 오류 발생 시 계속하라는 지시문을 괄호로 묶을 수 있습니다.

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

시퀀스 생성 문에 다른 오류(권한 문제, 구문 오류 등)가 있을 경우 무시됩니다.

좋아요:

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;
/

확인할 수 있습니다.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;

다른 모든 옵션을 매개 변수화할 수 있으며 시퀀스를 생성할 수 있는 정교한 기능이 있습니다.

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;
/

언급URL : https://stackoverflow.com/questions/2618179/is-there-something-like-if-not-exist-create-sequence-in-oracle-sql

반응형