2015-10-20 2 views
1

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

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

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

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

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

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

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

+0

'... не является обязательным в данный момент времени. Слишком много приложений в настоящее время зависят от этой таблицы, поэтому ее изменение таким образом может вызвать нежелательные последствия. Вы считали, что вы эмулируете поведение * old * с помощью VIEW? (легко, если данные используются только для чтения, в противном случае сложнее) – joop

+0

Я столкнулся с PDI и MySQL.Один и тот же вариант использования, вставка/обновление сразу после ввода таблицы. Решение с MySQL было «cast (bit_column_name AS signed)». Тем не менее, я просто протестировал его с базой данных PostgreSQL 9.3 и PDI 5.4-stable, и никакого литья не требуется. Можете ли вы добавить частичный 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) столбец. Тем не менее, вам нужно будет указать столбец ввода на символ, изменяющийся/текст, чтобы он был преобразован в String после шага ввода таблицы и CHARACTER VARYING на этапе вставки/обновления.

Возможно, вы можете создать объект литья, используя существующие функции литья, которые уже определены в postgres (см. Pg_cast, pg_type и pg_proc tables, join by 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; 
Смежные вопросы