更多文章參見:http://blog.csdn.Net/xjzdr
測試條件:
假設某公司總部在北京,新疆有其下屬的一個分公司。在本次測試中,新疆的計算機為本地計算機,即本要的IP地址為:192.168.1.100
北京的總部有一個集中的數據庫,其SID是SIDBJ,用戶名:userbj,密碼:bj123,北京的IP地址是:192.168.1.101。
在本地(新疆)的分公司也有一個數據庫,其SID是SIDXJ,用戶:userxj,密碼:xj123,新疆的IP地址是:192.168.1.100。
要將本地新疆的SIDXJ數據庫中訪問到北京的數據庫SIDBJ中的數據。
也就是說,在sidxj的數據庫中,用戶userxj(192.168.1.100)需要建立DBLINK,以userbj的用戶身份訪問sidBJ(192.168.1.101)中的數據。
測試環境:兩個數據庫均建立在WINXP上,ORACLE的版本均為Oracle817
建立環境時,要注意關閉兩台計算機上的Windows的防火牆,否則,會出現能ping通,但Oracle連接不通的情況。
1、問:如何返回數據庫的GLOBAL_NAME?
執行SELECT * FROM GLOBAL_NAME;
北京的數據庫的GLOBAL_NAME為SIDBJ.US.Oracle.COM
新疆的數據庫的GLOBAL_NAME為SIDXJ
2、問:如何查看Global_name參數是true還是False?
答:執行:SQL> show parameter global_name;
執行的結果如下:
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
global_names boolean TRUE
表示該參數是true.
該參數為true時,你在本地建立的DBLINK的名稱必須和遠程的Global_name一致才行。
3、問:查看遠程數據徊是否支持高級復制功能。
答:通過查看v$option視圖,如果其中Advanced replication為TRUE,則支持高級復制功能;否則不支持。
執行語句為:select * from v$option;
也可以執行select * from v$option where PARAMETER=''Advanced replication''語句,
如何返回值為True,那麼就是支持,否則就是不支持。在兩個數據庫中都是檢查是否支持才行。
建立步驟:
1、在本地建立一個Oracle的客戶端連接tns_xj_to_bj,用於連接北京的數據庫。
在北京的數據庫中,建立一個表用於測試。
create table USERBJ.BJ_TEST
(
STU_ID NUMBER,
STU_NAME VARCHAR2(100)
)
在其中增加一條記錄:
insert into BJ_TEST (STU_ID, STU_NAME)
values (1, ''鐘德榮'');
2、新建一個連接tnsxj,用於連接本地的sidxj數據庫,以tnsxj/userxj/xj123登錄到PLSQL中。
下面開始創建連接到北京的遠程數據連接DBLink。
create database link SIDBJ.US.Oracle.COM connect to userbj identifIEd by bj123 using ''tns_xj_to_bj'';
其中:SIDBJ.US.Oracle.COM是遠程的數據庫的global_name,userbj是連接SIDBJ的用戶名,
bj123是userbj的密碼,
tns_xj_to_bj是本地建立的連接到北京的數據庫的服務名。
3、測試連接是否成功:
select * from [email protected]
如果返回結果如下則表示連接成功了。
DUMMY
-----
X
4、在本地數據為中查詢已經建立的遠程連接名:
SQL> select owner,object_name from dba_objects where object_type=''DATABASE LINK'';
OWNER OBJECT_NAME
------------------------------ --------------------------------------------------------------------------------
SYSTEM SIDBJ.US.Oracle.COM
USERXJ DBLINK_XJ_TO_BJ
USERXJ SIDBJ
5、至此,在新疆的計算機上建立了一個DBLINK,用於連接到北京的數據庫上,
在新疆的數據庫中查詢北京的數據庫中表的信息:
select * from [email protected]
查詢結果:
STU_ID STU_NAME
---------- --------------------------------------------------------------------------------
1 鐘德榮
表示查詢是正常的。
6、關於global_name參數的測試
create database link a connect to userbj identifIEd by bj123 using ''tns_xj_to_bj'';
建立了一個DBLINK,執行下面的查詢:
select owner,object_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 bj123 using ''tns_xj_to_bj''; --創建DBLINK
select owner,object_name from dba_objects where object_type=''DATABASE LINK'';--查詢現有的DBLINK
select * from bj_test@a--查詢遠程表
7、下面在SIDXJ中建立存儲過程,通過DBLINK檢索遠程數據庫SIDBJ, 存儲過程如下:
CREATE OR REPLACE PROCEDURE test_cur
as
strSql1 varchar2(1000);
t_stu_name varchar2(100);
TYPE TCUR IS REF CURSOR;
CUR TCUR;
begin
strSql1:=''select stu_name from bj_test@a'';
OPEN CUR FOR strSql1;
LOOP
FETCH CUR INTO t_stu_name;
EXIT WHEN CUR%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(t_stu_name);
END LOOP;
CLOSE CUR;
end test_cur;
測試存儲過程顯示,輸出了過程數據庫中的STU_NAME的值。
以上腳本全部在Oracle817下通過測試。