Вызов Java-класса в триггере для представления в базе данных Oracle - PullRequest
0 голосов
/ 27 июня 2018

Я создал вид как:

CREATE or replace VIEW new_requests AS
 SELECT *
FROM new_requests@ECHOLDM
WHERE is_transfered=2

и хранимая процедура, с помощью которой я могу вызвать мой код Java:

  CREATE OR REPLACE PROCEDURE RL52.echo_LDM
   AS LANGUAGE JAVA 
  NAME 'src.com.echo.process.EchoLDMOrders.doIt()';

Мой триггер выглядит следующим образом:

 CREATE OR REPLACE TRIGGER  LDM_trigger  
 INSTEAD OF INSERT ON  rl52.NEW_REQUESTS
 FOR EACH ROW
  CALL echo_LDM
  ;

Теперь, когда представление обновляется, ничего не происходит, так что мне здесь не хватает?

1 Ответ

0 голосов
/ 27 июня 2018

Представление - это на самом деле просто сохраненный запрос. Базовые таблицы не знают, что представление существует, и изменения в них не влияют на представление напрямую. В следующий раз, когда вы сделаете запрос к представлению, вместо этого будут запрошены базовые таблицы, и вы увидите данные в таблицах в этот момент.

Триггер вместо запускается при вставке в представление, а не при вставке в базовую таблицу. Обычно это «перехватывает» вставку и изменяет базовые таблицы.

В качестве демонстрации, использование локальной таблицы (это удаленная таблица, доступ к которой осуществляется по ссылке на базу данных в вашей версии, не имеет никакого значения для того, как это работает):

create table t42 (id number);
create view v42 as select * from t42;
create trigger v42_trig instead of insert on v42 for each row
begin
  dbms_output.put_line('Instead-of trigger fired for ID: ' || :new.id);
end;
/

set serveroutput on

Если я вставлю в представление, сработает триггер, что мы видим из сообщения отладки:

insert into v42 (id) values (1);

1 row inserted.

Instead-of trigger fired for ID: 1

Поскольку триггер только показывает сообщение, в базовой таблице фактически не было вставлено ни одной строки, несмотря на возвращаемое сообщение о состоянии (в данном случае SQL Developer). Обычно триггер делает что-то более полезное, конечно.

Если я вставляю в таблицу напрямую, отладка не отображается, потому что триггер не срабатывает:

insert into t42 (id) values (2);

1 row inserted.

Но эта строка была фактически вставлена, и запрос к представлению показывает только это, а не тот, который был перехвачен триггером ранее:

select * from v42;

        ID
----------
         2

Если вы хотите, чтобы при вставке строки в таблицу было предпринято какое-то действие, вам нужно иметь триггер на самой таблице. Возможно, вы могли бы заменить свое представление на локальное материализованное представление и иметь триггер для этого, но ссылка на базу данных тоже довольно сложная.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...