2014-05-21 40 views
0

我正嘗試在linux環境下執行以下bteq命令,但無法將數據正確加載到Teradata數據庫服務器。有人可以請建議我解決我在加載時遇到的以下問題。如何使用BTEQ導入將數據從分隔文件導入到Teradata表中?

BTEQ命令用於:

.SET width 64000; 
.SET session transaction btet; 
.logmech ldap 
.logon XXXXXXX/XXXXXXXX,********; 

DATABASE corecm; 

.PACK 1000 
.IMPORT VARTEXT '~' FILE=/v/global/user/application_event_bus_evt 
.REPEAT * 
USING(APPLICATION_EVENT_ID CHAR(24),BUS_EVT_ID CHAR(24),BUS_EVT_VID BIGINT,BUS_EVT_RESTATE_IN SMALLINT) 

insert into corecm.application_event_bus_evt (APPLICATION_EVENT_ID 
, BUS_EVT_ID 
, BUS_EVT_VID 
, BUS_EVT_RESTATE_IN 
) 
values 
(COALESCE(:APPLICATION_EVENT_ID,1) 
, COALESCE(:BUS_EVT_ID,1) 
, COALESCE(:BUS_EVT_VID,1) 
, COALESCE(:BUS_EVT_RESTATE_IN,1) 
) ; 
.LOGOFF; 
.EXIT; 

示例輸入文件DELIMITTER 「〜」[/ V /全局/用戶/ application_event_bus_evt]:

Ckn3gMxLEeOgIQBQVgErYA==~g+GDDtlaY3n7BdUrYshDFA==~1~1 
CL1kEcxLEeOgIQBQVgErYA==~qoKoiuGDbClpcGt/z6RKGw==~1~1 
oYIVcMxKEeOgIQBQVgErYA==~mfmQiwl7yAteevzJfilMvA==~1~1 
5N7ME5bM4xGhM7exj3ykUw==~yFM2FZbM4xGhM7exj3ykUw==~1~0 
JLBH4JfM4xGDH9s5+Ds/8w==~doZ/7pfM4xGDH9s5+Ds/8w==~1~0 
fGvpoMxKEeOgIQBQVgErYA==~mQUQIK2mY6WIPcszfp5BTQ==~1~1 

表定義:

CREATE MULTISET TABLE CORECM.APPLICATION_EVENT_BUS_EVT ,NO FALLBACK , 
    NO BEFORE JOURNAL, 
    NO AFTER JOURNAL, 
    CHECKSUM = DEFAULT, 
    DEFAULT MERGEBLOCKRATIO 
    (
     APPLICATION_EVENT_ID CHAR(26) CHARACTER SET LATIN NOT CASESPECIFIC NOT NULL, 
     BUS_EVT_ID CHAR(26) CHARACTER SET LATIN NOT CASESPECIFIC NOT NULL, 
     BUS_EVT_VID BIGINT NOT NULL, 
     BUS_EVT_RESTATE_IN SMALLINT) 
UNIQUE PRIMARY INDEX (APPLICATION_EVENT_ID ,BUS_EVT_ID ,BUS_EVT_VID) 
INDEX APPLICATION_EVENT_BUS_EVT_IDX1 (APPLICATION_EVENT_ID) 
INDEX APPLICATION_EVENT_BUS_EVT_IDX2 (BUS_EVT_ID ,BUS_EVT_VID); 

在DB服務器中設置的結果爲:

APPLICATION_EVENT_ID  BUS_EVT_ID     BUS_EVT_VID    BUS_EVT_RESTATE_IN 

1 Ckn3gMxLEeOgIQBQVgErYA  == g+GDDtlaY3n7BdUrYshD  85,849,873,219,141,958 12,544 
2 CL1kEcxLEeOgIQBQVgErYA  == qoKoiuGDbClpcGt/z6RK  85,849,873,219,155,783 12,544 
3 oYIVcMxKEeOgIQBQVgErYA  == mfmQiwl7yAteevzJfilM  85,849,873,219,142,006 12,544 
4 5N7ME5bM4xGhM7exj3ykUw  == JAf0GpbM4xGhM7exj3yk  85,849,873,219,155,797 12,288 
5 JLBH4JfM4xGDH9s5+Ds/8w  == Du6T7pfM4xGDH9s5+Ds/  85,849,873,219,155,768 12,288 
6 fGvpoMxKEeOgIQBQVgErYA  == mQUQIK2mY6WIPcszfp5B  85,849,873,219,146,068 12,544 

如果我們看一下數據,我們可以看到兩個問題是,

  1. 前兩列數據長度爲24個字符(按輸入文件),但問題是它已經偏移是2下一列中的字符。

  2. BUS_EVT_VIDBUS_EVT_RESTATE_IN分別有錯誤的數據85,849,873,219,141,958和12,544,而不是1和1(這可能是因爲前兩個數據得到移動)

我嘗試以下選項來解決上述問題,但未能解決問題,

  1. 修改表的定義,即改變數據類型爲CHAR (28),CHAR(24),CHAR(26)
  2. 修改的表定義列 數據類型到VARCHAR(24),VARCHAR(26)
  3. 改性BTEQ命令,在以下線即改變的數據類型, USING(APPLICATION_EVENT_ID CHAR(24),BUS_EVT_ID CHAR(24),BUS_EVT_VID BIGINT, BUS_EVT_RESTATE_IN SMALLINT)

在此先感謝。

回答

1

當你定義VARTEXT所有輸入列必須被定義爲VARCHAR,但你使用CHAR和INT。

因此,需要根據你的目標表的定義工作,VARCHAR長度:

USING(
     APPLICATION_EVENT_ID VARCHAR(26), 
     BUS_EVT_ID   VARCHAR(26), 
     BUS_EVT_VID   VARCHAR(19), 
     BUS_EVT_RESTATE_IN VARCHAR(6) 
    ) 
+0

您的反饋非常感謝。我已成功將數據加載到TD服務器。 :) – Vipul

+0

你能否提供我dataypes轉換爲VARCHAR SIZE,如BIGINT - > VARCHAR(19),SMALLINT - > VARCHAR(6)?我應該假設數據類型所採用的每個數據字節都是VARCHAR SIZE嗎?請指教。 – Vipul

+0

它不是數據類型的內部大小,而是外部表示形式,如字符串。一個SMALLINT可以存儲介於-32768和+32767之間的值,兩個字節在內部,但是5個數字加前導符號爲VARCHAR。 DECIMAL(n,m) - > n位數加逗號加上符號= VARCHAR(n + 2) – dnoeth

相關問題