Procedure 내에서 DDL 실행
Oracle의 프로시저 내에서는 DDL문을 바로 실행 할 수 없다.
create or replace procedure UP_BAN_TEST is
begin
create table XTMP_DDL_TABLE (t_no number(10));
end;
위와 같은 프로시저를 생성하면, 컴파일 시 아래와 같은 오류가 발생한다. (Error: PLS-00103)
Oracle의 프로시저는 컴파일 시 문법적 오류를 확인하며 실행 계획을 미리 정하는데, DDL은 실제 런타임에만 실행이 가능하여 실행 계획을 미리 정할 수 없어 오류가 발생하게 된다.
동적 쿼리 실행
프로시저 내에서 DDL문을 실행하기 위해서는 동적쿼리를 실행하는 방식으로 작성하여 실행하도록한다.
주로 CTAS, CREATE, ALTER, TRUNCATE, DROP등의 명령어를 실행하기 위해 아래와같이 사용한다.
EXECUTE IMMEDIATE '[실행할 DML 문]';
위처럼 동적쿼리로 감싸서 실행하는 프로시저로 위의 예시 프로시저를 변경해보았다.
create or replace procedure UP_BAN_TEST is
begin
EXECUTE IMMEDIATE 'create table XTMP_DDL_TABLE (t_no number(10))';
end;
컴파일이 정상적으로 잘 되는것을 확인 할 수 있다.
반응형
'DATABASE > Oracle' 카테고리의 다른 글
[Oracle] 프로시저 내용 찾기 - 특정 테이블이 사용되는 프로시저 찾기 (0) | 2024.11.15 |
---|---|
[Oracle] DML Trigger - 테이블에서 사용하는 트리거 정리 (0) | 2024.11.11 |
[Oracle] 테이블 정의서 만들기 - 쿼리로 추출하기 (0) | 2024.04.02 |
[Oracle] External Table - 외부 CSV 파일을 테이블로 만들기 (0) | 2024.03.30 |
[Oracle] Table / Column Comment - 코멘트, 설명 달기 (0) | 2024.01.26 |
[Oracle] 11g 시퀀스 (Sequence) 컬럼 자동 증가 값 (1) | 2023.08.09 |
[DBA][Oracle] 자주 쓰는 쿼리 - TableSpace 용량 및 파일 위치 확인 (1) | 2023.08.08 |
[Oracle] 파티션(Partition) 2 - Range Partition, Interval Partition (2) | 2023.08.04 |