Ошибка типа бита ввода / вывода интеграции Pentaho

Я использую Pentaho Data Integration для многочисленных проектов на работе. Мы преимущественно используем Postgres для нашей базы данных. В одной из наших старых таблиц есть два столбца, для которых установлен тип bit(1) для хранения 0 для false и 1 для true.

Моя задача - синхронизировать рабочую таблицу с копией в нашей среде разработки. Я читаю данные при использовании Table Input и сразу пытаюсь выполнить вставку / обновление. Однако это не удается из-за преобразования в логическое значение с помощью PDI. Я обновил запрос, чтобы привести значения к целым числам, чтобы сохранить 0 и 1, но при повторном его выполнении мое преобразование завершается неудачно, поскольку целое число не может быть битовым значением.

Я несколько дней пробовал разные вещи, например, используя шаг javascript для преобразования в бит, но я не смог успешно прочитать в битовом типе и использовать шаг Insert/Update для хранения данных. Я также не верю, что шаг Вставка / Обновление имеет возможность обновления SQL, который используется для определения типа данных для столбца.

Соединение с базой данных устанавливается с помощью:

  • Тип подключения: PostgreSQL
  • Доступ: собственный (JDBC)
  • Поддерживает логический тип данных: true
  • Цитировать все в базе данных: правда

Примечание: изменение таблицы для изменения типа данных не является обязательным в данный момент. Слишком много приложений в настоящее время зависят от этой таблицы, поэтому ее изменение может привести к нежелательным последствиям.

Любая помощь будет оценена. Спасибо.

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;

Теперь вы должны иметь возможность вставлять / обновлять односимвольные строки в столбец bit(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;

Я решил эту проблему, выписав SQL Insert Postgres (с B'1'и B'0' для значений битов) на предыдущем шаге и используя "Выполнить SQL-скрипт строки" в конце для запуска каждой вставки как отдельных операторов SQL.

Другие вопросы по тегам