【发布时间】:2017-12-11 00:06:32
【问题描述】:
问题:在 SQL 触发器的输出中混淆(下面发布的代码)
SQL> insert into STUDENT VALUES('NAME');
Output:
<<Trigger Executed>>
1 row created.
为了便于阅读和理解,我创建了一个足够简单的触发器和一个表:
正在执行程序:[ORACLE 10g SQL 命令行]
SQL:> start F:/FILE.SQL
FILE.SQL 包含(以下代码):
set serveroutput ON;
-- <<DROPING ANY TABLE IF ALREADY EXIST>>
DROP TABLE STUDENT ;
CREATE TABLE STUDENT
(
sname varchar2(20)
)
/
CREATE OR REPLACE TRIGGER MYTRIGGER
AFTER INSERT ON STUDENT
FOR EACH ROW
BEGIN
dbms_output.put_line('<<Trigger Executed>> ');
END;
/
insert into STUDENT values('Myname');
问题:因为触发器在插入值后立即执行。所以,如果我正确理解了理论,输出应该是:
1 row created.
<<Trigger Executed.>>
而不是
<<Trigger Executed.>>
1 row created.
逻辑上是正确的。
尝试过:我在触发器声明中尝试了BEFORE 和AFTER 以获得所需的输出,但每次都得到相同的结果。
我知道触发器是如何工作的,我只是对执行顺序感到困惑。
【问题讨论】:
-
执行的输出结果取决于服务器,一切都发生在服务器中,然后将执行结果发送给客户端(在 I/U/D/S 的情况下。) .由于触发器是一个服务器事件,它在服务器向客户端发送受插入命令影响的行数之前输出 dbms_ouput,因此您看到的输出。
-
@JorgeCampos 来自其中一个答案,我理解了执行顺序,插入操作首先执行然后触发,最后 SQL 发送多少行受到影响,正如您在评论中提到的那样。非常感谢您对 Stack Overflow 的帮助。