SQL开发人员:如何使触发器输出日志?

时间:2018-10-15 08:39:49

标签: oracle plsql oracle-sqldeveloper database-trigger dbms-output

我已经在SQL中触发了一个触发器,需要他在表中插入新行之后编写输出。请参见示例:

CREATE OR REPLACE TRIGGER GAS_CODES AFTER
  INSERT ON blablatable
FOR EACH ROW

BEGIN 
insert into blabla2table (...,...,...,...)
values (:new...,...,...,..);
---output:
dbms_output.put_line('New row has been added.');
END;
/

编译触发器时,它会显示在脚本输出中,但是如果我在表中添加新行,则一无所获。

2 个答案:

答案 0 :(得分:3)

您缺少SET SERVEROUTPUT ON。 SQLDeveloper也可以理解此命令。

让我们在SQLDeveloper中进行快速测试。

CREATE USER "TEST_SCHEMA" IDENTIFIED BY "TEST";
  

已创建用户“ TEST_SCHEMA”。

GRANT UNLIMITED TABLESPACE TO "TEST_SCHEMA";
  

授予成功。

CREATE TABLE "TEST_SCHEMA"."NAMES" ("ID" NUMBER, "NAME" VARCHAR2(25), PRIMARY KEY("ID")); 
  

表“ TEST_SCHEMA”。创建了“ NAMES”。

CREATE OR REPLACE TRIGGER "TEST_SCHEMA"."NAMES_TRG_1" AFTER
  INSERT ON "TEST_SCHEMA"."NAMES"
  FOR EACH ROW
  BEGIN
    DBMS_OUTPUT.PUT_LINE('New row has been added.');
  END;
/
  

已编译触发器NAMES_TRG_1

SET SERVEROUTPUT ON

此命令在SQL Developer中不会打印任何内容。不用担心。

INSERT INTO "TEST_SCHEMA"."NAMES" VALUES (1, 'Mark Smith');
  

已插入1行。

     

已添加新行。

如您所见,输出在那里,并且在将实际行插入表中之后将其插入。效果很好。

要清除测试用例,请运行以下命令:

DROP USER "TEST_SCHEMA" CASCADE;

enter image description here

编辑1:

使用表数据编辑器时,其行为有所不同。表数据编辑器具有自己的Oracle会话,并且具有捕获DBMS输出的不同方法。

要打开DBMS捕获窗口,需要单击"VIEW"菜单并选择"DBMS Output"选项。

DBMS Output option

然后单击绿色的加号按钮并设置要捕获的数据库。

DBMS Output window

现在您可以看到输出。

请注意,因为此处的输出不是“实时”,所以此窗口仅在存在缓冲区刷新时才会显示某些内容,并且不能手动/直接调用缓冲区刷新。

答案 1 :(得分:0)

客户端(SQLDeveloper)最有可能不读取输出缓冲区。 要启用此功能,必须从菜单“视图”->“ dbms输出”中进行选择,然后在dbms输出窗口中单击绿色的“ +”以读取连接的输出缓冲区...

在sqlplus中,您可以这样操作:

SQL> drop table tst purge; 

Table dropped.

SQL> drop table tst2 purge; 

Table dropped.

SQL> create table tst ( tst_no integer); 

Table created.

SQL> create table tst2 ( tst_no integer); 

Table created.

SQL> create or replace trigger tst_trg after insert on tst 
for each row 
begin
insert into tst2 (tst_no) values (:new.tst_no); 
dbms_output.put_line('new row with tst_no='|| :new.tst_no); 
end; 
/  2    3    4    5    6    7  

Trigger created.

SQL> set serveroutput on; 
exec dbms_output.enable; 

insert into tst values (1); SQL> 
PL/SQL procedure successfully completed.

SQL> SQL> 
new row with tst_no=1

1 row created.

SQL> r
  1* insert into tst values (1)
new row with tst_no=1

1 row created.

SQL> select * from tst2; 

    TST_NO
----------
     1
     1

SQL> 

您可以看到在sqlplus中读取并打印了输出,并将行插入了目标表tst2

希望有帮助...