PL/SQL:如何启用模式中的所有触发器?
Posted
技术标签:
【中文标题】PL/SQL:如何启用模式中的所有触发器?【英文标题】:PL/SQL: How to enable all triggers in the schema? 【发布时间】:2019-11-15 22:47:06 【问题描述】:我正在尝试创建一个使用游标的过程,该游标可以启用我的架构中的所有触发器。但是,我在第 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;
【问题讨论】:
显式游标不能包含 'INTO' 子句 - 这就是你得到 sql 语句被忽略问题的原因。 【参考方案1】:你不需要那么多代码:
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>
【讨论】:
我现在看到了我的错误。谢谢。以上是关于PL/SQL:如何启用模式中的所有触发器?的主要内容,如果未能解决你的问题,请参考以下文章