PL/SQL - 使用参数和 if/then 语句执行立即循环

PL/SQL - Execute immediate loop using parameter and if/then statement

在 shell 脚本中,我使用 pl/sql 块通过 $USER 参数删除某些用户。如果另一个参数 ${DROP_AB} 是 Y,则从游标中删除所有用户。如果传递的参数是 N,如何删除除一个特定用户 ${USER}AB 之外的所有用户?请参阅下文并提供建议:

BEGIN
DECLARE
  CURSOR c1 IS
    SELECT username FROM dba_users WHERE username LIKE '${USER}%';
BEGIN
  FOR user_rec IN c1
    IF ${DROP_AB}='Y' THEN
      LOOP
        EXECUTE IMMEDIATE 'DROP USER ' ||user_rec.username|| ' CASCADE';
    ELSIF ${DROP_AB}='N' THEN
      LOOP
        --DROP ALL USERS EXCEPT FOR USER '${USER}AB'
   END LOOP;
END;
END;
/

未经测试的代码,但下面的内容应该可以工作,但正如上面评论中所建议的那样,这将在系统模式/用户上出错。

BEGIN
DECLARE
  CURSOR c1 IS
    SELECT username FROM dba_users WHERE username LIKE '${USER}%';
BEGIN
  FOR user_rec IN c1 loop
    IF ${DROP_AB}='Y' THEN
        EXECUTE IMMEDIATE 'DROP USER ' ||user_rec.username|| ' CASCADE';
    ELSE
        IF user_rec.username != ${USER}AB THEN
          EXECUTE IMMEDIATE 'DROP USER ' ||user_rec.username|| ' CASCADE';
        END IF;
    END IF;  
   END LOOP;
END;
END;
/