PL/SQL DDL 立即执行
Posted
技术标签:
【中文标题】PL/SQL DDL 立即执行【英文标题】:PL/SQL DDL Execute Immediate 【发布时间】: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 个表的用户名。我自己创建了它们,表格中有数据。
【参考方案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
【讨论】:
这个可行,但有时当我运行脚本时,它会给出一个新错误 ORA-25153: Temporary Tablespace is Empty【参考方案2】:代码看起来不错。
你可以试试这样的 ()
BEGIN
EXECUTE IMMEDIATE (code_text);
END;
你可以试试
c SYS_REFCURSOR;
BEGIN
OPEN c FOR 'SELECT * FROM table';
CLOSE c;
END;
【讨论】:
DECLARE * ERROR at line 1: ORA-00942: table or view does not exist ORA-06512: at line 9 还是同样的错误。以上是关于PL/SQL DDL 立即执行的主要内容,如果未能解决你的问题,请参考以下文章