PL/SQL触发器无输出?测试代码执行后未显示触发信息
触发器未输出预期DBMS_OUTPUT信息的排查与解决
我来帮你梳理下这个问题的核心原因和解决办法:
1. 最关键的错误:触发器绑定表与操作表不匹配
你创建触发器时指定的表是studenti:
CREATE OR REPLACE TRIGGER dml_stud BEFORE INSERT OR UPDATE OR DELETE ON studenti
但执行删除操作的表是students:
delete from students where id=10000;
两个表名拼写不一致(studenti vs students),导致触发器根本不会被触发,自然不会输出任何DBMS_OUTPUT的内容!
2. 修正步骤
先统一表名,再确保服务器输出配置正确:
第一步:修正触发器的表名(或删除语句的表名)
以下是修正后的完整代码,把触发器绑定到students表:
-- 开启服务器输出并设置足够大的缓冲区,避免内容截断 set serveroutput on size unlimited; CREATE OR REPLACE TRIGGER dml_stud BEFORE INSERT OR UPDATE OR DELETE ON students BEGIN dbms_output.put_line('DML change in table students !'); CASE WHEN INSERTING THEN DBMS_OUTPUT.PUT_LINE('INSERT'); WHEN DELETING THEN DBMS_OUTPUT.PUT_LINE('DELETE'); WHEN UPDATING THEN DBMS_OUTPUT.PUT_LINE('UPDATE'); -- WHEN UPDATING('NAME') THEN .... END CASE; END; / -- 执行删除操作,此时触发器会正常触发 delete from students where id=10000;
第二步:确保执行环境的输出设置正确
- 如果用SQL*Plus:执行
set serveroutput on size unlimited;后,在同一个会话里执行删除操作,就能看到完整的输出内容。 - 如果用SQL Developer:除了执行
set serveroutput on;,还要打开顶部菜单的View > DBMS Output面板,点击面板上的加号选择当前连接的会话,这样输出才会显示在面板中。
3. 关于你看到的“Trigg...”
这个只是SQL*Plus对触发器创建成功的提示(完整内容应该是Trigger created.)被截断了,并不是触发器的输出内容——因为之前触发器根本没触发,所以不会产生DBMS_OUTPUT的信息。
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

