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
'programing' 카테고리의 다른 글
| Trusted_Connection=true 및 SQL Server 인증을 사용하는 경우 성능에 영향을 미칩니까? (0) | 2023.06.17 |
|---|---|
| "IN" 연산자가 오라클에서 LIKE 와일드카드(%)를 사용할 수 있습니까? (0) | 2023.06.17 |
| 각도 라이브러리 모듈이 추상 클래스를 사용하여 서비스 주입 (0) | 2023.06.17 |
| 로컬 보석을 설치하려면 어떻게 해야 합니까? (0) | 2023.06.17 |
| Oracle SQL - NULL 값이 있는 max() (0) | 2023.06.17 |