2012-02-18 5 views
0
ACCEPT p_username PROMPT 'Enter Username : ' 
ACCEPT p_password PROMPT 'Enter New Password for Username : ' 
VARIABLE g_output VARCHAR2(4000) 
DECLARE 
    CURSOR NAME IS SELECT TABLE_NAME FROM DBA_TABLES 
     WHERE OWNER LIKE '%&p_username%'; 
    DDL_DROP VARCHAR2(200); 
BEGIN 
    FOR TNAME IN NAME 
    LOOP 
     BEGIN 
      EXECUTE IMMEDIATE 'DROP TABLE' || ' ' || TNAME.TABLE_NAME; 
     :g_output := :g_output || ' ' || TNAME.TABLE_NAME; 
     END; 
    END LOOP; 
END; 
/
PRINT g_output 

안녕하세요, 저는 PL/SQL을 처음 사용하고 사용자 테이블을 삭제하고 궁극적으로 테이블 삭제 후 스크립트를 변경하려고합니다. EXECUTE IMMEDIATE 명령에 문제가 있습니다. EXECUTE IMMEDIATE 행을 제거하면 스크립트가 작동합니다. 루프 내에서 테이블 이름을 인쇄하여 테스트 한 결과 올바른 테이블 수와 해당 이름을 얻을 수있었습니다.PL/SQL DDL 즉시 실행

감사합니다. 감사합니다.

제안 사항을 반영하도록 코드를 편집했지만 여전히 작동하지 않습니다. 같은 오류가 발생했습니다.

ACCEPT p_username PROMPT 'Enter Username : ' 
ACCEPT p_password PROMPT 'Enter New Password for Username : ' 
VARIABLE g_output VARCHAR2(4000) 
DECLARE 
    NAME SYS_REFCURSOR; 
    DDL_WORD VARCHAR2(200); 
BEGIN 
    OPEN NAME FOR SELECT TABLE_NAME FROM DBA_TABLES 
     WHERE OWNER LIKE '%&p_username%'; 
    LOOP 
     FETCH NAME INTO DDL_WORD; 
     EXIT WHEN NAME%NOTFOUND; 
     EXECUTE IMMEDIATE 'DROP TABLE "' || DDL_WORD || '" CASCADE CONSTRAINTS'; 
     :g_output := :g_output || ' ' || DDL_WORD; 
    END LOOP; 
    CLOSE NAME; 
END; 
/
PRINT g_output 
+0

데이터 사전의 모든 것은 대문자입니다. '% '와 같은 소유자를 가져야합니다. || 위 (p_username) || '%''. 실제로 사용자 당 하나의 테이블이 있습니까? – Ben

+0

14 개의 테이블이있는 사용자 이름을 입력하고 있습니다. 나는 그들 자신을 만들었고 테이블에는 데이터가있다. – ReiRei

답변

1

시도 할 수이

BEGIN 

EXECUTE IMMEDIATE (code_text); 

END; 

등) (로 시도해 볼 수도 있습니다 :

ACCEPT p_username PROMPT 'Enter Username : ' 
ACCEPT p_password PROMPT 'Enter New Password for Username : ' 
VARIABLE g_output VARCHAR2(4000) 
DECLARE 
    CURSOR NAME IS SELECT OWNER, TABLE_NAME FROM DBA_TABLES 
     WHERE OWNER LIKE '%&p_username%'; 
    DDL_DROP VARCHAR2(200); 
BEGIN 
    FOR TNAME IN NAME 
    LOOP 
     BEGIN 
      EXECUTE IMMEDIATE 'DROP TABLE' || ' ' || TNAME.OWNER || '.' || TNAME.TABLE_NAME; 
     :g_output := :g_output || ' ' || TNAME.OWNER || '.' || TNAME.TABLE_NAME; 
     END; 
    END LOOP; 
END; 
/
PRINT g_output 
+0

이 스크립트가 작동하지만 스크립트를 실행할 때 새로운 오류가 발생합니다. ORA-25153 : 임시 테이블 공간이 비어 있습니다. – ReiRei

0

코드가 정상적으로 보입니다.

당신은 당신이 아마 DROP 문에서 테이블의 소유자를 지정해야합니다

c SYS_REFCURSOR; 
BEGIN 
    OPEN c FOR 'SELECT * FROM table'; 
    CLOSE c; 
END; 
+0

라인 1에서 * 오류를 선언 ORA-00942 : 테이블 또는 뷰 ORA-06512 존재하지 않는다 : 또 라인 9 같은 오류에. – ReiRei