2012-02-18 119 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 2012-02-18 09:06:37

+0

我輸入的用戶名有14個表。我自己創建了它們,表格中有數據。 – ReiRei 2012-02-18 17:06:43

回答

1

您可能需要指定在DROP聲明表的所有者:

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 2012-02-19 19:30:26

0

該代碼看起來不錯。

您可以用()嘗試這樣

BEGIN 

EXECUTE IMMEDIATE (code_text); 

END; 

你可以嘗試

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

DECLARE * 錯誤在第1行: ORA-00942:表或視圖不存在 ORA-06512:在第9行 仍然是同樣的錯誤。 – ReiRei 2012-02-18 02:31:59