PL/SQL 触发器不显示?

Posted

技术标签:

【中文标题】PL/SQL 触发器不显示?【英文标题】:PL/SQL Trigger not displaying? 【发布时间】:2018-05-02 12:01:56 【问题描述】:

所以我试图测试的简单代码是这样的:

set serveroutput on;

CREATE OR REPLACE TRIGGER dml_stud
   BEFORE INSERT OR UPDATE OR DELETE ON studenti
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;

这是我得到的输出:

Trigger DML_STUD compiled


0 rows deleted.

“删除”文本不应该在“0 行已删除”文本之前或之后的某处吗?

我使用的是最新版本的 Oracle SQL Developer,如果这有什么不同的话。

【问题讨论】:

【参考方案1】:

我认为您在错误的位置检查输出。

转到查看-> Dbms 输出

【讨论】:

【参考方案2】:

您的代码没有问题,除了表名的拼写错误应为students 而不是studenti。你可以用这个:

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');
  END CASE;
END;

【讨论】:

【参考方案3】:

如果您从当前使用的 GUI 切换到良好的旧 SQL*Plus,您会注意到一切都按预期工作:

SQL> create table students as select * from emp;

Table created.

SQL> create or replace trigger dml_stud
  2     before insert or update or delete on students
  3  begin
  4    dbms_output.put_line('DML change in table students !');
  5
  6    case
  7       when inserting then dbms_output.put_line('INSERT');
  8       when deleting  then dbms_output.put_line('DELETE');
  9       when updating  then dbms_output.put_line('UPDATE');
 10    end case;
 11  end;
 12  /

Trigger created.

SQL> delete from students where ename = 'KING';
DML change in table students !
DELETE

1 row deleted.

SQL>

【讨论】:

以上是关于PL/SQL 触发器不显示?的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 触发器 - 触发问题 3

为啥不允许在 PL/SQL 触发器中使用 ROLLBACK 语句,但 RAISE_APPLICATION_ERROR 是?

什么是PL/SQL

Oracle笔记4-pl/sql-分支/循环/游标/异常/存储/调用/触发器

PL/SQL 触发器在插入语句之前检查值

条件 old 不等于 new 的 Oracle 触发器以错误 PLS-00049、PL/SQL: ORA-00933 结束