oracle dblink调用,oracle dblink 调用序列
场景:Oracle dblink远程调用序列时当注意的几点
Oracle dblink远程调用序列时应注意的几点
在一条语句中如果同时包括数据库链和序列,就会出现潜在的问题,而Oracle的文档在这里并没有描述清楚。
下面通过一个例子对同时包括数据库链和序列的几种情况分别进行说明。
首先,构造一个测试的环境(两个数据库的GLOBAL_NAMES均为TRUE):
SQL> conn scott/tiger@yangtk
已连接。
SQL> create table test_on_yangtk (id number);
表已创建。
SQL> insert into test_on_yangtk values (1);
已创建 1 行。
SQL> commit;
提交完成。
SQL> create sequence seq_on_yangtk;
序列已创建。
SQL> conn yangtk/yangtk@test4
已连接。
SQL> create table test_on_test4 (id number);
表已创建。
SQL> insert into test_on_test4 values (1);
已创建 1 行。
SQL> commit;
提交完成。
SQL> create sequence seq_on_test4;
序列已创建。
SQL> create database link yangtk connect to scott identified by tiger using 'yangtk';
数据库链接已创建。
对于简单的查询语句,可以分为四种情况。
1.从本地表中读取数据,并引用本地序列。
SQL> select seq_on_test4.nextval from test_on_test4;
NEXTVAL
----------
1
2.从本地表中读取数据,但访问远端序列,这时,需要在序列后面加上数据库链名称。
SQL> select seq_on_yangtk.nextval@yangtk from test_on_test4;
NEXTVAL
----------
1
3.读取远端数据表中数据,同时访问远端序列。
SQL> select seq_on_yangtk.nextval@yangtk from test_on_yangtk@yangtk;
NEXTVAL
----------
2
4.读取远端数据表中数据,但是访问本地序列。
SQL> select seq_on_test4.nextval from test_on_yangtk@yangtk;
NEXTVAL
----------
2
通过测试,这四种情况工作都很正常。
下面,考虑分布式事务——以INSERT INTO SELECT为例。
由于INSERT的表可以是本地表,也可以是远端表,对于每种情况,对应的子查询语句都可能包含上面四种情况,下面就一一进行分析。
一、插入本地表
1.从本地表中读取数据,并引用本地序列
SQL> insert into test_on_test4 select seq_on_test4.nextval from test_on_test4;
已创建 1 行。
SQL> rollback;
回退已完成。
2.从本地表中读取数据,但访问远端序列
SQL> insert into test_on_test4 select seq_on_yangtk.nextval@yangtk from test_on_test4;
已创建 1 行。
SQL> rollback;
回退已完成。
3.读取远端数据表中数据,同时访问远端序列。
SQL> insert into test_on_test4 select seq_on_yangtk.nextval@yangtk from test_on_yangtk@yangtk;
已创建 1 行。
SQL> rollback;
回退已完成。
4.读取远端数据表中数据,但是访问本地序列。
SQL> insert into test_on_test4 select seq_on_test4.nextval from test_on_yangtk@yangtk;
已创建 1 行。
SQL> rollback;
回退已完成。
经测试,插入本地表的四种情况,没有出错。
二、插入远端表
1.从本地表中读取数据,并引用本地序列
SQL> insert into test_on_yangtk@yangtk select seq_on_test4.nextval from test_on_test4;
insert into test_on_yangtk@yangtk select seq_on_test4.nextval from test_on_test4
*
ERROR 位于第 1 行:
ORA-02289: 序列(号)不存在
ORA-02063: 紧接着line(源于TEST4)
ORA-02063: 紧接着2 lines(源于YANGTK)
2.从本地表中读取数据,但访问远端序列
SQL> insert into test_on_yangtk@yangtk select seq_on_yangtk.nextval@yangtk from test_on_test4;
已创建 1 行。
SQL> rollback;
回退已完成。
3.读取远端数据表中数据,同时访问远端序列。
SQL> insert into test_on_yangtk@yangtk select seq_on_yangtk.nextval@yangtk from test_on_yangtk@yangtk;
已创建 1 行。
SQL> rollback;
回退已完成。
4.读取远端数据表中数据,但是访问本地序列。
SQL> insert into test_on_yangtk@yangtk select seq_on_test4.nextval from test_on_yangtk@yangtk;
insert into test_on_yangtk@yangtk select seq_on_test4.nextval from test_on_yangtk@yangtk
*
ERROR 位于第 1 行:
ORA-02289: 序列(号)不存在
ORA-02063: 紧接着line(源于TEST4)
ORA-02063: 紧接着2 lines(源于YANGTK)
根据测试,第一种情况和第四种情况出现了相同的错误。
在和其他所有没有报错的情况比较后,可以得到这样的结论:当插入远端数据表,并使用本地序列时会出现错误。
Oracle的error文档上这样描述2289错误的:
ORA-02289 sequence does not exist
Cause: The specified sequence does not exist, or the user does not have the required privilege to perform this operation.
Action: Make sure the sequence name is correct, and that you have the right to perform the desired operation on this sequence.
根据目前的错误以及Oracle给出的错误原因,初步怀疑对于这种插入远端数据表的分布式事务,实际上是在远端上执行的。因此YANGTK上的scott用户找不到SEQ_ON_TEST4这个序列。
给YANGTK上的scott用户增加一个指向TEST4上yangtk用户的数据库链。
SQL> conn scott/tiger@yangtk
已连接。
SQL> create database link test4 connect to yangtk identified by yangtk using 'test4';
数据库链接已创建。
SQL> conn yangtk/yangtk@test4
已连接。
SQL> insert into test_on_yangtk@yangtk select seq_on_test4.nextval from test_on_test4;
已创建 1 行。
SQL> rollback;
回退已完成。
SQL> insert into test_on_yangtk@yangtk select seq_on_test4.nextval from test_on_yangtk@yangtk;
已创建 1 行。
SQL> rollback;
回退已完成。
建立数据库链之后,重新执行错误的语句,这次执行没有出现错误。
如果在一条语句中同时使用数据库链和序列,这时候应当小心,你可能不仅需要一条到远端的数据库链,还可能需要一个从远端到本地的数据库链。
oracle dblink调用,oracle dblink 调用序列相关推荐
- [oracle]通过DBLINK远程查询带DBLINK的视图
最近做了一个非常奇葩的事情"通过DBLINK远程查询带DBLINK的视图": 有A.B两个数据库实例,A下面有user1和user2两个用户,B实例下有用户user3. 现在use ...
- Oracle之同义词,DBLINK,表空间
昨天讲了物化视图了,今天讲一下同义词的这个概念 就是synonym,反正这个我叫习惯了,这个同义词了解过吗,这个可能了解的不多吧,MYSQL里面有同义词的概念吗,给我点反馈,你用MYSQL里面有同义词 ...
- oracle数据库dblink创建语句_「运维实验」——达梦数据库DBlink连接Oracle配置
经过昨天达梦数据库间DBlink配置(具体操作可回看上一篇文章),今天做延伸实验. 实验环境说明 Oracle数据库1:192.168.80.40 ora11g RHEL 6.5 64位 达梦数据库1 ...
- Oracle创建同义词及dblink
一.定义 oracle的同义词从字面上理解是别名的意思,和视图的功能类似,就是一种映射关系.在使用同义词时,oracle数据库将他翻译成对应方案对象的名字.与视图对象类似,同义词不占用实际存储空间,只 ...
- 查看oracle数据库中某个dblink对应的数据库连接ip地址
查询oracle数据库中某个dblink对应的连接数据库ip地址,其实只需要查到对应的创建语句就好了. oracle数据库查询对应dblink的连接数据库ip地址时,首先在oracle数据库中使用 s ...
- 达梦数据库通过DBLINK访问ORACLE (从DM到ORACLE)
一.环境 ORACLE: IP 100.111.8.9 操作系统版本 Linux CentOS 7.0 数据库版本 oracle 11g SELINUX DISABLED 防火墙 关闭 达梦: IP ...
- 达梦创建dblink连接oracle
1.首先下载oracle客户端 下载地址: https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downl ...
- DM创建DBLINK连接oracle
文章目录 前言 一.下载oracle监听客户端 二.上传下载好的压缩包至服务器并解压 三.将解压出来的so文件拷贝至达梦数据库安装目录BIN目录下 四.将libclntsh.so.12.1文件复制一份 ...
- dblink 造成 oracle 服务器 内存_性能故障之内存抖动的诊断过程
下面的分享是笔者在2月份处理的一起性能故障,笔者将分析过程分享出来,给大家起到抛砖引玉的作用. 接到XXX项目组报障:XX系统Connecttodatabasetimeout,请求协助检查数据库是否有 ...
最新文章
- ORA-04063: view SYS.DBA_REGISTRY has errors
- UIBarButtonSystemItem 各种款式
- Windows系统调用学习笔记(一)—— API函数调用过程
- 域名转入Godaddy详解
- 实力打脸: 量子隐形传输与 “瞬间移动” 毫无关系
- 图解Kafka中的基本概念
- 使用万能框架HttpHelper抓取安卓APP数据
- Renting Boats
- Linux中的Cron ,任务计划
- 兜兜转转,回到原点,Hello Mr.my yesterday
- 使用html5+canvas+Jquery实现的纯代码连线题Demo
- Java代码利用aspose-words将word文档转换成pdf和图片格式(PNG,JPG,JPEG破解 无水印)
- 微信H5开发,怎样禁止手机横屏
- matlab解洛伦兹方程,用MATLAB和Simulink解决微分方程的问题:Lorenz吸引子案例研究【含Matlab代码】...
- kvm linux重置密码,超微主板使用ipmicfg重置IPMI密码
- 地下城与勇士正在自动连接频道服务器,地下城与勇士DNF进不去提示“正在连接服务器”解决方案...
- Tacotron2 NVIDIA版本使用Biao-Bei数据集
- ELK日志平台---老男孩教育笔记
- that was originally added here
- 隐藏 Nginx 版本号和软件名
热门文章
- Java项目:SSM实现的儿童摄影预约网站平台
- JavaSE、JavaEE、JavaWeb分不清?
- touchslide.js 轮播和标签切换代码
- 微信小程序提交表单数据Cannot read property ‘***‘ of undefined?
- 【JavaScript】清空数组的三种方式
- 【Word】【WPS】跨行显示表格标题/表头
- 香港服务器CN2线路双向和单向到底什么意思?
- 简单介绍单片机、电脑处理器原理
- 计算机桌面图标有背影,电脑界面快捷方式后面的蓝背影怎么去掉
- Chocolatey的安装和使用