1

我在 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;
/

当我编译触发器时,它会显示在脚本输出中,但如果我在表中添加新行,则什么也没有。

4

2 回答 2

4

你失踪了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;

在此处输入图像描述

编辑1:

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

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

DBMS 输出选项

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

DBMS 输出窗口

现在你可以看到输出了。

注意这里的输出不是“实时”的,这个窗口只有在有缓冲区刷新时才会显示一些东西,并且不能手动/直接调用缓冲区刷新。

于 2018-10-15T09:38:36.123 回答
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

希望能帮助到你...

于 2018-10-15T09:16:20.860 回答