Разработчик SQL: Как сделать вывод журнала из триггера? - PullRequest
0 голосов
/ 15 октября 2018

Я сделал триггер в 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 голосов
/ 15 октября 2018

Вам не хватает 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". "Имена" созданы.

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 и имеет другой способ получения выходных данных СУБД.

Чтобы открыть окно захвата СУБД, вам нужно нажать на меню "VIEW" и выбрать опцию "DBMS Output".

DBMS Output option

Затем нажмите зеленую кнопку «плюс» и установите базу данных, которая будет захвачена.

DBMS Output window

Теперь вы можете увидеть вывод.

Остерегайтесь , поскольку выходные данные здесь не "в реальном времени", это окно будет показывать что-то, только когда есть очистка буфера, и очистка буфера не может быть вызвана вручную / напрямую.

0 голосов
/ 15 октября 2018

Скорее всего, клиент (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

надеюсь, это поможет ...

...