• 使用oracle DB_LINK的一个注意点


    今天使用db_link的时候遇到了个有趣的问题,和大家分享一下;

    环境:Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

    是这样的,数据库有2个实例,分别为orcl和orcl2,在orcl实例用户A下有一张产品表,tfund_info,另外一个实例下需要获取该表的数据,并做修改,然后将更新同步回实例A.

    早上的时候我在实例orcl2内建立了一张用于存储tfund_info的数据,取名为joyin_fund_info.然后在实例orcl2建立一个db_link取名为to_joyin用于连接orcl,并且在joyin_fund_info下建立触发器如下:

    CREATE OR REPLACE TRIGGER ITFINPIF.TRI_JOYIN_FUND_INFO
    AFTER UPDATE ON
    ITFINPIF.JOYIN_FUND_INFO
    REFERENCING NEW AS NEW OLD AS OLD
    FOR EACH ROW
    DECLARE
    BEGIN
    IF :NEW.PUSH_STATE='M' THEN
    /*数据推送至产品主表 */
    UPDATE TFUND_INFO@TO_JOYIN SET
    AMT=:NEW.AMT ,--订单金额(元)
    JJSC =:NEW.JJSC ,--基础收益(元)
    CPMJJE =:NEW.CPMJJE,--产品募集金额(元)
    DJQZLX =:NEW.DJQZLX,--代金券总利息(元)
    JXQZLLX =:NEW.JXQZLLX -- 加息券总利息(元)
    WHERE R_ID=:NEW.R_ID;

    END IF;
    exception
    when others then
    insert into push_error_log@to_joyin (rq,error_id,sqlerr,o_code)
    values(sysdate,:new.r_id,'推送失败',:new.o_code);

    END;

    一个很简陋的触发器,也编译通过了.下午的时候由于业务要求,需要再多推送一个push_state字段,于是我到实例orcl下的tfund_info新增了一个字段push_state,并且修改该触发器

    /*数据推送至产品主表 */
    UPDATE TFUND_INFO@TO_JOYIN SET
    AMT=:NEW.AMT ,--订单金额(元)
    JJSC =:NEW.JJSC ,--基础收益(元)
    CPMJJE =:NEW.CPMJJE,--产品募集金额(元)
    DJQZLX =:NEW.DJQZLX,--代金券总利息(元)
    JXQZLLX =:NEW.JXQZLLX -- 加息券总利息(元)
    ,PUSH_STATE ='M'--推送状态
    WHERE R_ID=:NEW.R_ID;

     也就是再加了个PUSH_STATE ='M'--推送状态,但是编译的时候奇怪的问题出现了,这个触发器无论如何也无法编译成功,报错的原因是提示push_state标识符无效.这就很纳闷了,这个字段是我刚加的,怎么会无效呢?

    一开始以为是统计信息或者数据字典的问题,因为编译的时候用的是这些信息吧,但是数据字典应该是OK的.

    真正的问题原因是什么呢?

    实际上很简单,是共享池的缘故,db_link的会话应该是非常特别的,共享池内保存了之前的编译信息,才导致编译无法通过,

    使用命令

    alter system flush shared_pool

    再重新编译我们的触发器,就可以了.问题虽小,但却很坑,记在这里,大家要是遇到了可以借鉴一下^ ^

  • 相关阅读:
    java几种数据的默认扩容机制
    web.xml配置详解
    Bootstrap文件上传组件
    JAVA四则运算算法
    Oracle 和 mysql 的批量操作Sql语句 的区别
    JAVA使用ItextPDF
    c# 状态机实现
    c++11模拟boost元占位符placeholder
    vs2012 函数参数内存对齐引发编译错误
    windows下matplotlib编译安装备忘
  • 原文地址:https://www.cnblogs.com/Yggdrasil/p/8073182.html
Copyright © 2020-2023  润新知