`
huanghuizz
  • 浏览: 85270 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

远端数据库读取插入到另一个远端数据库

阅读更多

ITPUB上看到一个有趣的问题,结果发现自己对数据库链的了解还不是很透彻:http://www.itpub.net/showthread.php?s=&threadid=523321

 

下面这个测试需要3个数据库,下面看一下3个数据库的环境:

本地数据库:

SQL> CONN YANGTK/YANGTK已连接。
SQL> SELECT * FROM GLOBAL_NAME;

GLOBAL_NAME
--------------------------------------------------------------------------
YTK

SQL> SHOW PARAMETER GLOBAL_NAME

NAME TYPE VALUE
------------------------------------ ----------- -------------------------
global_names boolean FALSE

远端数据库1

SQL> CONN SYSTEM@FJREP输入口令: ************已连接。
SQL> SELECT * FROM GLOBAL_NAME;

GLOBAL_NAME
--------------------------------------------------------------------------
FJREP

SQL> SHOW PARAMETER GLOBAL_NAME

NAME TYPE VALUE
------------------------------------ ----------- -------------------------
global_names boolean FALSE

远端数据库2

SQL> CONN SYSTEM@BJREP输入口令: *****已连接。
SQL> SELECT * FROM GLOBAL_NAME;

GLOBAL_NAME
-------------------------------------------------------------------------
BJREP.US.ORACLE.COM

SQL> SHOW PARAMETER GLOBAL_NAME

NAME TYPE VALUE
------------------------------------ ----------- ------------------------
global_names boolean FALSE

通过检查设置发现,三个数据库的GLOBAL_NAME都是FALSE,那么就是说对数据库链的名称应该没有任何的要求。

首先构建一下测试的环境:

SQL> CONN REPORT/REPORT@BJREP已连接。
SQL> CREATE TABLE TEST (NAME VARCHAR2(30));

表已创建。

SQL> INSERT INTO TEST VALUES ('BJREP');

已创建 1 行。

SQL> COMMIT;

提交完成。

SQL> CONN REPORT/REPORT@FJREP已连接。
SQL> CREATE TABLE TEST (NAME VARCHAR2(30));

表已创建。

SQL> INSERT INTO TEST VALUES ('FJREP');

已创建 1 行。

SQL> COMMIT;

提交完成。

下面回到本地数据库创建两个远端数据库的数据库链。注意BJREP的数据库链名称和远端数据库的GLOBAL_NAME并不一致,但是由于GLOBAL_NAME设置为FALSE,因此这个数据库可以正常工作。

SQL> CREATE DATABASE LINK FJREP CONNECT TO REPORT IDENTIFIED BY REPORT USING 'FJREP';

数据库链接已创建。

SQL> CREATE DATABASE LINK BJREP CONNECT TO REPORT IDENTIFIED BY REPORT USING 'BJREP';

数据库链接已创建。

SQL> SELECT COUNT(*) FROM TEST@BJREP;

COUNT(*)
----------
1

SQL> SELECT COUNT(*) FROM TEST@FJREP;

COUNT(*)
----------
1

SQL> INSERT INTO TEST@FJREP VALUES ('FROM LOCAL');

已创建 1 行。

SQL> INSERT INTO TEST@BJREP VALUES ('FROM LOCAL');

已创建 1 行。

SQL> COMMIT;

提交完成。

下面测试在本地环境中建立通过数据库链从远端数据库取数据并插入到远端数据库中:

SQL> INSERT INTO TEST@BJREP SELECT * FROM TEST@FJREP;
INSERT INTO TEST@BJREP SELECT * FROM TEST@FJREP
*
 1 行出现错误:
ORA-02019: 
未找到远程数据库的连接说明

ORA-02063: 
紧接着line(源于YTK
ORA-02063: 
紧接着 2 lines (起自 BJREP)

错误出现了,但是如果将二者的位置反过来却不会出现错误。

SQL> INSERT INTO TEST@FJREP SELECT * FROM TEST@BJREP;

已创建2行。

而且发现如果是对同一个远端数据库读取和插入是不会有问题的:

SQL> INSERT INTO TEST@FJREP SELECT * FROM TEST@FJREP;

已创建4行。

SQL> INSERT INTO TEST@BJREP SELECT * FROM TEST@BJREP;

已创建2行。

怀疑是由于Oracle要处理多个远端数据库,因此要求INSERT语句中的远端数据库的名称必须和GLOBAL_NAME中设置的一致。

奇怪的是,这里创建了BJREP.US.ORACLE.COM数据库链并不起作用,而是需要创建FJREP.US.ORACLE.COM

SQL> CREATE DATABASE LINK BJREP.US.ORACLE.COM CONNECT TO REPORT IDENTIFIED BY REPORT USING 'BJREP';

数据库链接已创建。

SQL> INSERT INTO TEST@BJREP.US.ORACLE.COM SELECT * FROM TEST@FJREP;
INSERT INTO TEST@BJREP.US.ORACLE.COM SELECT * FROM TEST@FJREP
*
 1 行出现错误:
ORA-02019: 
未找到远程数据库的连接说明

ORA-02063: 
紧接着line(源于YTK
ORA-02063: 
紧接着 2 lines (起自 BJREP.US.ORACLE.COM)


SQL> DROP DATABASE LINK BJREP.US.ORACLE.COM;

数据库链接已删除。

SQL> CREATE DATABASE LINK FJREP.US.ORACLE.COM CONNECT TO REPORT IDENTIFIED BY REPORT USING 'FJREP';

数据库链接已创建。

SQL> INSERT INTO TEST@BJREP SELECT * FROM TEST@FJREP.US.ORACLE.COM;

已创建8行。

更奇怪的是,只有建立了这个数据库链,甚至在SELECT的时候不指定它,而还是用原来的数据库链都可以:

SQL> INSERT INTO TEST@BJREP SELECT * FROM TEST@FJREP;

已创建8行。

SQL> ROLLBACK;

回退已完成。

可以通过SQL_TRACE来跟踪可以发现Oracle实际找的数据库链的名称。

SQL> DROP DATABASE LINK FJREP.US.ORACLE.COM;
DROP DATABASE LINK FJREP.US.ORACLE.COM
*
 1 行出现错误:
ORA-02018: 
同名的数据库链接具有打开的连接


SQL> DISC
 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, Oracle Label Security, OLAP and Data Mining Scoring Engine options 
断开

SQL> CONN YANGTK/YANGTK
已连接。
SQL> DROP DATABASE LINK FJREP.US.ORACLE.COM;

数据库链接已删除。

SQL> CREATE DATABASE LINK BJREP.US.ORACLE.COM CONNECT TO REPORT IDENTIFIED BY REPORT USING 'BJREP';

数据库链接已创建。

SQL> ALTER SESSION SET SQL_TRACE = TRUE;

会话已更改。

SQL> INSERT INTO TEST@BJREP.US.ORACLE.COM SELECT * FROM TEST@FJREP;
INSERT INTO TEST@BJREP.US.ORACLE.COM SELECT * FROM TEST@FJREP
*
 1 行出现错误:
ORA-02019: 
未找到远程数据库的连接说明

ORA-02063: 
紧接着line(源于YTK
ORA-02063: 
紧接着 2 lines (起自 BJREP.US.ORACLE.COM)


SQL> INSERT INTO TEST@BJREP SELECT * FROM TEST@FJREP;
INSERT INTO TEST@BJREP SELECT * FROM TEST@FJREP
*
 1 行出现错误:
ORA-02019: 
未找到远程数据库的连接说明

ORA-02063: 
紧接着line(源于YTK
ORA-02063: 
紧接着 2 lines (起自 BJREP)


SQL> ALTER SESSION SET SQL_TRACE = FALSE;

会话已更改。

TRACE文件中摘取一段就可以发现:

PARSING IN CURSOR #8 len=61 dep=0 uid=56 oct=2 lid=56 tim=3070147813 hv=923577066 ad='16ac9c48'
INSERT INTO TEST@BJREP.US.ORACLE.COM SELECT * FROM TEST@FJREP
END OF STMT
PARSE #8:c=0,e=23515,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,tim=3070147808
=====================
PARSE ERROR #2:len=43 dep=1 uid=56 oct=3 lid=56 tim=3070157311 err=2019
SELECT * FROM "TEST"@"FJREP.US.ORACLE.COM"
=====================
PARSING IN CURSOR #8 len=47 dep=0 uid=56 oct=2 lid=56 tim=3075496870 hv=3946478946 ad='16ae2944'
INSERT INTO TEST@BJREP SELECT * FROM TEST@FJREP
END OF STMT
PARSE #8:c=0,e=27874,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,tim=3075496865
=====================
PARSE ERROR #7:len=43 dep=1 uid=56 oct=3 lid=56 tim=3075504320 err=2019
SELECT * FROM "TEST"@"FJREP.US.ORACLE.COM"
*** 2006-04-21 12:57:02.125

Oracle在这里真正找的数据库链是FJREP.US.ORACLE.COM

引用:http://yangtingkun.itpub.net/post/468/71345

0
0
分享到:
评论

相关推荐

    Android读取数据库数据例子

    常见的方法是使用PHP作为服务器端脚本语言,创建一个接口来处理SQL查询并返回结果。 1. **设置服务器端环境**: 在服务器端,你需要搭建一个PHP环境,安装MySQL服务器,并编写PHP脚本来执行SQL查询。例如,你可以...

    数据库迁移后故障诊断优化案例

    - 在进行数据迁移时,采用了批量插入的方式,即从远端数据库读取数据并批量插入到目标端数据库中。 - 经过调查发现,问题的根本原因在于数据迁移过程中存在一定的网络延迟。 - 当数据从远端传输至目标端时,由于物理...

    远程上传excel数据到accsee数据库

    在IT行业中,将Excel数据远程上传到Accese数据库是一个常见的任务,这主要涉及到数据处理、数据库管理和网络通信等技术。以下是对这个主题的详细说明: 首先,Excel是一种广泛使用的电子表格应用程序,它允许用户...

    一个带数据库的网盘jsp小项目

    在本"一个带数据库的网盘jsp小项目"中,我们探讨的是一个基于Java Servlet和JSP技术构建的简易网盘系统。JSP(JavaServer Pages)是Java平台上用于创建动态网页的技术,它将业务逻辑与页面展示分离,提高了开发效率...

    Oracle-不同数据库DBLINK导数据使用说明

    数据库链接(DBLINK)允许一个Oracle数据库实例连接到另一个远程数据库实例,从而实现数据的透明访问。创建DBLINK的基本语法如下: ```sql CREATE DATABASE LINK db_link_name CONNECT TO remote_user IDENTIFIED ...

    C#数据库的交互操作,可移植到unity工程

    Unity则是一个强大的跨平台游戏引擎,它支持C#作为主要的脚本语言,使得开发者可以创建2D、3D、VR和AR的游戏及应用。在Unity中,与数据库的交互对于存储和检索游戏数据、用户信息或者实现动态内容更新是至关重要的。...

    VB 远程访问Access数据库源代码

    1. **建立连接**:使用Connection对象创建一个到数据库的连接。例如,代码可能如下: ```vb Dim conn As New ADODB.Connection conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\Server\Path\To\...

    dephi数据库开发实例

    《Delphi数据库开发实例》是针对Dephi编程者的一本实用教程,由清华出版社出版,旨在通过具体的案例解析,帮助读者深入理解并掌握Dephi在数据库开发中的应用。这本书不仅适合初学者,也对有一定经验的开发者有很高的...

    web端的增删改查SQLAnyWhere数据库

    例如,如果我们有一个`users`表,我们可能有以下插入新用户的示例: ```sql INSERT INTO users (username, password, email) VALUES ('testUser', 'password123', 'test@example.com'); ``` 在Web应用中,用户...

    初识通用数据库操作类——前端easyui-datagrid,form(php)

    通用数据库操作类是指一个设计良好的数据库访问层,它可以简化数据库的CRUD(创建、读取、更新、删除)操作,并能够复用在不同的项目中。例如,文件描述中提到的actSQL类,它负责与MySQL数据库进行连接,并提供了一...

    SqlWebAdmin【SQL数据库在线管理】

    这款工具对于那些需要在不同地点或者不希望安装桌面客户端的用户来说尤其便利,因为它无需在本地计算机上安装任何额外软件,只需要一个支持ASP.NET的Web服务器和连接到SQL Server的权限。 首先,SqlWebAdmin的核心...

    android连接数据库的增删查改 服务器学生搭建

    - **SQLite**: 是一个轻量级的文件型数据库,非常适合用于Android设备上的本地数据存储。 - **Firebase**: 提供实时数据库和云Firestore等多种选项,支持多平台数据同步。 - **MySQL**: 通常用于后端服务器上,提供...

    基于安卓课堂签到签到系统,教师端+学生端,源代码-服务端-数据库

    该压缩包包含的是一个基于安卓平台的课堂签到系统,主要分为教师端和学生端,同时包括服务端和数据库的相关源代码。这个系统的核心功能是实现课堂签到,且具有扫码登录的功能,使得签到过程更为便捷高效。下面将详细...

    asp使用SQL语句的UpDate命令修改数据库表中的一个记录[收集].pdf

    在ASP中,我们可以通过SQL语句来与数据库进行交互,包括读取、插入、删除和更新数据。本教程主要讲解如何使用ASP结合SQL的Update命令来修改数据库表中的一个记录。 **1. SQL Update命令的基本语法** `UPDATE`命令...

    线上Mysql数据库日常维护与管理

    创建一个新的数据库非常简单,只需执行`CREATE DATABASE test;`即可创建名为`test`的数据库。 3. **选择数据库** 要开始在一个特定的数据库上工作,需要先通过`USE test;`选择该数据库。 4. **查看现有表** ...

    extjs显示数据库

    在处理逻辑中,使用`db.Information`类(假设这是一个封装了数据库操作的类)对`information`表进行查询,并将查询结果转化为JSON格式,以便返回给前端。JSON字符串构建时,使用了`totalProperty`表示总记录数,`...

    基于PHP技术的基因数据库Web平台设计.pdf

    为了解决这一问题,基于PHP技术的基因数据库Web平台提供了一个高效、简洁和快速的操作界面,旨在简化用户对基因数据的检索和查询。 PHP(Hypertext Preprocessor)是一种广泛应用的开源服务器端脚本语言,尤其适合...

    silverlight 连接数据库 实例

    在Silverlight应用中,我们可以创建一个代理类来调用WCF服务或ASP.NET Web API,这些服务在服务器端处理数据库操作,并将结果返回给客户端。 总的来说,"silverlight 连接数据库 实例"是一个关于如何在Silverlight...

    EXCEL使用VBA连接MySQL服务器.txt

    在给定的示例代码中,首先需要确保安装了MySQLODBCConnector,这是一个ODBC(Open Database Connectivity)驱动程序,用于在不同平台上实现MySQL数据库的连接。然后,在VBA环境中,通过引用`Microsoft ActiveX Data ...

    MFC C++6.0 socket通信+ACESS数据库

    在本文中,我们将深入探讨如何使用MFC(Microsoft Foundation Classes)C++6.0与socket通信结合,并且集成ACESS数据库来开发一个条形码识别系统。MFC是微软提供的一个C++类库,用于构建Windows应用程序,而socket...

Global site tag (gtag.js) - Google Analytics