Чайник Pentaho: динамические параметры и запрос

Я пытаюсь вставить данные в целевую БД из динамического источника данных, а также его запрос при получении данных. При этом столбцы и таблица для вставки могут различаться. Но дело в том, что столбцы и таблицы сохраняются как строки в таблице в целевой БД. Это означает, что хотя он динамический, у меня уже есть идея, куда его вставить и какие у него столбцы. Итак, да, это предыстория моей проблемы.

В любом случае, проблема на стороне вставки. Я смог сгенерировать оператор SELECT, чтобы получить источник данных, и получил данные, манипулируя данными для получения запроса.

Вот как это выглядит сейчас. Не забывайте о переменных get, именно так я генерирую запросы sql.

Вот как это выглядит сейчас. Не забывайте о переменных get, именно так я генерирую запросы sql. введите здесь описание изображения

Внутри таблицы ввод выглядит следующим образом: введите здесь описание изображения

Вот оператор выполнения SQL: введите здесь описание изображения

Видите динамическую часть? в любом случае, дело в том, что ${INSERT_VALUES} в переменных сценария вставки - все '?' символ, который данные должны быть предоставлены вводом таблицы. Для меня, чтобы определить, сколько столбцов.

Проблема 1: Как вы можете заметить, на шаге «Выполнение оператора SQL» я не передал ни одного параметра для предоставления «?» на вкладыше. Это потому, что я не знаю, что там пометить, потому что параметр/столбцы каждый раз меняются. Зависит от того, какую таблицу вставлять. Есть ли способ приблизиться к этому? Проблема 2: допускает ли пентахо двойную замену? подставьте переменную в ее значение и замените '?' к значению параметра?


person oneofakind    schedule 21.04.2015    source источник


Ответы (1)


Если я правильно понял вашу проблему, каждый раз, когда вы запускаете, вы выбираете определенный столбец, скажем, colA, из данной таблицы, tableX, и вы захотите вставить его в tableY строку, которая выглядит следующим образом:

tableX, colA, valueA

Это оно?

Ну, в таком случае, несколько замечаний:

1) На самом деле вы не используете выходные данные шага «Получить переменные» на шаге «Ввод таблицы». Во входных данных таблицы вы читаете значения переменных, а не поля, которые являются выходными данными шага «Получить переменные».

2) Вы не должны использовать шаг Execute Row SQL Script здесь. Шаг вывода таблицы является лучшим вариантом.

Вот лучший рецепт:

1) Получить переменные: он должен получить следующие переменные и создать следующие поля вывода: ${SQL_STR} сопоставляется с sql_str ${SELECT_COLUMN} с select_column

2) Ввод таблицы: ваш запрос должен выглядеть примерно так

Select
  ? as table,
  ? as column,
  ${SELECT_COLUMN} as value
From (
  ${SQL_STR}
) foo

Вывод вашего шага ввода таблицы состоит из 3 полей:

Строковое значение ${SQL_STR}, строковое значение ${SELECT_COLUMN} и фактическое значение из исходной таблицы.

3) Шаг вывода таблицы записывает в таблицу ${DATA_TABLE_SQL} со следующим сопоставлением полей:

таблица -> столбец dp_table_relation_id -> любое имя столбца, которое у вас есть в целевой таблице для имен столбцов, значение -> любое имя столбца, которое у вас есть в целевой таблице для значений.

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

person nsousa    schedule 21.04.2015
comment
Так вы говорите, в выводе таблицы мне не нужно устанавливать столбцы? Потому что столбцы (через запятую) просты, потому что у меня уже есть. Проблема заключается в настройке полей базы данных в выводе таблицы. Я спросил, потому что, как я уже сказал, в каждом прогоне столбцы могут различаться так же, как и таблица. - person oneofakind; 23.04.2015
comment
вы не должны; если вы их не укажете, имена столбцов будут опущены, поэтому у вас должно быть правильное количество полей и в правильном порядке. - person nsousa; 23.04.2015
comment
хорошо, я понимаю. Что вы имеете в виду под номером 2? как таблица, ? в качестве столбца и ${SELECT_COLUMN} в качестве значения. Просто обратите внимание, что в моем вводе таблицы я уже могу получить данные оттуда. Я попытался поместить его в журнал, и он обнаружил несколько строк. - person oneofakind; 24.04.2015
comment
Знаки вопроса — это параметры JDBC. Они будут заменены полями, поступающими на этот шаг, в том порядке, в котором они поступают. Итак, если ваш входной поток имеет 2 поля, имя_таблицы и имя_столбца, первое? заменяется значением 1-го поля и то же самое для 2-го. Не забудьте заполнить данные вставки из поля и отметить выполнение для каждой входной строки - person nsousa; 24.04.2015
comment
Я думал, что вам нужно заполнить эти поля базы данных в выводе таблицы, поэтому я не пробовал. Но да, я обязательно попробую это. - person oneofakind; 27.04.2015
comment
Как предложил @nsousa, вам, вероятно, потребуется использовать параметры JDBC, то есть знаки вопроса. Важно помнить, что эти аргументы являются последовательными и соответствуют имени поля, которое будет использоваться в качестве списка аргументов. - person Yuval Herziger; 12.05.2015