Как получить набор результатов из динамического SQL-запроса на основе выбора в Pentaho-Kettle? - PullRequest
0 голосов
/ 29 мая 2019

Я хочу выполнить набор SQL-запросов на основе выбора, полученных из элементов узла xml в файле XML, и записать значения соответствующих наборов результатов в файл CSV.Я хотел бы уточнить, что ни одно поле SQL-запроса не параметризовано, но сам полный SQL-запрос выглядит так.

Часть получения полного SQL-запроса выполняется, как и ожидалось, но я не знаю, какчтобы перейти к части запуска SQL-запроса, чтобы я мог получить соответствующий набор результатов для управления им позже.

То, что я пробовал до сих пор безуспешно, таково:

  1. Execute SQL script шаг: в соответствии с тем, что сказано здесь , этот вид шага не получает никакого результата.

  2. Dynamic SQL Row шаг: Я получаю соответствующий sql, пока я жестко кодирую поле 'TemplateSQL', но я не могу этого сделать, потому что запросы sql, полученные на предыдущем шаге, сильно отличаются друг от друга и не предоставляют фиксированную схему метаданных.

  3. Table Input шаг: этот шаг позволяет параметризовать только отдельные значения SQL-запроса, а не полный запрос.

I 'Буду очень признателен, если какой-нибудь эксперт по Пентахо-чайнику скажет мнеправильный способ выполнения задачи, которую я хочу сделать.

Обновление (следуя инструкциям @Cristian Curti): Проблема возникает в KTR-1.Когда вы говорите «вы должны передать этот запрос как переменную другому KTR» , я понимаю, что сначала мне нужно установить значение xml-узла в переменной, а затем передать его в KTR-2.Для этого в моем KTR-1 я использую следующие шаги:

  1. Get Data from XML: я получаю поле 'SQLQuery'.
  2. Set Variables: I 'установив поле 'SQLQuery' в переменной с именем 'QUERY'.(Более того, KTR-1 устанавливается так, как вы сказали, то есть на вкладке «Параметры» я устанавливаю параметр с именем «QUERY»).

Когда я предварительно просматриваю второй шаг KTR-1,Консоль чайника регистрирует следующую ошибку:

Get data from XML.0 - Finished processing (I=2, O=0, R=0, W=2, U=0, E=0)
Set variables.0 - Setting environment variables...
Set variables.0 - Set variable QUERY to value [        
  SELECT "Table1".*, "table2"."field1" FROM "Table1" INNER JOIN "Table2" ON Table1"."PATIENT" = "Table2"."PATIENT" WHERE ("Table1"."field1" > Table1"."field2") AND NOT("field1" BETWEEN 'date1' AND 'date2')     
]
Set variables.0 - ERROR (version 8.2.0.0-342, build 8.2.0.0-342 from 2018-1-14 10.30.55 by buildguy) : Unexpected error
Set variables.0 - ERROR (version 8.2.0.0-342, build 8.2.0.0-342 from 2018-1-14 10.30.55 by buildguy) : org.pentaho.di.core.exception.KettleStepException: 
Set variables.0 - Only 1 input row was expected to set the variables and at least 2 were received.

Кажется, Set Variables шаг ожидает получить только одну строку.Я не знаю, делаю ли я что-то неправильно или что-то упускаю.В случае, если вам нужны дополнительные детали, просто скажите мне.Спасибо.

1 Ответ

1 голос
/ 29 мая 2019

По ссылке, которой вы поделились, следуйте ответу Ришу, часть 2.

В той части, где вы получаете запрос от узлов XML, вы должны передать этот запрос как переменную другому KTR, ина шаге Input Table этого второго KTR используйте $ {variable} в редакторе SQL этого шага.

Должно выглядеть примерно так:

enter image description here

Обновить ответ

Нет, вы использовали неправильный подход.Шаг Set Variables используется, когда вы знаете, что только 1 строка достигнет шага, когда у вас есть несколько строк, достигающих вашего «Результирующего набора», вам нужно использовать Копировать строки> Выполнить для каждого подхода строки.Для этого требуется 1 задание и 2 KTR.

Ваша работа будет выглядеть просто так:

enter image description here

Последний шаг вваш первый KTR будет «Копировать строки в результат».

В задании вам необходимо настроить вторую запись KTR следующим образом:

enter image description here

enter image description here

Имя столбца Stream должно совпадать с тем же именем столбца в первом KTR, который содержит запросы, которые должны быть выполнены, а также с именованным параметром во втором KTR(Изображение с первым ответом) ДОЛЖНО соответствовать параметру в конфигурации JOB, как показано на рисунках.

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

...