Отбросить оператор внутри PL SQL - PullRequest
2 голосов
/ 02 августа 2011

нормально ли делать Drop внутри PL SQL.

что не так с этим SQL

Я пытаюсь удалить всех пользователей. Проблема в сбрасывании пользовательского имени пользователя в каскаде

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;

1 Ответ

7 голосов
/ 02 августа 2011

Вы можете использовать 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 (он выполняет коммит до и после), и поэтому вы не сможете откатить любые изменения.

...