測試條件: 假設某公司總部在北京,新疆有其下屬的一個分公司。在本次測試中,新疆的電腦為本機電腦,即本要的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 dual@SIDBJ.US.ORACLE.COM 如果返回結果如下則表示串連成功了。 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 bj_test@SIDBJ.US.ORACLE.COM 查詢結果: 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下通過測試。 |