2

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

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

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

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

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

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

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

4

2 回答 2

1

您可以使用“作为分配”选项在目标数据库中创建转换对象(例如从字符变化到位)。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) 列中。但是,您需要将输入列转换为字符变化/文本,以便在表输入步骤之后将其转换为字符串,并在插入/更新步骤中将其转换为 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;
于 2015-10-23T12:35:23.570 回答
0

我通过在上一步中写出 Postgres 插入 SQL(位值使用 B'1' 和 B'0')并在最后使用“执行行 SQL 脚本”将每个插入作为单独的 SQL 语句运行来解决这个问题。

于 2020-10-06T03:21:32.083 回答