Pentaho数据集成输入/输出位类型错误

时间:2015-10-20 16:06:01

标签: postgresql pentaho kettle data-integration pdi

我正在为工作中的众多项目使用Pentaho数据集成。我们主要使用Postgres作为我们的数据库。我们的一个旧表有两列,设置为bit(1)以存储0表示false,1表示true表示。

我的任务是在我们的开发环境中将生产表与副本同步。我正在使用表输入读取数据并立即尝试执行插入/更新。但是,由于PDI转换为布尔值,它失败了。我更新了查询以将值转换为整数以保留0和1,但是当我再次运行它时,我的转换失败,因为整数不能是位值。

我已经找了几天尝试不同的事情,比如使用javascript步骤转换为一点,但我无法成功读取位类型并使用插入/更新步骤来存储数据。我也不相信插入/更新步骤具有更新用于定义列的数据类型的SQL的功能。

使用以下方式设置数据库连接:

  • 连接类型:PostgreSQL
  • 访问:本机(JDBC)
  • 支持布尔数据类型:true
  • 引用数据库中的所有内容:true

注意:此时更改表以更改数据类型不是可选的。目前有太多的应用程序依赖于此表,因此以这种方式对其进行更改可能会导致不良影响

任何帮助将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:1)

您可以使用“as assignment”选项在目标数据库中创建强制转换对象(例如,从字符变为位)。 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)列中。但是,您需要将输入列转换为字符变量/文本,以便在表输入步骤之后将其转换为String,并在插入/更新步骤中转换为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;

答案 1 :(得分:0)

我通过在上一步中写出Postgres插入SQL(位值用B'1'和B'0')并最后使用“ Execute row SQL Script”来单独运行每个插入来解决此问题SQL语句。