`
huanghuizz
  • 浏览: 84164 次
  • 性别: 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
分享到:
评论

相关推荐

    网狐6.6 服务器源代码 & 共享组件 & 数据库 (4)

    网狐6.6 服务器源代码&共享组件&数据库,包括服务器端所有组件(内核除外,现在市面上还没有6.6内核),共享组件(公共服务,界面控件,界面资源),以及全部数据库文件和脚本文件,6.6较6.5有较大改动,是学习研究...

    orcale常用命令

     dictionary 全部数据字典表的名称和解释,它有一个同义词dict dict_column 全部数据字典表里字段名称和解释 如果我们想查询跟索引有关的数据字典时,可以用下面这条SQL语句: SQL>select * from dictionary ...

    informix 实用大全

    43.7 用服务器端例程将功能移到数据库中 43.8 处理未来数据类型:将任何位流存放为对象,而不是哑blob 43.9 informix如何建立iif.2000 43.10 更多信息 43.11 informix与其他参考资料 第44章 使用ids....

    网狐6.6 服务器源代码 & 共享组件 & 数据库 (3)

    网狐6.6 服务器源代码&共享组件&数据库,包括服务器端所有组件(内核除外,现在市面上还没有6.6内核),共享组件(公共服务,界面控件,界面资源),以及全部数据库文件和脚本文件,6.6较6.5有较大改动,是学习研究...

    网狐6.6 服务器源代码 & 共享组件 & 数据库 (6)

    网狐6.6 服务器源代码&共享组件&数据库,包括服务器端所有组件(内核除外,现在市面上还没有6.6内核),共享组件(公共服务,界面控件,界面资源),以及全部数据库文件和脚本文件,6.6较6.5有较大改动,是学习研究...

    网狐6.6 服务器源代码 & 共享组件 & 数据库(1)

    网狐6.6 服务器源代码&共享组件&数据库,包括服务器端所有组件(内核除外,现在市面上还没有6.6内核),共享组件(公共服务,界面控件,界面资源),以及全部数据库文件和脚本文件,6.6较6.5有较大改动,是学习研究...

    网狐6.6 服务器源代码 & 共享组件 & 数据库 (5)

    网狐6.6 服务器源代码&共享组件&数据库,包括服务器端所有组件(内核除外,现在市面上还没有6.6内核),共享组件(公共服务,界面控件,界面资源),以及全部数据库文件和脚本文件,6.6较6.5有较大改动,是学习研究...

    网狐6.6 服务器源代码 & 共享组件 & 数据库 (7)完毕

    网狐6.6 服务器源代码&共享组件&数据库,包括服务器端所有组件(内核除外,现在市面上还没有6.6内核),共享组件(公共服务,界面控件,界面资源),以及全部数据库文件和脚本文件,6.6较6.5有较大改动,是学习研究...

    php网络开发完全手册

    14.3 如何创建一个数据库与表 223 14.3.1 登录与退出MySQL的命令行 14.3.1 管理模式 223 14.3.2 MySQL的数据库操作 224 14.3.3 表的创建 225 14.4 数据类型的介绍 228 14.5 索引与唯一值的介绍 229 14.6 数据的操作 ...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    主要从对项目的经济上进行分析评价,一方面是支出的费用,包括设备购置费、管理和维护费用、人员工资和培训费等,另一个是取得的收益。这是个小型的系统,从投入的人力,财力与物力来讲是非常小的,发布出去之需要...

    vc++ 应用源码包_6

    非常好的一个实例,把网络连接的UDP/TCP都插入到CList控件中显示出来。 VC++视频捕捉系统 win32下 视频操作。 VC++视频会议系统(完整)有开发文档。使用了系统自带的视频。 Windows核心编程(第五版)随书源代码 ...

    vc++ 应用源码包_1

    非常好的一个实例,把网络连接的UDP/TCP都插入到CList控件中显示出来。 VC++视频捕捉系统 win32下 视频操作。 VC++视频会议系统(完整)有开发文档。使用了系统自带的视频。 Windows核心编程(第五版)随书源代码 ...

    vc++ 应用源码包_5

    非常好的一个实例,把网络连接的UDP/TCP都插入到CList控件中显示出来。 VC++视频捕捉系统 win32下 视频操作。 VC++视频会议系统(完整)有开发文档。使用了系统自带的视频。 Windows核心编程(第五版)随书源代码 ...

    vc++ 应用源码包_2

    非常好的一个实例,把网络连接的UDP/TCP都插入到CList控件中显示出来。 VC++视频捕捉系统 win32下 视频操作。 VC++视频会议系统(完整)有开发文档。使用了系统自带的视频。 Windows核心编程(第五版)随书源代码 ...

    vc++ 应用源码包_3

    非常好的一个实例,把网络连接的UDP/TCP都插入到CList控件中显示出来。 VC++视频捕捉系统 win32下 视频操作。 VC++视频会议系统(完整)有开发文档。使用了系统自带的视频。 Windows核心编程(第五版)随书源代码 ...

    超级有影响力霸气的Java面试题大全文档

    例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。 当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望...

    java 面试题 总结

    例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。 当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望...

    vc++ 开发实例源码包

    另外有只打开一个应用程序、CRichEdit的使用、最小到托盘、自动检测在线用户(多播组)等。 FreeBird2011Dlg.h 主对话框类头文件 MultiGroup.h 多播组类头文件 UserLink.h 用户链表类头文件 ListenSocket.h 侦听接口...

    最全的oracle常用命令大全.txt

     dictionary 全部数据字典表的名称和解释,它有一个同义词dict dict_column 全部数据字典表里字段名称和解释 如果我们想查询跟索引有关的数据字典时,可以用下面这条SQL语句: SQL>select * from dictionary ...

Global site tag (gtag.js) - Google Analytics