Oracle SQL开发人员:如何从触发器生成日志输出?
我在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
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”