2012-02-18 95 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