- 浏览: 265136 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (116)
- 开发工具 (21)
- Spring (5)
- Java (12)
- 面试题 (7)
- Hibernate (3)
- JavaScript (9)
- Jquery控件 (2)
- 自定义标签 (1)
- 错误总结 (3)
- Struts2+Juqery_qtip2 Form标签验证扩展 (1)
- Struts+Spring+MyBates (0)
- Oracle (37)
- Oracle错误总结 (5)
- J2EE (2)
- 研发管理 (1)
- MyBatis (1)
- Struts (1)
- Struts2 (1)
- PostgreSQL (1)
- weblogic (1)
- PL/SQL Developer (3)
- JSP (1)
- HTML (1)
- XHTML (1)
- JQuery (1)
最新评论
-
kyoldj:
select t.*, rownum rn
4. ...
oracle分页所遇到的rownum问题:要增加order by的唯一性 -
tanghuan:
不错不错
开发者如何提升和推销自己
在一条语句中如果同时包括数据库链和序列,就会出现潜在的问题,而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分页所遇到的rownum问题:要增加order by的唯一性
2013-12-04 17:04 1120昨天做完项目后让测试测试了一把,测试说分页查询貌似不起作用 ... -
Oracle中GOTO的用法
2013-12-03 14:37 1710Oracle中没有continue关键字,在loop中可以用 ... -
Oracle左连接与右连接区别
2013-10-28 19:12 1741数据表的连接有: 1、内连接(自然连接): 只有两个表相匹配 ... -
Oracle sql语句执行顺序
2013-07-05 09:53 28500sql语法的分析是从右到 ... -
修改oracle11g存档模式
2013-07-01 13:39 01.archive log list命令用户查看数据库存档 ... -
Oracle11g 导出数据库
2013-07-01 13:37 1212在运行中输入exp.exe, ... -
Oracle 冷备份和冷恢复
2013-07-01 13:37 1178阅读说明 1.参数说明 COLD_BACK_DIR: 冷备 ... -
Oracle创建用户,授权
2013-07-01 09:56 10721.用system,sys账户登录 2.创建用户creat ... -
MySql,Mssql,Oracle三种数据库性能优缺点及异同
2013-07-01 09:48 7311MySql优点 MySql是一个快速、多线程、多用 ... -
ORACLE纯SQL实现多行合并一行
2013-06-08 16:06 1743项目中遇到一个需求,需要将多行合并为一行。表结构如下:NAM ... -
Oracle触发器总结
2013-06-05 10:34 26141.触发器定义:触发器 ... -
row_number() over()分析函数用法
2013-05-10 16:12 4177row_number()over(partition ... -
Oracle数据库GLOBAL_NAMES参数的详细研究
2012-11-19 14:00 1078Oracle数据库GLOBAL_NAMES参数的相关知识 ... -
Oracle dblink小结备忘
2012-11-16 10:48 16681.查看数据库的global_name ... -
Oracle dblink远程调用存储过程、函数、序列
2012-11-16 10:46 3933一、dblink远程调用procedure: 1、写了一个 ... -
Oracle job问题解决汇总
2012-11-13 10:42 1571一、job的运行频率设置 1.每天固定时间运行,比如 ... -
Oracle job操作注意事项
2012-11-13 10:40 1353创建一个简单的JOB实列 1、创建测试表 ... -
Oracle常用日期操作
2012-11-12 16:33 1158--Oracle trunc()函数的用法 /**** ... -
Oracle SQL性能优化
2012-11-06 16:12 1185(1) 选择最有效率的表名顺序(只在基于规则的 ... -
group by高级用法
2012-09-07 16:17 1640一、如何理解group by ...
相关推荐
oracle 创建dblink的详细步骤,以及使用oracle快照快速的刷新,保持本地与远程数据库的同步
Oracle之dblink的配置 Oracle之dblink的配置 Oracle之dblink的配置 Oracle之dblink的配置
oracle 使用dblink方式 连接远程数据库,内有详细描述,亲测可以
oracle dblink的应用的详细代码设定
oracle 存储过程 函数 dblink 绝对对工作和平时学习有价值的资料。针对个人具体情况做修改即可使用
俩台不同的数据库服务器,从一台数据库服务器的一个用户读取另一台数据库服务器下的某个用户的数据,这个时候可以使用dblink。
不同数据库之间进行互访的话建立的连接
oracle通过DBlink连接mysql搭建过程
oracle,oracle_dblink详解
oracle dblink 创建使用文档,可以很好使用。
Linux下ORACLE 使用dblink连接mysql_lijilinjy的专栏-CSDN博客.mhtml
本文详细描述了在oracle10g或11g中使用dblink访问sql server,使用oracle的透明网关来访问异构的数据库,方便一些习惯使用oracle的开发人员操作sql server数据库
Oracle Dblink and synonym(同义词) 授权 创建 以及使用
通过一个实例简单的描述了oracle实例之间是如何建立database link的,对每个关键的名词都加了说明,你会发现原来简单才能明白,呵呵
oracle dblink详解.pdf
oracle通过ODBC建立dblink访问SqlServer数据库配置
以迁移scott用户下所有的表为例演示Oracle使用dblink导用户下的所有表数据
通过dblink连接oracle和mysql,将数据从oracle传输到mysql,详细记录了搭建过程和创建报错
依赖包:mysql-connector-odbc-5.3.6-1.el6.x86_64.rpm和unixODBC,前置条件:Oracle和MySQL字符集需要一致,否则Oracle查询出来的数据是乱码。