测试条件
假设某公司总部在北京新疆有其下属的一个分公司在本次测试中新疆的计算机为本地计算机即本要的IP地址为
北京的总部有一个集中的数据库其SID是SIDBJ用户名userbj密码bj北京的IP地址是
在本地(新疆)的分公司也有一个数据库其SID是SIDXJ用户userxj密码xj新疆的IP地址是
要将本地新疆的SIDXJ数据库中访问到北京的数据库SIDBJ中的数据
也就是说在sidxj的数据库中用户userxj()需要建立DBLINK以userbj的用户身份访问sidBJ()中的数据
测试环境两个数据库均建立在WINXP上ORACLE的版本均为Oracle
建立环境时要注意关闭两台计算机上的Windows的防火墙否则会出现能ping通但Oracle连接不通的情况
问如何返回数据库的GLOBAL_NAME?
执行SELECT * FROM GLOBAL_NAME;
北京的数据库的GLOBAL_NAME为SIDBJUSORACLECOM
新疆的数据库的GLOBAL_NAME为SIDXJ
问如何查看Global_name参数是true还是False?
答执行SQL> show parameter global_name;
执行的结果如下
NAME TYPE VALUE
global_names boolean TRUE
表示该参数是true
该参数为true时你在本地建立的DBLINK的名称必须和远程的Global_name一致才行
问查看远程数据徊是否支持高级复制功能
答通过查看v$option视图如果其中Advanced replication为TRUE则支持高级复制功能否则不支持
执行语句为select * from v$option;
也可以执行select * from v$option where PARAMETER=Advanced replication语句
如何返回值为True那么就是支持否则就是不支持在两个数据库中都是检查是否支持才行
建立步骤
在本地建立一个Oracle的客户端连接tns_xj_to_bj用于连接北京的数据库
在北京的数据库中建立一个表用于测试
create table USERBJBJ_TEST
(
STU_ID NUMBER
STU_NAME VARCHAR()
)
在其中增加一条记录
insert into BJ_TEST (STU_ID STU_NAME)
values ( 钟德荣);
新建一个连接tnsxj用于连接本地的sidxj数据库以tnsxj/userxj/xj登录到PLSQL中
下面开始创建连接到北京的远程数据连接DBLink
create database link SIDBJUSORACLECOM connect to userbj identified by bj using tns_xj_to_bj;
其中SIDBJUSORACLECOM是远程的数据库的global_nameuserbj是连接SIDBJ的用户名bj是userbj的密码
tns_xj_to_bj是本地建立的连接到北京的数据库的服务名
测试连接是否成功
select * from dual@SIDBJUSORACLECOM
如果返回结果如下则表示连接成功了
DUMMY
X
在本地数据为中查询已经建立的远程连接名
SQL> select ownerobject_name from dba_objects where object_type=DATABASE LINK;
OWNER OBJECT_NAME
SYSTEM SIDBJUSORACLECOM
USERXJ DBLINK_XJ_TO_BJ
USERXJ SIDBJ
至此在新疆的计算机上建立了一个DBLINK用于连接到北京的数据库上
在新疆的数据库中查询北京的数据库中表的信息
select * from bj_test@SIDBJUSORACLECOM
查询结果
STU_ID STU_NAME
钟德荣
表示查询是正常的
关于global_name参数的测试
create database link a connect to userbj identified by bj using tns_xj_to_bj;
建立了一个DBLINK执行下面的查询
select ownerobject_name from dba_objects where object_type=DATABASE LINK;
可以看到已经建立了名为a的DBLINK
但执行下面的查询检索远程数据时就会出现错误
select * from bj_test@a
原因是因为本地数据库的global_names的参数值为true所以dblink的名称必须和远程数据库的global_names相同
要修改本地数据库的global_names参数为false;(注意是修改本地数据库SIDXJ通过测试修改过程的参数不行过程的global_names参数为TRUE还是为FALSE没有关系)
使用下面的语句修改该参数
SQL> alter system set global_names=false;
再执行下面的几步即可查询出数据
create database link a connect to userbj identified by bj using tns_xj_to_bj; 创建DBLINK
select ownerobject_name from dba_objects where object_type=DATABASE LINK;查询现有的DBLINK
select * from bj_test@a查询远程表
下面在SIDXJ中建立存储过程通过DBLINK检索远程数据库SIDBJ 存储过程如下
CREATE OR REPLACE PROCEDURE test_cur
as
strSql varchar();
t_stu_name varchar();
TYPE TCUR IS REF CURSOR;
CUR TCUR;
begin
strSql:=select stu_name from bj_test@a;
OPEN CUR FOR strSql;
LOOP
FETCH CUR INTO t_stu_name;
EXIT WHEN CUR%NOTFOUND;
DBMS_OUTPUTPUT_LINE(t_stu_name);
END LOOP;
CLOSE CUR;
end test_cur;
测试存储过程显示输出了过程数据库中的STU_NAME的值
以上脚本全部在ORACLE下通过测试