2014-12-02 11 views
2

하나의 스키마에서 테이블의 모든 데이터를 삭제하는 프로 시저를 작성해야합니다. 나는 그와 비슷한 것을 시도한다LOOP (스키마의 모든 테이블을 자르는 프로 시저)에서 PL/SQL EXECUTE IMMEDIATE

CREATE OR REPLACE PROCEDURE CLEAR_ALL 
IS 
    sql_truncate VARCHAR2(50); 

    cursor c1 is 
    SELECT table_name 
    FROM all_tables 
    WHERE owner = 'KARCHUDZ_S'; 
BEGIN 
    sql_truncate := 'TRUNCATE TABLE :text_string'; 
    FOR table_name in c1 
    LOOP 
     EXECUTE IMMEDIATE sql_truncate USING table_name; 
    END LOOP; 
END CLEAR_ALL; 

그러나 그것은 이해할 수없는 두 가지 오류를 준다.

오류 (13,7) : PL/SQL : 문 무시

오류 (13,44)는 : PLS-00457 : 한 Statment는 SQL <의 유형이어야합니다 - (이 오류 나는에 있었다 내가 폴란드어 랭이 대학 오라클 11g 기반)

답변

4

당신은 객체 이름에 대한 자리 표시로 바인드 변수 (예 : 사용자의 using 절)를 사용할 수 없습니다를 사용하는 원인, 번역합니다. 가능한 경우 동적 SQL을 사용할 필요가 없습니다. 대신 연결 또는 대체를 사용해야합니다.

CREATE OR REPLACE PROCEDURE CLEAR_ALL 
IS 
    sql_truncate CONSTANT VARCHAR2(50) := 'TRUNCATE TABLE [text_string]'; 

    cursor c1 is 
    SELECT table_name 
    FROM all_tables 
    WHERE owner = 'KARCHUDZ_S'; 
BEGIN 
    FOR row in c1 
    LOOP 
     EXECUTE IMMEDIATE replace(sql_truncate, '[text_string]', row.table_name); 
    END LOOP; 
END CLEAR_ALL; 
+0

고마워요! 이것은 잘 작동합니다! –

6

왜 성명을 생성하고 다음과 같이 호출해야합니까?

CREATE OR REPLACE PROCEDURE CLEAR_ALL 
IS 
    vs_statement VARCHAR2(100); 

    cursor c1 is 
    SELECT table_name 
    FROM all_tables 
    WHERE owner = 'KARCHUDZ_S'; 
BEGIN 
    FOR table_rec in c1 
    LOOP 
     vs_statement := 'TRUNCATE TABLE ' || table_rec.table_name; 
     EXECUTE IMMEDIATE vs_statement; 
    END LOOP; 
END CLEAR_ALL;