在 Oracle 数据库中的视图的触发器中调用 java class
Calling a java class in a trigger on a view in an oracle database
我创建了一个视图:
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
;
现在,无论何时更新视图,都不会发生任何事情,所以我在这里缺少什么?
视图实际上只是一个存储的查询。底层 tables 不知道视图存在,对这些的更改不会直接影响视图。下次您查询视图时,将查询底层的 tables,您会在那时看到 tables 中的数据。
当您插入视图时会触发一个替代触发器,而不是当您插入基础时 table。通常这个 'intercepts' 插入和修改基础 tables。
作为演示,使用本地 table(它是远程 table,在您的版本中通过数据库 link 访问不会对其工作方式产生任何影响):
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在这种情况下是开发人员)。通常触发器当然会做一些更有用的事情。
如果我直接插入 table,则不会显示调试,因为触发器不会触发:
insert into t42 (id) values (2);
1 row inserted.
但实际上插入了该行,查询视图仅显示 - 而不是之前被触发器截获的行:
select * from v42;
ID
----------
2
如果您希望在 table 中插入一行时执行某些操作,那么您必须在 table 本身上有一个触发器。您可能会用本地 物化 视图替换您的视图并对其进行触发,但数据库 link 也相当复杂。
我创建了一个视图:
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
;
现在,无论何时更新视图,都不会发生任何事情,所以我在这里缺少什么?
视图实际上只是一个存储的查询。底层 tables 不知道视图存在,对这些的更改不会直接影响视图。下次您查询视图时,将查询底层的 tables,您会在那时看到 tables 中的数据。
当您插入视图时会触发一个替代触发器,而不是当您插入基础时 table。通常这个 'intercepts' 插入和修改基础 tables。
作为演示,使用本地 table(它是远程 table,在您的版本中通过数据库 link 访问不会对其工作方式产生任何影响):
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在这种情况下是开发人员)。通常触发器当然会做一些更有用的事情。
如果我直接插入 table,则不会显示调试,因为触发器不会触发:
insert into t42 (id) values (2);
1 row inserted.
但实际上插入了该行,查询视图仅显示 - 而不是之前被触发器截获的行:
select * from v42;
ID
----------
2
如果您希望在 table 中插入一行时执行某些操作,那么您必须在 table 本身上有一个触发器。您可能会用本地 物化 视图替换您的视图并对其进行触发,但数据库 link 也相当复杂。