今天使用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

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

使用oracle DB_LINK的一个注意点的更多相关文章

  1. Oracle中把一个DateTime的字符串转化成date类型。to_date('2016/12/8 18:55:43','yyyy/MM/dd hh24:mi:ss'),

    Oracle中把一个DateTime或者该形态字符串转化成date类型. to_date('2016/12/8 18:55:43','yyyy/MM/dd hh24:mi:ss'), 或者: sele ...

  2. oracle 编译中一个关于clntsh 库的一个 帖子 ,收藏!

    oracle 编译中一个关于clntsh 库的一个 帖子 ,收藏! ------------------------------------------------------------------ ...

  3. ORACLE如何停止一个JOB

    ORACLE如何停止一个JOB1 相关表.视图2 问题描述为同事解决一个因为网络连接情况不佳时,执行一个超长时间的SQL插入操作.既然网络状况不好,就选择了使用一次性使用JOB来完成该插入操作.在JO ...

  4. 屌炸天,Oracle 发布了一个全栈虚拟机 GraalVM,支持 Python!

    前阵子,Oracle 发布了一个黑科技 "GraalVM",号称是一个全新的通用全栈虚拟机,并具有高性能.跨语言交互等逆天特性,真有这么神奇? GraalVM 简介 GraalVM ...

  5. FIREDAC(DELPHI10 or 10.1)提交数据给ORACLE数据库的一个不是BUG的BUG

    发现FIREDAC(DELPHI10 or 10.1)提交数据给ORACLE数据库的一个不是BUG的BUG,提交的表名大小写是敏感的. 只要有一个表名字母的大小写不匹配,ORACLE就会认为是一个不认 ...

  6. oracle触发器,一个表新增、修改的同时同步另一张表

    oracle创建触发器,把本地新增.修改数据过程同步到另一个服务器上去. 如果是本地,加数据库名即可.如果是远程服务器,不是一台机器,做一个db_link操作即可. ----------------- ...

  7. oracle DB_LINK

    1.先创建远程数据库服务名(注意,如果服务器既有oracle服务端又有客户端,需要在服务端的tnsnames.ora中配置服务名,否则会报如下错误): SQL> select count(*) ...

  8. oracle授权另外一个用户访问自己创建的数据对象

    oracle安装好之后,有一个默认的scott用户,该用户有一个默认的emp表,怎样让新创建的用户也能够访问这个表呢? 授权xiaoming这个用户访问emp表,但是xiaoming只有select权 ...

  9. Oracle 连接 另一个Oracle数据库 服务器连接

    一.场景   两台不同的服务器A.B分别装有不同业务的oracle数据库,因业务需要,现需要将B中test表的数据,定时同步到A中. 二.实现   根据以上场景,我想到了oracle中的dblink, ...

随机推荐

  1. 2017 ICPC 广西邀请赛1004 Covering

    Covering Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  2. 楼梯T-SQL:超越基础6级:使用CASE表达式和IIF函数

     从他的楼梯到T-SQL DML,Gregory Larsen涵盖了更多的高级方面的T-SQL语言,如子查询. 有时您需要编写一个可以根据另一个表达式的评估返回不同的TSQL表达式的单个TSQL语句. ...

  3. CI脚本异常退出问题定位

    背景 在CI脚本中,使用类似如下脚本进行项目编译的计时,但在执行过程中,有时会出现CI脚本(命名为ci.sh)未完全执行的情况: #!/bin/bash -e sleep_time=$1 start_ ...

  4. 还原NuGet程序包

    官网:https://msdn.microsoft.com/zh-cn/magazine/hh547106.aspx 在获取团队中的项目或者下载他人的项目Demo后,运行项目有时会提示某些dll找不到 ...

  5. 原生 drag drop HTML5

    drag事件( dragstart -- drag -- dragend )   当按下鼠标开始drag一个可以拖动的对象时,触发dragstart事件,如果元素是不可拖动的话,会出现一个不可拖动的图 ...

  6. 外键删除(T-SQL Drop Foreign Key)

    列出某张表相关的 FK Name select distinct name from sys.objects where object_id in (   select fk.constraint_o ...

  7. Asp.Net MVC 使用 Ajax

    Asp.Net MVC 使用 Ajax Ajax 简单来说Ajax是一个无需重新加载整个网页的情况下,可以更新局部页面或数据的技术(异步的发送接收数据,不会干扰当前页面). Ajax工作原理 Ajax ...

  8. 你不得不看的Python机器学习工具

    IEEE Spectrum排行榜第一,Skill UP排名第一的开发工具,Stack Overflow年度调查中程序员最感兴趣的选择,Stack Overflow 6月份访问量最多的编程语言..... ...

  9. tomcat配置虚拟路径保存、访问图片

    一些项目中往往需要上传一些图片文件之类,一般不建议直接保存在数据库内,往往是讲图片等资源保存在服务器的某个文件夹下,传统做法是上传到部署目录下,通过相对路径进行访问.这样当我们系统需要进行升级,进行全 ...

  10. 解决webstorm启动索引文件卡死问题

    问题 当目录下的文件数量较大时,用webstorm打开会出现卡顿,甚至卡死现象,例如:node_modules目录 解决方案 不让webstorm索引该目录下的文件步骤:1.node_modules目 ...