使用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
再重新编译我们的触发器,就可以了.问题虽小,但却很坑,记在这里,大家要是遇到了可以借鉴一下^ ^
使用oracle DB_LINK的一个注意点的更多相关文章
- 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 ...
- oracle 编译中一个关于clntsh 库的一个 帖子 ,收藏!
oracle 编译中一个关于clntsh 库的一个 帖子 ,收藏! ------------------------------------------------------------------ ...
- ORACLE如何停止一个JOB
ORACLE如何停止一个JOB1 相关表.视图2 问题描述为同事解决一个因为网络连接情况不佳时,执行一个超长时间的SQL插入操作.既然网络状况不好,就选择了使用一次性使用JOB来完成该插入操作.在JO ...
- 屌炸天,Oracle 发布了一个全栈虚拟机 GraalVM,支持 Python!
前阵子,Oracle 发布了一个黑科技 "GraalVM",号称是一个全新的通用全栈虚拟机,并具有高性能.跨语言交互等逆天特性,真有这么神奇? GraalVM 简介 GraalVM ...
- FIREDAC(DELPHI10 or 10.1)提交数据给ORACLE数据库的一个不是BUG的BUG
发现FIREDAC(DELPHI10 or 10.1)提交数据给ORACLE数据库的一个不是BUG的BUG,提交的表名大小写是敏感的. 只要有一个表名字母的大小写不匹配,ORACLE就会认为是一个不认 ...
- oracle触发器,一个表新增、修改的同时同步另一张表
oracle创建触发器,把本地新增.修改数据过程同步到另一个服务器上去. 如果是本地,加数据库名即可.如果是远程服务器,不是一台机器,做一个db_link操作即可. ----------------- ...
- oracle DB_LINK
1.先创建远程数据库服务名(注意,如果服务器既有oracle服务端又有客户端,需要在服务端的tnsnames.ora中配置服务名,否则会报如下错误): SQL> select count(*) ...
- oracle授权另外一个用户访问自己创建的数据对象
oracle安装好之后,有一个默认的scott用户,该用户有一个默认的emp表,怎样让新创建的用户也能够访问这个表呢? 授权xiaoming这个用户访问emp表,但是xiaoming只有select权 ...
- Oracle 连接 另一个Oracle数据库 服务器连接
一.场景 两台不同的服务器A.B分别装有不同业务的oracle数据库,因业务需要,现需要将B中test表的数据,定时同步到A中. 二.实现 根据以上场景,我想到了oracle中的dblink, ...
随机推荐
- 对比jquery获取属性的方法props、attr、data
1.attr,prop 对于HTML元素本身就带有的固有属性,在处理时,使用prop方法.对于自定义的属性是取不到的: 对于HTML元素我们自己自定义的DOM属性,在处理时,使用attr方法. 2.a ...
- 学习C++ -> 构造函数与析构函数
学习C++ -> 构造函数与析构函数 一.构造函数的介绍 1. 构造函数的作用 构造函数主要用来在创建对象时完成对对象属性的一些初始化等操作, 当创建对象时, 对象会自动调用 ...
- 巧用ecshop做淘宝客
一.第一步 下载文件,可以在http://www.ecshop.com/下载ecshop各个版本的安装包,安装好ECSHOP,然后通过PTF工具下载2个文件到本地进行修改.这个2个文件分别是goods ...
- Leetcode刷题
Leetcode题库 本博客用于记录在LeetCode网站上一些题的解答方法.具体实现方法纯属个人的一些解答,这些解答可能不是好的解答方法,记录在此,督促自己多学习多练习. The ...
- TweenMax动画库学习
之前在做HTML5移动端开发的时候,用的都是Animate.css,这个插件封装的的确很好,但是在做一些缓动方面的动画,它也有一定的不足之处,比如手要写一个连续的动画,需要不停的去重复写函数,使得代码 ...
- linux环境
vim命令 http://www.cnblogs.com/softwaretesting/archive/2011/07/12/2104435.html 安装YouCompleteMe 按照百度搜索的 ...
- 有没有必要参加IT培训
近几年,IT培训机构可谓是琳琅满目,稂莠不齐.培训Java的,培训PHP的,培训大数据的等等吧,不一而足. 自己也算是IT技术圈子待了好多年了,面试过一些机构培训出来的学生,也有几个好哥们在培训机构做 ...
- eclipse环境下基于tomcat-7.0.82构建struts2项目
开山第一篇,毕业4个月目前接触最多的框架还是s2sh框架.... 具备完整的开发环境下,在eclipse下启动tomcat出现如下所示画面表示环境构建成功. 第一步:创建web项目,截图如下 此页面只 ...
- Spark SQL中的几种join
1.小表对大表(broadcast join) 将小表的数据分发到每个节点上,供大表使用.executor存储小表的全部数据,一定程度上牺牲了空间,换取shuffle操作大量的耗时,这在SparkSQ ...
- jQuery与别的js框架冲突
jQuery.noConflict()运行这个函数将变量$的控制权让渡给第一个实现它的那个库. 这有助于确保jQuery不会与其他库的$对象发生冲突. <script type="te ...