Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在oracle数据库中视图的触发器中调用java类_Java_Database_Oracle_Oracle10g - Fatal编程技术网

在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