2015-10-20 84 views
1

我在工作中使用Pentaho數據集成進行衆多項目。我們主要使用Postgres來處理我們的數據庫。我們的一個較舊的表格有兩列設置爲鍵入位(1)以將0存儲爲false,將1存儲爲true。Pentaho數據集成輸入/輸出位類型錯誤

我的任務是在開發環境中將生產表與副本進行同步。我正在使用表格輸入讀取數據,並立即嘗試執行插入/更新。但是,由於通過PDI轉換爲布爾值,它失敗了。我更新了查詢以將值轉換爲整數來保留0和1,但是當我再次運行它時,我的轉換失敗,因爲整數不能是一個位值。

我已經找了幾天嘗試不同的東西,如使用JavaScript步驟轉換爲一點,但我一直未能成功地讀取位類型,並使用插入/更新步驟來存儲數據。我也不相信插入/更新步驟能夠更新用於定義列的數據類型的SQL。

該數據庫建立連接使用:

  • 連接類型:PostgreSQL的
  • 訪問:天然(JDBC)
  • 支持布爾數據類型:真
  • 引用所有在數據庫:真

注意:更改表以更改數據類型i在這個時間點上不是可選的。目前太多的應用程序依賴於此表,因此以這種方式改變它可能會導致不良影響

任何幫助,將不勝感激。謝謝。

+0

'...此時不是可選的。目前太多的應用程序依賴於此表,因此以這種方式改變它可能會導致不良影響。「您是否考慮過使用VIEW模擬* old *行爲? (如果數據只用於只讀,則很容易;否則更難) – joop

+0

我遇到過使用PDI和MySQL的情況。相同的用例,在表輸入後立即插入/更新。 MySQL的解決方案是'cast(bit_column_name AS signed)'。但是,我只是用PostgreSQL 9.3數據庫和PDI 5.4穩定性來測試它,並且不需要投射,無論如何。您可以添加源表和目標表的部分DDL,以及您運行的PDI版本嗎? – YuvalHerziger

回答

1

您可以使用「作爲分配」選項在目標數據庫中創建強制對象(例如從字符變爲位)。 AS ASSIGNMENT允許在插入過程中自動應用此投射。 http://www.postgresql.org/docs/9.3/static/sql-createcast.html

這是給你一些證據的概念:

CREATE FUNCTION cast_char_to_bit (arg CHARACTER VARYING) 
    RETURNS BIT(1) AS 
$$ 
    SELECT 
    CASE WHEN arg = '1' THEN B'1' 
     WHEN arg = '0' THEN B'0' 
     ELSE NULL 
    END 
$$ 
LANGUAGE SQL; 

CREATE CAST (CHARACTER VARYING AS BIT(1)) 
WITH FUNCTION cast_char_to_bit(CHARACTER VARYING) 
AS ASSIGNMENT; 

現在,你應該能夠插入/更新單字符字符串成位(1)列。但是,您需要將輸入列轉換爲字符變化/文本,以便在表輸入步驟後將其轉換爲字符串,並在插入/更新步驟中將其轉換爲CHARACTER VARYING。

很可能,您可以使用已經在postgres中定義的現有轉換函數創建轉換對象(請參閱pg_cast,pg_type和pg_proc表,通過oid加入),但不幸的是我沒有設法執行此操作。

編輯1: 對不起,以前的解決方案。添加從布爾到位的轉換看起來更合理:您甚至不需要在表格輸入步驟中投射數據。

CREATE FUNCTION cast_bool_to_bit (arg boolean) 
    RETURNS BIT(1) AS 
$$ 
    SELECT 
    CASE WHEN arg THEN B'1' 
     WHEN NOT arg THEN B'0' 
     ELSE NULL 
    END 
$$ 
LANGUAGE SQL; 

CREATE CAST (BOOLEAN AS BIT(1)) 
WITH FUNCTION cast_bool_to_bit(boolean) 
AS ASSIGNMENT;