Teradata TPT處理Unicode方法

miguelmin發表於2012-03-24
使用TPT做資料同步時報錯:TPT12108: Output Schema does not match data from SELECT statement。測試發現,同步不包含Unicode字符集的表時,沒有任何問題,同步包含Unicode字符集的表示,提示上述錯誤。那麼,該問題怎麼解決呢?[@more@]

上述錯誤的原因可以解釋為:There is a schema mismatch between the schema defined in TPT script and the schema returned from the select request sent to DBS.

要避免此問題其實比較簡單,你只需要設定與session字符集相匹配的欄位長度即可:
如果你在TPT指令碼中將session的字符集設定為UTF8,你需要:
-- 將Unicode欄位的長度設定為原來的3倍;
-- 將LATIN欄位的長度設定為原來的2倍.

如果你在TPT指令碼中將session的字符集設定為UTF16,你需要 :
-- 將所有Unicode及LATIN欄位的長度均設為原欄位長度的2倍。

以session字符集設為UTF16舉例說明如下:

源表:
CREATE MULTISET TABLE TESTDB.SMS_E9_DAILY_NEW_OLD
(
data_date DATE FORMAT 'YYYYMMDD' TITLE '日期',
area VARCHAR(10) CHARACTER SET UNICODE NOT CASESPECIFIC TITLE '區域名稱',
cdsc_type_lvl2 VARCHAR(8) CHARACTER SET UNICODE NOT CASESPECIFIC TITLE '套餐名稱',
CDSC_3G_type VARCHAR(8) CHARACTER SET UNICODE NOT CASESPECIFIC TITLE '3G套餐名稱',
Sum_New_Users INTEGER TITLE '新增使用者數',
Sum_Combi_Users INTEGER TITLE '新增融合使用者')
PRIMARY INDEX ( data_date ,area ,cdsc_type_lvl2 ,CDSC_3G_type );

可以看到,上述表有三個Unicode欄位,其長度分別為10,8,8,因此TPT指令碼需要定義為:
USING CHARACTER SET UTF16

DEFINE JOB APPMART_SMS_E9_DAILY_NEW_OLD
(
DEFINE SCHEMA TDSCHEMA
DESCRIPTION 'SCHEMA DEFINITION'
(
data_date INTDATE,area VARCHAR(20),cdsc_type_lvl2 VARCHAR(16),CDSC_3G_type VARCHAR(16),Sum_New_Users INTEGER,Sum_Combi_Users INTEGER
);

DEFINE OPERATOR EXPORT_OPERATOR
TYPE EXPORT
SCHEMA TDSCHEMA
ATTRIBUTES
(
VARCHAR PrivateLogName = 'export_log',
...
);

DEFINE OPERATOR UPDATE_OPERATOR
TYPE UPDATE
SCHEMA *
ATTRIBUTES
(
VARCHAR UserName='SYSDBA',
...
VARCHAR WorkingDatabase
);

APPLY ('insert into TESTDB.SMS_E9_DAILY_NEW_OLD (data_date,area,cdsc_type_lvl2,CDSC_3G_type,Sum_New_Users,Sum_Combi_Users) values (:data_date,:area,:cdsc_type_lvl2,:CDSC_3G_type,:Sum_New_Users,:Sum_Combi_Users);') TO OPERATOR (UPDATE_OPERATOR[1])
SELECT * FROM OPERATOR (EXPORT_OPERATOR[1]);
);

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16723161/viewspace-1057703/,如需轉載,請註明出處,否則將追究法律責任。

相關文章