在oracle中触发器执行的奇怪问题

时间:2018-05-22 16:54:02

标签: oracle triggers

这是一个非常简单的触发器,正在执行但不打印简单消息:

CREATE OR REPLACE TRIGGER t_emp
AFTER INSERT OR DELETE OR UPDATE ON employee
FOR EACH ROW
ENABLE
DECLARE
    v_user VARCHAR2(20);
BEGIN
    SELECT user INTO v_user FROM DUAL;
    IF INSERTING THEN
        DBMS_OUTPUT.PUT_LINE('One row inserted by ' || v_user);
    ELSIF DELETING THEN
        DBMS_OUTPUT.PUT_LINE('One row deleted by ' || v_user);
    ELSIF UPDATING THEN 
        DBMS_OUTPUT.PUT_LINE('One row updated by ' || v_user);
    END IF;
END;
/

Table: 
CREATE TABLE employee
    (
        s_name varchar2(30)
    );

简单的测试用例:

INSERT INTO employee
VALUES('Kafka');

然而,虽然它被执行但不会产生任何消息。现在这里有趣的地方。如果我运行一个像

这样的测试匿名块
BEGIN
    DBMS_OUTPUT.PUT_LINE('One row inserted by ' );
end;
/

我得到了触发器的第一个打印输出(当我执行DML语句时应该打印),然后是当前消息(“一行插入”)。我测试了其他pl / sql块,它们执行得很好。这似乎只是触发器的问题(我也试过了其他几个)。可能是什么问题?
谢谢

1 个答案:

答案 0 :(得分:1)

从触发器打印是个糟糕的主意。无论如何你可以使用:

SET SERVEROUTPUT ON;
INSERT INTO employee(s_name) VALUES('Kafka');
COMMIT;