PL/SQL:如何启用模式中的所有触发器?

0 oracle plsql database-cursor

我正在尝试创建一个使用游标的过程,该游标可以启用我的架构中的所有触发器。但是,我在第 16 行收到此错误:PL/SQL: SQL 语句被忽略,这是我使用 fetch 的行。

   CREATE OR REPLACE PROCEDURE enable_trigg_proc
   IS
    v_trigger_name trigger_name.user_triggers%TYPE;

    CURSOR enable_trigg_cur
    IS
    SELECT TRIGGER_NAME INTO v_trigger_name
    FROM user_triggers
    WHERE STATUS = 'DISABLED';


    BEGIN
     OPEN enable_trigg_cur;
    LOOP
     FETCH enable_trigg_cur INTO v_trigger_name ;
      EXIT WHEN enable_trigg_cur%NOTFOUND;

EXECUTE IMMEDIATE  'ALTER TRIGGER v_trigger_name  ENABLE';
    END LOOP;
  close enable_trigg_cur;
END;
Run Code Online (Sandbox Code Playgroud)

Lit*_*oot 5

你不需要那么多代码:

SQL> begin
  2    for cur_r in (select trigger_name from user_triggers) loop
  3      execute immediate 'alter trigger ' || cur_r.trigger_name || ' enable';
  4    end loop;
  5  end;
  6  /

PL/SQL procedure successfully completed.

SQL>
Run Code Online (Sandbox Code Playgroud)

你的代码有什么问题吗?INTO在 PL/SQLSELECT语句中是必需的,但在游标声明中不需要。另外,您以错误的方式声明了变量;应该

SQL> CREATE OR REPLACE PROCEDURE enable_trigg_proc
  2  IS
  3      CURSOR enable_trigg_cur
  4      IS
  5      SELECT TRIGGER_NAME
  6      FROM user_triggers
  7      WHERE STATUS = 'DISABLED';
  8
  9      v_trigger_name user_triggers.trigger_name%TYPE;
 10  BEGIN
 11      OPEN enable_trigg_cur;
 12      LOOP
 13        FETCH enable_trigg_cur INTO v_trigger_name ;
 14        EXIT WHEN enable_trigg_cur%NOTFOUND;
 15
 16        EXECUTE IMMEDIATE  'ALTER TRIGGER ' || v_trigger_name || ' ENABLE';
 17      END LOOP;
 18      close enable_trigg_cur;
 19  END;
 20  /

Procedure created.

SQL> exec enable_trigg_proc;

PL/SQL procedure successfully completed.

SQL>
Run Code Online (Sandbox Code Playgroud)