当前位置: 代码迷 >> Oracle开发 >> 求解一个触发器的相关有关问题
  详细解决方案

求解一个触发器的相关有关问题

热度:71   发布时间:2016-04-24 06:39:12.0
求解一个触发器的相关问题
目标创建一个异常处理机制,当触发器执行对远程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
  相关解决方案