【问题标题】:Drop Statement inside a PL SQLPL SQL 中的删除语句
【发布时间】:2023-03-30 21:29:01
【问题描述】:

是否可以在 PL SQL 中执行 Drop。

这个 SQL 有什么问题

我正在尝试删除所有用户。 问题出在 drop user username cascase 语句中

connect sys/abcsds@1.1.1.1 as sysdba
exec dbms_output.enable(1000000);
set serveroutput on
DECLARE
BEGIN
for rec in (select username from dba_users where username LIKE 'S%' AND username NOT LIKE 'SY%') loop
dbms_output.put_line(to_char(rec.username));
dbms_sql.execute('drop user rec.username cascade');
end loop;
END;
.
run;
exit;

【问题讨论】:

  • 你知道有多少默认的Oracle用户吗?它不仅仅是 SYS 和 SYSTEM。你真的,真的,真的不想在你关心的数据库上运行这段代码。
  • @APC 我检查了用户名,他们很好

标签: oracle stored-procedures plsql ddl


【解决方案1】:

您可以在循环中使用 DDL,但您必须构建字符串,因为您无法绑定对象名称。

例如:

DECLARE
   l_ddl VARCHAR2(1000);
BEGIN
   FOR rec IN (SELECT username
                 FROM dba_users
                WHERE username LIKE 'S%'
                  AND username NOT LIKE 'SY%') LOOP
      l_ddl := 'drop user '|| rec.username ||' cascade';
      dbms_output.put_line(l_ddl);
      EXECUTE IMMEDIATE (l_ddl);
   END LOOP;
END;

但请注意,DDL 在 Oracle 中不是事务性的(它在之前和之后执行提交),因此您将无法回滚任何更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多