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

PL/SQL: How to enable all triggers in the schema?

我正在尝试制作一个使用游标的过程,该游标使我的架构中的所有触发器都处于启用状态。但是,我在第 16 行收到此错误:PL/SQL: SQL Statement ignored 这是我使用 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;

您不需要那么多代码:

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>

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

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>