顯示具有 DB2 - Federation 標籤的文章。 顯示所有文章
顯示具有 DB2 - Federation 標籤的文章。 顯示所有文章

2009年9月2日 星期三

Limitation of Using Merge in DB2 using DB2 Express-C 9.7


Merge Update 有一定的限制,例如想更新的 Table 是個 Nickname 就不行
My Scenario:
Database1: Taurus 建立 Table b1
Database2: Orion 建立 Table a1
         建立 Nickname b1 federated from Taurus

在 Database Orion 對 b1 以 Merge 方式將 a1 的值更新到 b1,則會產生錯誤
SQL0270N 不支援函數 (原因碼 = "67")。 SQLSTATE=42997

67  請勿在 MERGE 陳述式中,指定暱稱或暱稱的視圖作為目標。


My Solutions:
1. 能以傳統Update的語法做更新
2. 在 Database Taurus 上建立 nickname a1,在 Taurus 對 b1 做 merge 語法更新之。

※ 無法藉由 Wrapper Server 增加參數 DB2_TWO_PHASE_COMMIT = 'Y' 來達到目的。


/* 建立測試環境 */

C:\>db2 connect to orion

資料庫連線資訊

資料庫伺服器 = DB2/NT 9.7.0
SQL 授權 ID = ADMINIST...
本端資料庫別名 = ORION

C:\>db2 create table a1 ( col1 integer,col2 varchar(16)) in userspace1
DB20000I SQL 指令已順利完成。

C:\>db2 insert into a1 values (1,'TESTING'),(2,'PRODUCTION')
DB20000I SQL 指令已順利完成。

C:\>db2 terminate
DB20000I TERMINATE 指令已順利完成。

C:\>db2 connect to taurus

  資料庫連線資訊

 資料庫伺服器      = DB2/NT 9.7.0
 SQL 授權 ID      = ADMINIST...
 本端資料庫別名     = TAURUS

C:\>db2 create table b1 ( col1 integer,col2 varchar(16)) in userspace1
DB20000I SQL 指令已順利完成。

C:\>db2 insert into b1(col1) values (1),(2)
DB20000I SQL 指令已順利完成。

C:\>db2 terminate
DB20000I TERMINATE 指令已順利完成。


/* 建立對應Nickname */

C:\>db2 connect to orion

  資料庫連線資訊

 資料庫伺服器      = DB2/NT 9.7.0
 SQL 授權 ID      = ADMINIST...
 本端資料庫別名     = ORION

C:\>db2 create nickname administrator.b1 for w2taurus.administrator.b1
DB20000I SQL 指令已順利完成。

 
/* 在 Orion Database 上對 Nickname 做 Merge Update */

C:\>db2 merge into b1 using a1 on a1.col1 = b1.col1 when matched then update set
b1.col2 = a1.col2

 
/* 產生錯誤訊息 */

DB21034E 指令被當作 SQL 陳述式處理,因為它不是有效的「指令行處理器」指令。 在 SQL 處理程序期間,它已傳回:
SQL0270N 不支援函數 (原因碼 = "67")。 SQLSTATE=42997

/* 不信邪,想試試 Two phase commit */

C:\>db2 connect to orion

  資料庫連線資訊

 資料庫伺服器      = DB2/NT 9.7.0
 SQL 授權 ID      = ADMINIST...
 本端資料庫別名     = ORION

C:\>db2 alter server w2taurus options (add DB2_TWO_PHASE_COMMIT 'Y')
DB20000I SQL 指令已順利完成。

 
/* 依舊失敗 */

C:\>db2 merge into b1 using a1 on a1.col1 = b1.col1 when matched then update set
b1.col2 = a1.col2

DB21034E 指令被當作 SQL 陳述式處理,因為它不是有效的「指令行處理器」指令。 在SQL 處理程序期間,它已傳回:
SQL0270N 不支援函數 (原因碼 = "67")。 SQLSTATE=42997

 
/* 再建在 Taurus 上試試 */

C:\>db2 connect to taurus

  資料庫連線資訊

 資料庫伺服器      = DB2/NT 9.7.0
 SQL 授權 ID      = ADMINIST...
 本端資料庫別名     = TAURUS

C:\>db2 alter server w2orion options(add DB2_TWO_PHASE_COMMIT 'Y')
DB20000I SQL 指令已順利完成。


/* 回到 Database Orion 再試 */

C:\>db2 connect to orion

  資料庫連線資訊

 資料庫伺服器      = DB2/NT 9.7.0
 SQL 授權 ID      = ADMINIST...
 本端資料庫別名     = ORION

C:\>db2 merge into b1 using a1 on a1.col1 = b1.col1 when matched then update set
b1.col2 = a1.col2
DB21034E 指令被當作 SQL 陳述式處理,因為它不是有效的「指令行處理器」指令。 在SQL 處理程序期間,它已傳回:
SQL0270N 不支援函數 (原因碼 = "67")。 SQLSTATE=42997

2008年9月25日 星期四

Federated UTF-8 and BIG5 databases using DB2 9


/*
  DATABASES:
        ORIONDB (codeset UTF-8)
        BIG5DB (codeset BIG5)
  TABLES:
        ORIONDB.UTF8_TAB
        BIG5DB.BIG5_TAB
  Create nickname UTF8_TAB on Database BIG5DB for ORIONDB.UTF8_TAB
  Create nickname BIG5_TAB on Database ORIONDB for BIG5DB.BIG5_TAB
  Insert multi-byte characters respectively
*/

/* check codeset on ORIONDB */

C:\>db2 get db cfg for oriondb

    資料庫 oriondb 的資料庫配置

 資料庫配置版次              = 0x0c00
 資料庫版次                = 0x0c00

 資料庫專屬區               = TW
 資料庫字碼頁               = 1208
 資料庫字碼集               = UTF-8
 資料庫國碼/地區碼            = 88
 資料庫對照順序              = IDENTITY
 ‧
 ‧
 ‧

/* Create Database BIG5DB */

create database big5db on 'c:\' using codeset BIG5 TERRITORY TW COLLATE using SYSTEM

C:\>db2 get db cfg for big5db

    資料庫 big5db 的資料庫配置

 資料庫配置版次              = 0x0c00
 資料庫版次                = 0x0c00

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

/* Connect to BIG5DB */

C:\>db2 connect to big5db

  資料庫連線資訊

 資料庫伺服器      = DB2/NT 9.5.0
 SQL 授權 ID      = ORION
 本地資料庫別名     = BIG5DB

/* Create Table BIG5_TAB on BIG5DB */

CREATE TABLE BIG5_TAB
(
  COL1 VARCHAR(10)
) IN USERSPACE1

INSERT INTO BIG5_TAB VALUES ('BIG-5')


/*
  Create Wrapper and Server on database BIG5DB for database ORIONDB
  to create nickname later.
  Server name: BIG5DB
*/

/* Connect to ORIONDB */

C:\>db2 connect to oriondb

  資料庫連線資訊

 資料庫伺服器      = DB2/NT 9.5.0
 SQL 授權 ID      = ORION
 本地資料庫別名     = ORIONDB

/* Create Table UTF8_TAB on ORIONDB */

CREATE TABLE UTF8_TAB
(
  COL1 VARCHAR(12)
) IN USERSPACE1

INSERT INTO UTF8_TAB VALUES ('UTF8')

/* Create Nickname BIG5_TAB on ORIONDB */

C:\>db2 create nickname orion.big5_tab for big5db.orion.big5_tab
DB20000I SQL 指令已順利完成。


/*
  Back to BIG5DB
  Create Nickname UTF8_TAB on BIG5DB
*/


C:\>db2 connect to big5db

  資料庫連線資訊

 資料庫伺服器      = DB2/NT 9.5.0
 SQL 授權 ID      = ORION
 本地資料庫別名     = BIG5DB

C:\>db2 create nickname orion.utf8_tab for oriondb.orion.utf8_tab
DB20000I SQL 指令已順利完成。

C:\>db2 select * from utf8_tab

COL1
------------
UTF8

  已選取 1 個記錄。

/* Check Nickname Layout */

C:\>db2 describe table utf8_tab

直欄名稱 綱目   資料類型名稱  長度  比例 Null
------- --------- ------------ ------ ---- ------
COL1  SYSIBM   VARCHAR     12   0  是

  已選取 1 個記錄。

/* Check Data using HEX */

C:\>db2 select hex(col1) from utf8_tab fetch first 1 row only

1
------------------------
EFBCB5EFBCB4EFBCA6EFBC98

  已選取 1 個記錄。

/* Check HEX Data which Database BIG5DB use exactly */

C:\>db2 select hex('一') from sysibm.sysdummy1

1
----
A440

  已選取 1 個記錄。

/* It would be failed as inserting more than four multi-byte characters */

C:\>db2 insert into utf8_tab values ('一二三四五')
DB21034E 指令被當作 SQL 陳述式處理,因為他不是有效的「指令行處理器」指令。 在SQL 處理程序期間,他已傳回:
SQL1822N 從資料來源 "ORIONDB" 接收到的非預期錯誤碼"22001"。相關的文字及記號為 "func="SQLExecute" msg=" SQL0433N 值 "一二三四五"太長。"。 SQLSTATE=560BD

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

/* Back to Database ORIONDB */

C:\>db2 connect to oriondb

  資料庫連線資訊

 資料庫伺服器      = DB2/NT 9.5.0
 SQL 授權 ID      = ORION
 本地資料庫別名     = ORIONDB


/*
  two multi-byte characters are failed to select
  real value is 'BIG-5'
*/


C:\>db2 select * from big5_tab

COL1
----------
BIG

  已選取 1 個記錄。

/* Check Nickname Layout */

C:\>db2 describe table big5_tab

直欄名稱 綱目   資料類型名稱  長度  比例 Null
------- --------- ------------ ------ ---- ------
COL1  SYSIBM   VARCHAR     10   0  是

  已選取 1 個記錄。

/* You can insert precise length data, but fail to select completely */

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

C:\>db2 select * from big5_tab

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

  已選取 2 個記錄。

/* Check hex data from big5_tab */

C:\>db2 select hex(col1) from big5_tab fetch first 1 row only

1
------------------------------
A2D0A2D7A2D5A1D0A2B4

已選取 1 個記錄。

/* Check HEX Data which Database ORIONDB use exactly */

C:\>db2 select hex('一') from sysibm.sysdummy1

1
------
E4B880

已選取 1 個記錄。


/*
  Alter nickname big5_tab (length / 2 * 3)
  to show whole data
*/


C:\>db2 alter nickname orion.big5_tab alter column col1 local type varchar(15)
DB20000I SQL 指令已順利完成。

C:\>db2 select * from big5_tab

COL1
---------------
BIG-5
一二三四五

  已選取 2 個記錄。


/*
  after delete record where col1 = '一二三四五'
  I found something really odd:
  select with fetch or not will have very different result on hex
*/


C:\>db2 select hex(col1) from big5_tab

1
--------------------
EFBCA2EFBCA9EFBCA720

  已選取 1 個記錄。

C:\>db2 select hex(col1) from big5_tab fetch first 1 row only

1
--------------------
A2D0A2D7A2D5A1D0A2B4

  已選取 1 個記錄。

/* And it happened on Multi-Byte Characters */


/*
  Back to BIG5DB
  Create Nickname UTF8_TAB2 on BIG5DB
*/


C:\>db2 connect to big5db

  資料庫連線資訊

 資料庫伺服器      = DB2/NT 9.5.0
 SQL 授權 ID      = ORION
 本地資料庫別名     = BIG5DB

C:\>db2 create table big5_tab2 ( col1 integer,col2 varchar(10) ) in userspace1
DB20000I SQL 指令已順利完成。

/* insert testing data */
inesrt into big5_tab2 values (1,'odd'),(2,'ODD')

/* Connect ORIONDB again */

C:\>db2 connect to oriondb

  資料庫連線資訊

 資料庫伺服器      = DB2/NT 9.5.0
 SQL 授權 ID      = ORION
 本地資料庫別名     = ORIONDB

C:\>db2 create nickname orion.big5_tab2 for big5db.orion.big5_tab2
DB20000I SQL 指令已順利完成。

C:\>db2 select col1,col2,hex(col2) from big5_tab2 fetch first 2 row only

COL1 COL2  3
----- ------ --------------------
  1 odd  6F6464
  2 ODD A2DDA2D2A2D2

  已選取 2 個記錄。

C:\>db2 select col1,col2,hex(col2) from big5_tab2

COL1 COL2  3
---- ------ --------------------
  1 odd  6F6464
  2 ODD EFBCAFEFBCA4EFBCA4

  已選取 2 個記錄。