문제

Oracle Shell에서 다음을 실행하면 잘 작동합니다.

truncate table table_name

하지만 저장된 절차에 넣으려고 할 때

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

실패합니다

ERROR line 3, col 14, ending_line 3, ending_col 18, Found 'table', Expecting:  @   ROW  or   (   or   .   or   ;   :=

왜요?

도움이 되었습니까?

해결책

Oracle PL/SQL의 모든 DDL 문은 명세서 전에 즉시 실행해야합니다. 따라서 사용해야합니다.

execute immediate 'truncate table schema.tablename';

다른 팁

즉시 실행할 수있을뿐만 아니라 사용할 수 있습니다

DBMS_UTILITY.EXEC_DDL_STATEMENT('TRUNCATE TABLE tablename;');

저장된 Proc가 DDL을 실행하고 DDL의 일부 인스턴스가 저장된 Proc를 무효화 할 수 있기 때문에이 명령문은 실패합니다. execute ormer victiate 또는 exec_ddl 접근법을 사용하여 DDL은 비교되지 않은 코드를 통해 구현됩니다.

이 작업을 수행 할 때 DDL이 실행 전후에 암시 적 커밋을 발행한다는 사실을 찾아야합니다.

아래 코드를 사용해보십시오

execute immediate 'truncate table tablename' ;

PL/SQL은 늦은 바인딩을 직접 지원하지 않기 때문에 PL/SQL 블록에서 DML에 대해 DDL 문을 직접 실행할 수는 없다는 것을 알아야합니다. 따라서 이러한 유형의 문제를 극복하기 위해 Oracle은 DDL 문을 실행하는 데 사용할 수있는 동적 SQL 접근법을 제공했습니다. 동적 SQL 접근 방식은 런타임에 SQL 문자열의 구문 분석 및 바인딩에 관한 것입니다. 또한 DDL 명령문은 기본적으로 자동 커밋임을 기억해야하므로 DML (TCL을 사용하여 명시 적으로 사용 해야하는 경우)이있는 경우 동적 SQL 접근 방식을 사용하여 DDL 문에주의를 기울여야합니다. 저장된 Proc/Function.

다음 동적 SQL 접근 방식을 사용하여 PL/SQL 블록에서 DDL 문을 실행할 수 있습니다.

1) 즉시 실행하십시오

2) DBMS_SQL 패키지

3) dbms_utility.exec_ddl_statement (varchar2의 parse_string);

이것이 설명으로 귀하의 질문에 답변하기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top