【发布时间】:2012-02-18 02:13:14
【问题描述】:
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 行,该脚本将起作用。我通过在循环中打印表名对其进行了测试,得到了正确的表数及其对应的名称。
感谢您的帮助。
编辑了代码以反映建议,但仍然无法正常工作。得到同样的错误。
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
【问题讨论】:
-
数据字典中的所有内容都是大写的。您需要拥有
owner like '%' || upper(p_username) || '%'。你真的每个用户只有一张桌子吗? -
我正在输入一个包含 14 个表的用户名。我自己创建了它们,表格中有数据。
标签: plsql