Oracle SQL开发人员:如何从触发器生成日志输出?

Oracle SQL开发人员:如何从触发器生成日志输出?,oracle,plsql,oracle-sqldeveloper,database-trigger,dbms-output,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 adde

我在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;
/
编译触发器时,它会显示在脚本输出中,但如果我在表中添加新行,则什么都没有。

很可能客户端(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中

希望对你有帮助

客户端(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中


希望对你有帮助

您缺少
将SERVEROUTPUT设置为ON
。SQLDeveloper也可以理解此命令

CREATE USER "TEST_SCHEMA" IDENTIFIED BY "TEST";
让我们在SQLDeveloper内部进行一个快速测试

CREATE USER "TEST_SCHEMA" IDENTIFIED BY "TEST";
已创建用户“TEST_SCHEMA”

格兰特成功了

表“TEST_SCHEMA”。“NAMES”已创建

触发器名称\u TRG\u 1已编译

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

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

已添加新行

如您所见,输出就在那里,它是在实际的行插入表之后插入的。很好

要清理testcase,请运行以下命令:

DROP USER "TEST_SCHEMA" CASCADE;

编辑1:

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

要打开DBMS捕获窗口,您需要单击
“查看”
菜单并选择
“DBMS输出”
选项

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

现在您可以看到输出


注意由于此处的输出不是“实时”的,因此只有在缓冲区刷新时,此窗口才会显示某些内容,并且不能手动/直接调用缓冲区刷新

您缺少
将SERVEROUTPUT设置为ON
。SQLDeveloper也可以理解此命令

CREATE USER "TEST_SCHEMA" IDENTIFIED BY "TEST";
让我们在SQLDeveloper内部进行一个快速测试

CREATE USER "TEST_SCHEMA" IDENTIFIED BY "TEST";
已创建用户“TEST_SCHEMA”

格兰特成功了

表“TEST_SCHEMA”。“NAMES”已创建

触发器名称\u TRG\u 1已编译

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

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

已添加新行

如您所见,输出就在那里,它是在实际的行插入表之后插入的。很好

要清理testcase,请运行以下命令:

DROP USER "TEST_SCHEMA" CASCADE;

编辑1:

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

要打开DBMS捕获窗口,您需要单击
“查看”
菜单并选择
“DBMS输出”
选项

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

现在您可以看到输出


注意由于此处的输出不是“实时”的,因此只有在缓冲区刷新时,此窗口才会显示某些内容,并且不能手动/直接调用缓冲区刷新

编译触发器时不会显示
dbms\u output.put\u line()
的输出,因为编译期间不会执行代码。编译它时,您到底看到了什么?要查看任何dbms_输出,必须在使用
dbms_输出的任何语句之前运行
setserveroutput on
。您在运行insert之前是否这样做过?是的,我以前这样做过。@Mira7触发器通常不用于显示任何消息。触发器是假定在基表上发生任何DML操作时发生的事件。不确定为什么要在触发器中写入
DBMS\u
。当你说“没有”是指
blablablatable
(插入目标)还是
blablabla2table
(触发器目标)?嗯,我的想象是,在添加行之后。触发器会将该行复制到其他表中,并写入控制台中的某些内容(用户信息)。编译触发器不会显示
dbms\u output.put\u line()
的输出,因为编译期间不会执行代码。编译它时,您到底看到了什么?要查看任何dbms_输出,必须在使用
dbms_输出的任何语句之前运行
setserveroutput on
。您在运行insert之前是否这样做过?是的,我以前这样做过。@Mira7触发器通常不用于显示任何消息。触发器是假定在基表上发生任何DML操作时发生的事件。不确定为什么要在触发器中写入
DBMS\u
。当你说“没有”是指
blablablatable
(插入目标)还是
blablabla2table
(触发器目标)?嗯,我的想象是,在添加行之后。触发器将把行复制到其他表中,并写入控制台(用户信息)。@APC“当我编译触发器时,它显示在脚本输出中”-显示什么?仍然认为这里最可能的问题是没有启用从输出缓冲区的读取。@APC:是的,正如Miroslav Duník在本例中所述,通过发出“set-serveroutput on”(设置服务器输出打开)来启用打印输出缓冲区,而Mira7说的是“W”