在oracle数据库中视图的触发器中调用java类
我创建了一个视图,如下所示:在oracle数据库中视图的触发器中调用java类,java,database,oracle,oracle10g,Java,Database,Oracle,Oracle10g,我创建了一个视图,如下所示: CREATE or replace VIEW new_requests AS SELECT * FROM new_requests@ECHOLDM WHERE is_transfered=2 以及一个存储过程,通过它我可以调用my java代码: CREATE OR REPLACE PROCEDURE RL52.echo_LDM AS LANGUAGE JAVA NAME 'src.com.echo.process.EchoLDMOrders.d
CREATE or replace VIEW new_requests AS
SELECT *
FROM new_requests@ECHOLDM
WHERE is_transfered=2
以及一个存储过程,通过它我可以调用my 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
;
现在,每当更新视图时,都不会发生任何事情,那么我在这里遗漏了什么呢?视图实际上只是一个存储的查询。基础表不知道视图存在,对这些表的更改不会直接影响视图。下次查询视图时,将改为查询基础表,此时您将看到表中的数据 insert of触发器在插入视图时触发,而不是在插入基表时触发。通常,这会“截取”插入并改为修改基表 作为演示,使用本地表(在您的版本中,它是通过数据库链接访问的远程表,对其工作方式没有任何影响): 如果我在视图中插入触发器,就会触发,我们可以从调试消息中看到:
insert into v42 (id) values (1);
1 row inserted.
Instead-of trigger fired for ID: 1
因为触发器只显示一条消息,所以尽管返回了状态消息(在本例中是由SQL开发人员返回的),但实际上没有在基表中插入任何行。通常情况下,触发器会做一些更有用的事情
如果我直接插入到表中,则不会显示调试,因为触发器不会触发:
insert into t42 (id) values (2);
1 row inserted.
但该行实际上已插入,查询视图只会显示-而不是触发器先前截获的行:
select * from v42;
ID
----------
2
如果希望在表中插入行时执行某些操作,则必须在表本身上设置触发器。您可能会用本地物化视图替换视图,并触发该视图,但数据库链接也相当复杂。“每当视图更新时”-您是否实际插入视图;或者,当直接在基础(本例中为远程)表上执行插入操作时,您是否希望在视图上触发触发器?@AlexPoole我希望在根据基础远程表更新视图时触发触发器。好的,我将看看如何处理远程表,但非常感谢您的帮助。
select * from v42;
ID
----------
2