Как реализовать INSERT, где не существует для ORACLE в Mule4 - PullRequest
0 голосов
/ 25 апреля 2020

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

Я надеялся, что смогу реализовать его с помощью Mule db: вставить компонент и использовать скрипт INSERT WHERE NOT EXISTS SQL, как показано ниже.

INSERT INTO TL_MAPPING_TOUR(TOURNO,TLID,SYSTEM) select :tourno,:tlid,:system from DUAL 
where not exists(select * from TL_MAPPING_TOUR where (TOURNO=:tourno and TLID=:tlid and SYSTEM=:system))

Однако это приводит к исключению Mule

Message               : ORA-01722: invalid number
Error type            : DB:BAD_SQL_SYNTAX

TL_MAPPING_TOUR имеет id * Столбец 1010 * (первичный ключ), но он автоматически генерируется последовательностью.

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

INSERT into TL_MAPPING_TOUR(TOURNO,TLID,SYSTEM) 
select 'CLLO001474','123456789','AS400' 
from DUAL 
where not exists(select * from TL_MAPPING_TOUR where (TOURNO='CLLO001474' and TLID='123456789' and SYSTEM='AS400'));

Ясно, что Mule db: компоненту вставки не нравится синтаксис, но мне не очень понятно, что здесь не так. Я не могу найти ни одного примера реализации INSERT WHERE NOT EXISTS для компонента базы данных Mule4.

stackoverflow page указывает на страницу, не найденную.

Любая идея что здесь не так и как реализовать это в Mule4 без использования другого компонента Mule4 db: select перед db: insert?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2020

SQL Разработчик слишком простителен. Он преобразует строку в числа и, наоборот, автоматически, когда это возможно. И это может многое. Соединитель БД Mulesoft пытается то же самое, но он не так успешен, как нативные инструменты. Довольно часто он не конвертируется, особенно по датам, но это не ваш случай. Короче говоря - не доверяйте слишком большому объему данных Mulesoft. Если это работает - отлично! В противном случае попытайтесь исключить из него какой-либо интеллект и сделайте все преобразования в запросе, а лучше - из строки. Обычно число работает нормально, но если нет - используйте функцию to_number , чтобы правильно отметить, что это число.

Подробнее об этом здесь https://simpleflatservice.com/mule4/AvoidCoversionsOrMakeThemNative.html

0 голосов
/ 25 апреля 2020

Я не знаю "mule4", но это:

Сообщение: ORA-01722: неверный номер

не означает, что синтаксис неправильный ( как вы уже проверили - тот же оператор работает нормально в другом инструменте).

Причина : вы выполнили оператор SQL, который пытался преобразовать строку в число, но это не удалось.

Разрешение :

Варианты (ы) устранения этой Oracle ошибки:

Option # 1 : В арифметических c операциях можно использовать только поля чисел c или символьные поля, содержащие значения чисел c. Убедитесь, что все выражения соответствуют числам.

Параметр # 2 : Если вы добавляете или вычитаете из дат, убедитесь, что вы добавили / вычли значение числительного c из даты .

Другими словами, кажется, что один из столбцов объявлен как NUMBER, а вы передали что-то, что является строкой . Oracle выполнял неявное преобразование, когда вы тестировали оператор в SQL Developer, но кажется, что mule4 этого не сделал и, следовательно, ошибка.

Наиболее очевидная причина (в зависимости от того, что вы разместили) - это '123456789' в TLID, поскольку другие значения, очевидно, являются строками. Поэтому передайте 123456789 (число, без одинарных кавычек) и посмотрите, что произойдет. Должно работать.

...