PL / SQL 블록에 직접 ddl 문을 쓸 수없는 이유


11

PL / SQL 블록에 직접 ddl 문을 쓸 수없는 이유는 무엇입니까?

CREATE OR REPLACE PROCEDURE test IS
BEGIN
    truncate table table_name; // error
END test;
/

그러나,

CREATE OR REPLACE PROCEDURE test IS
BEGIN
    execute immediate 'truncate table table_name'; // works fine
END test;
/

왜 두 번째가 성공적으로 실행 되었습니까?


답변:


7

설명서 에 나와 있듯이 :

동적 SQL만이 PL / SQL 프로그램 단위 내에서 다음 유형의 명령문을 실행할 수 있습니다.

  • CREATE, DROP, GRANT 및 REVOKE와 같은 DDL (데이터 정의 언어) 문

TRUNCATE작업이다 DDL.

를 사용할 때 실행 EXECUTE IMMEDIATE하는 모든 DDL작업은 암시 적 COMMIT으로 현재 트랜잭션이됩니다.


1

PL / SQL 코드 내의 DDL은 실제 필요보다 더 예외입니다. 구문 분석은 구조 확인으로 볼 수 있으며, 실행시 구조가 변경되면 손실됩니다. 프로시 저는 다른 오브젝트 (테이블 또는 기타 pl / sql 코드, 뷰 등)를 다시 구문 분석하기위한 것입니다. 객체가 변경 될 때마다 다시 컴파일해야합니다. 따라서 변경 구조가 아닌 구문 분석 된 코드를 만드는 것은 확인할 수 없으며 컴파일 된 것입니다. 사례를 고려

DROP TABLE T1;

구문 분석 시간 동안 테이블이 발견되고 프로 시저가 성공적으로 컴파일되었지만 첫 번째 실행에서 테이블이 삭제되고 코드가 더 이상 유효하지 않습니다 (다음 번 DROP TABLE에서 오류가 발생 함). 마찬가지로 테이블 DDL을 변경하면 다시 컴파일해야하므로 코드 구문 분석의 이점을 잃게됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.