2015-10-20 73 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;