Как реализовать INSERT там, где его нет для ORACLE в Mule4

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

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

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 (первичный ключ), но он автоматически создается последовательностью.

Тот же сценарий, измененный для запуска непосредственно в разработчике 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 не нравится синтаксис, но мне не очень понятно, что здесь не так. Я также не могу найти какой-либо пример реализации INSERT WHERE NOT EXISTS для компонента базы данных Mule4.

страница stackoverflow https://stackoverflow.com/questions/54910330/insert-record-into-sql-server-when-it-does-not-already-exist-using-mule направляет на страницу, которая не найдена.

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


person Ravi Kant Asthana    schedule 25.04.2020    source источник


Ответы (2)


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

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

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

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

Разрешение:

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

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

Вариант № 2. Если вы добавляете или вычитаете даты, убедитесь, что вы добавили / вычли числовое значение из даты.

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

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

person Littlefoot    schedule 25.04.2020
comment
Тип данных TLID на самом деле VARCHAR2, поэтому он должен принимать строку, и поэтому он отлично работает в разработчике SQL. - person Ravi Kant Asthana; 25.04.2020
comment
Тогда виноват что-то другое; Oracle обычно не лжет, когда говорит, что существует НЕВЕРНЫЙ НОМЕР. - person Littlefoot; 25.04.2020

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

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

person Alex    schedule 25.04.2020