`

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(Database Link)是Oracle提供的一种机制,用于在不同的Oracle数据库实例之间建立连接,实现跨数据库查询、更新等功能。它...

    Oracle之dblink的配置

    Oracle之dblink的配置 Oracle之dblink的配置 Oracle之dblink的配置 Oracle之dblink的配置

    Oracle DBLink建立连接

    ### Oracle DBLink建立连接 #### 知识点一:DBLink基本概念与作用 - **DBLink**(Database Link)是Oracle提供的一种机制,用于在不同的Oracle数据库实例之间建立连接,实现跨数据库查询、更新等操作。 - **应用...

    oracle 存储过程 函数 dblink

    本文主要介绍了Oracle存储过程的概念、创建和调用方法,以及如何使用DBLink实现跨库操作。存储过程提供了强大的数据库处理能力,而DBLink则使得不同数据库实例之间的交互变得更加方便和高效。掌握这些技术对于提高...

    oracle 使用dblink方式 连接远程数据库,内有详细描述,亲测可以

    本文详细介绍了如何在Oracle中使用DBLink连接远程数据库,包括必要的准备工作、创建过程以及注意事项等内容。正确配置和使用DBLink可以帮助我们轻松地实现跨数据库操作,提高开发效率和系统灵活性。在实际应用过程中...

    关于创建oracle dblink 过程的几点心得

    下面是创建 Oracle DB Link 过程的几点心得: 什么是 DB Link DB Link 是一种数据库链接技术,允许用户从一台数据库服务器读取另一台数据库服务器下的数据。它可以用来连接不同的数据库服务器,实现数据的共享和...

    oracle dblink 的应用

    Oracle dblink 是 Oracle 数据库中用于连接不同数据库实例的工具,允许用户在多个数据库之间进行数据查询、更新和传输。它的主要应用场景是在分布式环境中,当需要从一个数据库访问另一个远程数据库的数据时。以下是...

    oracle dblink的建立说明

    Oracle DBLink(数据库链接)是Oracle数据库提供的一种特性,它允许用户在不同的Oracle数据库实例间进行数据查询和操作,仿佛这些数据库都在同一个实例内。DBLink使得分布式数据库系统的交互变得简单,无需复杂的...

    oracle DBLink

    例如,当需要将Oracle数据库的数据同步到MSSQL Server时,DBLink可以作为一种解决方案,但需要注意的是,由于Oracle和MSSQL Server的SQL语法差异,可能需要额外的转换层来处理兼容性问题。 在《Oracle与MSSql对接...

    oracle使用dblink高速复制表数据的动态存储过程

    程序同步到执行结束时的目标表所有数据,不按任何字段排序,只判断并记录row_number()到日志表,中断后重新执行可继续同步,如果目标表频繁读写,不保证数据完全正常,故最好是目标表不变动情况下执行同步。...

    oracle通过DBlink连接mysql搭建过程

    使用 DBlink 连接 Oracle 和 MySQL 数据库 Oracle 通过 DBlink 连接 MySQL 搭建过程是一个复杂的过程,需要安装和配置多个组件,包括 unixODBC、mysql-connector-odbc 和 Oracle 环境变量。本文将详细说明这个过程...

    oracle通过dblink链接 mysql和mssql例子

    在创建和使用DBLink时,还需要注意以下几点: - Oracle在数据字典中保存DBLink的信息。 - Oracle利用OracleNet和预定义的连接信息访问远程数据库。 - 用户名和密码需要使用双引号,以防止Oracle自动转大写,可能...

    Oracle dblink详解

    Oracle dblink是Oracle数据库提供的一种在分布式环境中连接不同数据库的机制。它允许用户在一个数据库上执行操作,同时访问和操作远程数据库中的数据,仿佛这些数据是本地存在的。Database link是单向的,意味着从...

    Linux下ORACLE 使用dblink连接mysql_lijilinjy的专栏-CSDN博客.mhtml

    Linux下ORACLE 使用dblink连接mysql_lijilinjy的专栏-CSDN博客.mhtml

    oracle oracle_dblink详解.

    数据库链接(DBlink)是 Oracle 数据库中的一种对象,允许用户查询远程表和执行远程程序。在分布式环境中,数据库链接是必要的。数据库链接是单向的连接,在创建数据库链接时,Oracle 会在数据字典中保存相关的...

    Oracle通过DBlink连接MySQL

    Oracle通过DBlink连接MySQL是一种常见的数据集成方式,它允许Oracle数据库与MySQL数据库之间进行通信,实现数据的交互和共享。以下将详细介绍整个配置过程。 **一、部署环境** 在进行配置之前,确保你的系统环境是...

    Oracle使用dblink导用户下的所有表数据(以迁移scott用户为例)

    DB Link是Oracle提供的一种机制,它允许在一个数据库(本地数据库)中执行SQL语句,操作另一个远程数据库的数据。通过创建DB Link,我们可以将一个数据库连接到另一个数据库,仿佛它们位于同一系统内。 迁移scott...

    oracle10g或11g通过dblink访问sql server数据库

    ### Oracle 10g 或 11g 通过 DBLink 访问 SQL Server 数据库 #### 概述 本文档详细介绍了如何在Oracle 10g或11g环境中使用DBLink来访问SQL Server数据库的方法。这种方法对于那些习惯于使用Oracle进行数据库操作的...

    MySQL federated引擎 实现类似oracle dblink功能

    MySQL联邦(Federated)引擎是一种特殊的存储引擎,它的设计目标是允许MySQL数据库跨越不同的服务器进行数据集成,类似于Oracle数据库中的DBLINK功能。这个引擎使得用户可以在本地数据库中查询和操作远程MySQL服务器...

Global site tag (gtag.js) - Google Analytics