- 浏览: 271239 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (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 1200昨天做完项目后让测试测试了一把,测试说分页查询貌似不起作用 ... -
Oracle中GOTO的用法
2013-12-03 14:37 1824Oracle中没有continue关键字,在loop中可以用 ... -
Oracle左连接与右连接区别
2013-10-28 19:12 1795数据表的连接有: 1、内连接(自然连接): 只有两个表相匹配 ... -
Oracle sql语句执行顺序
2013-07-05 09:53 28580sql语法的分析是从右到 ... -
修改oracle11g存档模式
2013-07-01 13:39 01.archive log list命令用户查看数据库存档 ... -
Oracle11g 导出数据库
2013-07-01 13:37 1258在运行中输入exp.exe, ... -
Oracle 冷备份和冷恢复
2013-07-01 13:37 1221阅读说明 1.参数说明 COLD_BACK_DIR: 冷备 ... -
Oracle创建用户,授权
2013-07-01 09:56 11141.用system,sys账户登录 2.创建用户creat ... -
MySql,Mssql,Oracle三种数据库性能优缺点及异同
2013-07-01 09:48 7356MySql优点 MySql是一个快速、多线程、多用 ... -
ORACLE纯SQL实现多行合并一行
2013-06-08 16:06 1809项目中遇到一个需求,需要将多行合并为一行。表结构如下:NAM ... -
Oracle触发器总结
2013-06-05 10:34 26701.触发器定义:触发器 ... -
row_number() over()分析函数用法
2013-05-10 16:12 4213row_number()over(partition ... -
Oracle数据库GLOBAL_NAMES参数的详细研究
2012-11-19 14:00 1122Oracle数据库GLOBAL_NAMES参数的相关知识 ... -
Oracle dblink小结备忘
2012-11-16 10:48 17071.查看数据库的global_name ... -
Oracle dblink远程调用存储过程、函数、序列
2012-11-16 10:46 4219一、dblink远程调用procedure: 1、写了一个 ... -
Oracle job问题解决汇总
2012-11-13 10:42 1614一、job的运行频率设置 1.每天固定时间运行,比如 ... -
Oracle job操作注意事项
2012-11-13 10:40 1397创建一个简单的JOB实列 1、创建测试表 ... -
Oracle常用日期操作
2012-11-12 16:33 1196--Oracle trunc()函数的用法 /**** ... -
Oracle SQL性能优化
2012-11-06 16:12 1239(1) 选择最有效率的表名顺序(只在基于规则的 ... -
group by高级用法
2012-09-07 16:17 1707一、如何理解group by ...
相关推荐
### Oracle DBLink创建过程及快照同步方法 #### 一、Oracle DBLink概念与创建步骤 DBLink(Database Link)是Oracle提供的一种机制,用于在不同的Oracle数据库实例之间建立连接,实现跨数据库查询、更新等功能。它...
Oracle之dblink的配置 Oracle之dblink的配置 Oracle之dblink的配置 Oracle之dblink的配置
### Oracle DBLink建立连接 #### 知识点一:DBLink基本概念与作用 - **DBLink**(Database Link)是Oracle提供的一种机制,用于在不同的Oracle数据库实例之间建立连接,实现跨数据库查询、更新等操作。 - **应用...
本文主要介绍了Oracle存储过程的概念、创建和调用方法,以及如何使用DBLink实现跨库操作。存储过程提供了强大的数据库处理能力,而DBLink则使得不同数据库实例之间的交互变得更加方便和高效。掌握这些技术对于提高...
本文详细介绍了如何在Oracle中使用DBLink连接远程数据库,包括必要的准备工作、创建过程以及注意事项等内容。正确配置和使用DBLink可以帮助我们轻松地实现跨数据库操作,提高开发效率和系统灵活性。在实际应用过程中...
下面是创建 Oracle DB Link 过程的几点心得: 什么是 DB Link DB Link 是一种数据库链接技术,允许用户从一台数据库服务器读取另一台数据库服务器下的数据。它可以用来连接不同的数据库服务器,实现数据的共享和...
Oracle dblink 是 Oracle 数据库中用于连接不同数据库实例的工具,允许用户在多个数据库之间进行数据查询、更新和传输。它的主要应用场景是在分布式环境中,当需要从一个数据库访问另一个远程数据库的数据时。以下是...
Oracle DBLink(数据库链接)是Oracle数据库提供的一种特性,它允许用户在不同的Oracle数据库实例间进行数据查询和操作,仿佛这些数据库都在同一个实例内。DBLink使得分布式数据库系统的交互变得简单,无需复杂的...
例如,当需要将Oracle数据库的数据同步到MSSQL Server时,DBLink可以作为一种解决方案,但需要注意的是,由于Oracle和MSSQL Server的SQL语法差异,可能需要额外的转换层来处理兼容性问题。 在《Oracle与MSSql对接...
程序同步到执行结束时的目标表所有数据,不按任何字段排序,只判断并记录row_number()到日志表,中断后重新执行可继续同步,如果目标表频繁读写,不保证数据完全正常,故最好是目标表不变动情况下执行同步。...
使用 DBlink 连接 Oracle 和 MySQL 数据库 Oracle 通过 DBlink 连接 MySQL 搭建过程是一个复杂的过程,需要安装和配置多个组件,包括 unixODBC、mysql-connector-odbc 和 Oracle 环境变量。本文将详细说明这个过程...
在创建和使用DBLink时,还需要注意以下几点: - Oracle在数据字典中保存DBLink的信息。 - Oracle利用OracleNet和预定义的连接信息访问远程数据库。 - 用户名和密码需要使用双引号,以防止Oracle自动转大写,可能...
Oracle dblink是Oracle数据库提供的一种在分布式环境中连接不同数据库的机制。它允许用户在一个数据库上执行操作,同时访问和操作远程数据库中的数据,仿佛这些数据是本地存在的。Database link是单向的,意味着从...
Linux下ORACLE 使用dblink连接mysql_lijilinjy的专栏-CSDN博客.mhtml
数据库链接(DBlink)是 Oracle 数据库中的一种对象,允许用户查询远程表和执行远程程序。在分布式环境中,数据库链接是必要的。数据库链接是单向的连接,在创建数据库链接时,Oracle 会在数据字典中保存相关的...
Oracle通过DBlink连接MySQL是一种常见的数据集成方式,它允许Oracle数据库与MySQL数据库之间进行通信,实现数据的交互和共享。以下将详细介绍整个配置过程。 **一、部署环境** 在进行配置之前,确保你的系统环境是...
DB Link是Oracle提供的一种机制,它允许在一个数据库(本地数据库)中执行SQL语句,操作另一个远程数据库的数据。通过创建DB Link,我们可以将一个数据库连接到另一个数据库,仿佛它们位于同一系统内。 迁移scott...
### Oracle 10g 或 11g 通过 DBLink 访问 SQL Server 数据库 #### 概述 本文档详细介绍了如何在Oracle 10g或11g环境中使用DBLink来访问SQL Server数据库的方法。这种方法对于那些习惯于使用Oracle进行数据库操作的...
MySQL联邦(Federated)引擎是一种特殊的存储引擎,它的设计目标是允许MySQL数据库跨越不同的服务器进行数据集成,类似于Oracle数据库中的DBLINK功能。这个引擎使得用户可以在本地数据库中查询和操作远程MySQL服务器...