2008年9月30日 星期二

Heterogeneous Services with different characterset using Oracle10g


/*
  1) connect DB2 using Generic Connectivity
     - odbc configuration
     - change parameter HS_FDS_CONNECT_INFO and make .ora file
     - SQLNet.ora,tnsname.ora,listener.ora
     - create database link
  2) query DB2 (big5) testing table
*/

/* 1) connect DB2 using Generic Connectivity */

/*
  -- 設定 odbc
  資料庫來源名稱: CDIDB
  資料庫別名: CDIDB88
*/





/*
  從 C:\oracle\product\10.2.0\db_1\hs\admin下
  複製 inithsodbc.ora 命名格式 init + DSN Name + .ora
  => initCDIDB88.ora
*/



/*開啟 initCDIDB88.ora 設定參數 HS_FDS_CONNECT_INFO */

HS_FDS_CONNECT_INFO = CDIDB88

/* 開啟 SQLNet.ora 做以下變更 */

SQLNET.AUTHENTICATION_SERVICES= (NTS)

/* 開啟 tnsname.ora 增加以下設定 */

CDIDB88 =
 (DESCRIPTION =
  (ADDRESS_LIST =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ODDYSEY)(PORT = 1521))
   )
  (CONNECT_DATA =
    (SID = CDIDB88)
  )
  (HS = OK)
 )

/* 開啟 listener.ora 增加以下設定 */
 
(SID_DESC =
   (PROGRAM = hsodbc)
   (ORACLE_HOME = c:\oracle\product\10.2.0\db_1)
   (SID_NAME = CDIDB88)
)

/* Listener stop & start */

lsnrctl stop

lsnrctl start

/* connect / as sysdba */

/* create database link */

create database link db2svr
connect to “db2admin”
identified by “db2admin”
using 'CDIDB88';

/* Oracle DB 字元集 */

SQL> select value from nls_database_parameters
2  where parameter = 'NLS_CHARACTERSET';

VALUE
---------------
AL32UTF8


/* Back to CDIDB88 */

C:\>db2 get db config for cdidb88

    資料庫 cdidb88 的資料庫配置
 
 資料庫配置版次           = 0x0a00
 資料庫版次             = 0x0a00

 資料庫專屬區            = TW
 資料庫字碼頁            = 950
 資料庫字碼集            = big5
 資料庫國碼/地區碼         = 88
 資料庫對照順序           = UNIQUE
 替代對照順序     (ALT_COLLATE) =
 ‧
 ‧
 ‧

/* 建立測試 Table & 新增測試資料 */

C:\>db2 create table db2_big5_tab ( col1 varchar(6)) in userspace1
DB20000I SQL 指令已順利完成。

C:\>db2 insert into db2_big5_tab values ('一二三')
DB20000I SQL 指令已順利完成。

/* Back to ORACLE */
/* 透過 Database Link 看 db2 測試table layout */

SQL> desc db2_big5_tab@db2svr

 名稱          空值?       類型
 -------------------- --------------- ----------------
 COL1                   VARCHAR2(6)

/* Oracle 在 select 時不受自己 characterset 的影響,資料可完整顯示 */

SQL> select * from db2_big5_tab@db2svr;

COL1
---------
一二三

/* 新增時也可完整新增至 db2 table */

SQL> insert into db2_big5_tab@db2svr values ('四五六');

已建立 1 個資料列.

SQL> commit;

確認完成.

/* Back to DB2 */
/* 從 db2 看測試 table */

C:\>db2 select * from db2_big5_tab

COL1
------
一二三
四五六

  已選取 2 個記錄。

/* 重建測試 Table */

C:\>db2 drop table db2_big5_tab
DB20000I SQL 指令已順利完成。

C:\>db2 create table db2_big5_tab (col1 char(2)) in userspace1
DB20000I SQL 指令已順利完成。

C:\>db2 insert into db2_big5_tab values ('一')
DB20000I SQL 指令已順利完成。

/* 重新登錄 Oracle */

SQL> desc db2_big5_tab@db2svr
 
 名稱         空值?  類型
 ------------------ ------- ----------------
 COL1             CHAR(2)

/* 看一下內容與長度 */

SQL> select * from db2_big5_tab@db2svr;

COL1
------------


SQL> select lengthb(col1) from db2_big5_tab@db2svr;

LENGTHB(COL1)
-------------
       3