Talend: база данных запросов с уже определенными строками / параметрами

Как я могу выполнить запрос к моей базе данных (используя tOracleInput), например Select, и использовать строки, которые уже определены как параметры в других компонентах, например, в ' tFlowToIterate '?

Например: «ВЫБРАТЬ * из ТАБЛИЦЫ_X, где FIELD_X =?

Мой '?' - это переменная, полученная из моего компонента tFlowToIterate (foo). Я уже пробовал использовать (String) globalMap.get ("foo") и другие подобные формы ...

Спасибо

[Talend Open Studio для интеграции данных v5.3.1; БД: Oracle]


person user2144555    schedule 04.12.2013    source источник
comment
Шаг 3 из ваших обязанностей? ;) Дайте мне 5 минут, чтобы лучше понять ваши потребности   -  person Gabriele B    schedule 04.12.2013
comment
:) Я обнаружил, что у tMysqlRow есть таблица PreparedStatement на вкладке Advanced settings. Это то, что мне нужно. Но я использую Oracle BD.   -  person user2144555    schedule 04.12.2013
comment
Думаю, я могу использовать компонент tOracleRow вместо tOracleInput.   -  person user2144555    schedule 04.12.2013


Ответы (2)


Вы сами ответили. Компонент tOracleInput принимает запрос как параметр. Это очень скучная java String, ни больше ни меньше. Это означает, что если вы хотите использовать элемент globalMap внутри запроса, вам просто нужно выполнить конкатенацию java String. Что-то подобное:

"SELECT * from TABLE_X where FIELD_X='" + (String)globalMap.get("foo") + "'"

но это не сработает (внимательно посмотрите на цитаты):

"SELECT * from TABLE_X where FIELD_X='(String)globalMap.get("foo")'"

Имейте в виду, что если вы напишете запрос, используя конкатенацию строк и внешние переменные, редактор запросов, вероятно, испортит все кавычки, создав неверный запрос.

В качестве общего совета я никогда не предлагаю использовать оператор «*» внутри компонента ввода базы данных, такого как tOracleInput. Talend имеет структуру с фиксированной схемой, которая создается во время компиляции. Это означает, что если однажды вы добавите столбец в TABLE_X, ваш ETL выйдет из строя.

Более надежное решение следующее:

  1. Запишите свой запрос с помощью оператора *
  2. Нажмите «Предположить схему», чтобы получить схему таблицы и вставить метаданные компонента.
  3. Теперь нажмите «Угадай запрос», чтобы явно переписать свой SELECT.
  4. При необходимости исправьте запрос (например, условия WHERE, ...).
person Gabriele B    schedule 04.12.2013

Вам просто нужно объединить его с вашей переменной.

Итак, в вашем случае это будет выглядеть так:

"SELECT *
FROM TABLE_X
WHERE FIELD_X = '" + (String)globalMap.get("foo") + "'"
person ydaetskcoR    schedule 04.12.2013