我在工作中的许多项目中都使用 Pentaho Data Integration。我们的数据库主要使用 Postgres。我们的一张旧表有两列设置为类型 bit(1) 以存储 0 表示假,1 表示真。
我的任务是将生产表与我们开发环境中的副本同步。我正在使用表输入读取数据并立即尝试执行插入/更新。但是,由于 PDI 转换为 bool 值,它失败了。我更新了查询以将值转换为整数以保留 0 和 1,但是当我再次运行它时,我的转换失败了,因为整数不能是位值。
几天来我一直在尝试不同的方法,例如使用 javascript 步骤转换为位,但我无法成功读取位类型并使用插入/更新步骤来存储数据。我也不认为插入/更新步骤具有更新用于定义列数据类型的 SQL 的功能。
数据库连接使用:
- 连接类型:PostgreSQL
- 访问: native (JDBC)
- 支持 bool 数据类型:true
- 引用数据库中的所有内容:true
注意:更改表以更改数据类型在此时不是可选的。目前有太多应用程序依赖于此表,因此以这种方式更改它可能会导致不良影响
如有任何帮助,我们将不胜感激。谢谢。
最佳答案
您可以使用“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;
现在您应该能够将单字符字符串插入/更新到 bit(1) 列中。但是,您需要将输入列转换为字符变化/文本,以便在表输入步骤之后将其转换为字符串,并在插入/更新步骤中转换为字符变化。
也许,您可以使用现有的转换函数创建转换对象,这些转换函数已经在 postgres 中定义(请参阅 pg_cast、pg_type 和 pg_proc 表,通过 oid 连接),但不幸的是我没能做到这一点。
编辑 1: 抱歉之前的解决方案。添加从 bool 值到位的转换看起来更合理:您甚至不需要在表输入步骤中转换数据。
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;
关于postgresql - Pentaho 数据集成输入/输出位类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33241488/