Plsql 触发器已成功编译,但仍未按要求触发

Plsql 触发器已成功编译,但仍未按要求触发,plsql,oracle-sqldeveloper,database-trigger,Plsql,Oracle Sqldeveloper,Database Trigger,以下是我的简单PL/SQL代码,用于演示 create table cust(cname varchar(10)); set SERVEROUTPUT ON; create or replace trigger tgr before insert on cust for each row enable begin dbms_output.put_line('Trigger hit on insert'); end; / insert into cust values('John'); 输出:/

以下是我的简单PL/SQL代码,用于演示

create table cust(cname varchar(10));
set SERVEROUTPUT ON;
create or replace trigger tgr
before insert on cust
for each row
enable
begin
dbms_output.put_line('Trigger hit on insert');
end;
/
insert into cust values('John');
输出:/

Table CUST created
Trigger TGR compiled
1 row inserted // *EXPECTING* Trigger hit on insert

不要使用
DBMS\u输出。将\u行
放在
触发器
内,以检查它是否被触发。某些IDE(如
sqldeveloper
)可能不会输出消息,即使您使用
SET SERVEROUTPUT ON

但是,它可以在
sqlplus
上工作。当我尝试时,它确实在sqlplus中显示了消息。因此,这不是数据库或触发器的问题

SQL> insert into cust values('John');
Trigger hit on insert
如果在事务上发出
commit
rollback
,则消息可能会出现在
sqldeveloper

我建议,如果您可以创建一个日志表并尝试向其中插入记录,而不是使用
dbms\u输出
,则效果更好

begin
INSERT INTO LOG_TABLE ( log_date,log_message) VALUES  (SYSDATE,'Trigger hit on insert');
end;
/

不要使用
DBMS\u输出。将\u行
放在
触发器
内,以检查它是否被触发。某些IDE(如
sqldeveloper
)可能不会输出消息,即使您使用
SET SERVEROUTPUT ON

但是,它可以在
sqlplus
上工作。当我尝试时,它确实在sqlplus中显示了消息。因此,这不是数据库或触发器的问题

SQL> insert into cust values('John');
Trigger hit on insert
如果在事务上发出
commit
rollback
,则消息可能会出现在
sqldeveloper

我建议,如果您可以创建一个日志表并尝试向其中插入记录,而不是使用
dbms\u输出
,则效果更好

begin
INSERT INTO LOG_TABLE ( log_date,log_message) VALUES  (SYSDATE,'Trigger hit on insert');
end;
/

您不能使用DBMS\u输出。PUT\u LINE,因为在表中插入数据时,没有显示触发器执行情况的提示或屏幕。这同样适用于过程、函数和触发器

不要在表中使用commit。它将抛出一个异常。如果您想使用commit,那么将触发器设置为pragma autonomous\u事务(我建议不要使用commit,它将自动提交)

还要确保不要修改触发器中的同一个表。它还将为数据的变异引发异常

示例代码

create table cust(cname varchar(10));
create table log(log varchar(10));
create or replace trigger tgr
before insert on cust
for each row
enable
begin
insert into log values('test');
end; 
/

您不能使用DBMS\u输出。PUT\u LINE,因为在表中插入数据时,没有显示触发器执行情况的提示或屏幕。这同样适用于过程、函数和触发器

不要在表中使用commit。它将抛出一个异常。如果您想使用commit,那么将触发器设置为pragma autonomous\u事务(我建议不要使用commit,它将自动提交)

还要确保不要修改触发器中的同一个表。它还将为数据的变异引发异常

示例代码

create table cust(cname varchar(10));
create table log(log varchar(10));
create or replace trigger tgr
before insert on cust
for each row
enable
begin
insert into log values('test');
end; 
/


对于每一行启用begin
-->remove
enable
,这在语法上是错误的,无法编译,只是对于每一行begin。此处不允许使用关键字
enable
,请检查。提示:当
create trigger
命令没有显示任何错误时,这并不意味着触发器已经编译好。请使用
show errors
命令查看编译错误。通过删除enable..Compiled fine但仍不工作尝试运行
commit
并显示消息。no尚未显示。我把commit放在触发器之后,因为它不起作用,我把commit放在insert语句之后。第一个抛出了一个错误,第二个显示norhingYou无法在触发器中添加commit。@krokodilko的意思是在您完成insert语句后运行commit。
对于每一行enable begin
-->remove
enable
,这在语法上是错误的,无法编译,只是对于每一行begin。此处不允许使用关键字
enable
,请检查。提示:当
create trigger
命令没有显示任何错误时,这并不意味着触发器已经编译好。请使用
show errors
命令查看编译错误。通过删除enable..Compiled fine但仍不工作尝试运行
commit
并显示消息。no尚未显示。我把commit放在触发器之后,因为它不起作用,我把commit放在insert语句之后。第一个抛出了一个错误,第二个显示norhingYou无法在触发器中添加commit。@krokodilko的意思是在完成insert语句后运行commit。意思是:触发器TGR已编译,检查编译器日志您是否创建了
LOG\u表
。我只是给你举了一个例子。我不知道如何创建日志表,因为我是新来的。请帮我弄清楚,或者建议关于“如何创建日志文件”的任何资源链接创建表日志表(日志日期,日志消息varchar2(100));说:Trigger TGR compiled,check compiler LOG你创建了
LOG\u表了吗。我只是给你举了一个例子。我不知道如何创建日志表,因为我是新来的。请帮我弄清楚,或者建议关于“如何创建日志文件”的任何资源链接创建表日志表(日志日期,日志消息varchar2(100));那是救命的办法。非常感谢你,这是救命的办法。多谢各位