目标创建一个异常处理机制,当触发器执行对远程oracle数据库执行插入操作失败的时候,把要插入的记录存入日志表
触发器如下
create or replace trigger WMT_RAIN_5MIN
after insert on WMT_RAIN_5MIN FOR EACH ROW
begin
declare
not_data exception;
timeout exception;
pragma exception_init(timeout ,-12170);
pragma exception_init(timeout ,-4052);
pragma exception_init(timeout ,-604);
begin
--insert into WMT_RAIN_5MIN_log (stcd,tm,drp) values (:new.stcd,:new.tm,:new.drp);
-- select user into v from dual@orcl5;
insert into WMT_RAIN_5MIN@orcl5 (stcd,tm,drp) values (:new.stcd,:new.tm,:new.drp);
exception
when not_data then
insert into WMT_RAIN_5MIN_log (stcd,tm,drp) values (:new.stcd,:new.tm,:new.drp);
when timeout then
insert into WMT_RAIN_5MIN_log (stcd,tm,drp) values (:new.stcd,:new.tm,:new.drp);
end;
end;
编译的时候报错
TRIGGER SWZDH.WMT_RAIN_5MIN 编译错误
错误:ORA-04052: 在查找远程对象 SWZDH.WMT_RAIN_5MIN@ORCL5 时出错
ORA-00604: 递归 SQL 级别 1 出现错误
ORA-12170: TNS: 连接超时
行:2
文本:after insert on WMT_RAIN_5MIN FOR EACH ROW
------解决方案--------------------
你DBLINK建立的有问题,报错不是说明了
------解决方案--------------------
我模拟了下你的上面的代码运行正常,看你的报错原因可能是ORA-00604: 递归 SQL 级别 1 出现错误 导致的。
解决ORA-00604: 递归 SQL 级别 1 出现错误的方法是:
该错误最常见的原因是数据库文件\oracle\product\10.2.0\admin\orcl\pfile\init.ora中的参数open_cursors值太小。可以修改init.ora文件,open_cursors的值一般为255,我的是300。修改完后,关闭下ORACLE,再重新启动。你试下,不知道行不行。
------解决方案--------------------
考虑过自治事物么,可以直接在你的触发器exception中调用一个使用了自治事物的存储过程,实现将异常数据插入到你本地库的log表里面,不知道这样是否符合你的要求。
------解决方案--------------------
你捕获exception时候 直接捕获 others 也捕获不到么?
这样:
exception
when others then
...
end ;
------解决方案--------------------
DECLARE
num number;
BEGIN
BEGIN
EXECUTE IMMEDIATE 'select count(*) from dual@os_ns';
dbms_output.put_line('ok');
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('timeout');
raise;
END;
DBMS_OUTPUT.put_line('continue....');
END;
这样应该能抓取到dblink连接不通异常,然后抛出,可否满足你的需要
------解决方案--------------------
关注这个: ORA-12170: TNS: 连接超时,你对@orcl5数据库有监听吗?测试一下连得上不? 继续关注。
------解决方案--------------------
http://bbs.csdn.net/topics/390762611#new_post