如何在Mule4中的ORACLE中不存在的地方实现INSERT

问题描述 投票:0回答:2

我正在尝试在Mule4中实现一个用例,如果尚未分配给用户,则需要将其分配给用户。

我希望我可以使用Mule db:insert组件并使用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))

但是,这导致M子异常

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

TL_MAPPING_TOUR表具有id列(主键),但是该列是由序列自动生成的。

修改为直接在SQL Developer中运行的相同脚本,如下所示,可以正常工作。

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组件不喜欢该语法,但是我不太清楚这是哪里出了问题。我也找不到Mule4数据库组件的任何INSERT WHERE NOT EXISTS示例实现。

stackoverflow页面https://stackoverflow.com/questions/54910330/insert-record-into-sql-server-when-it-does-not-already-exist-using-mule指向找不到的页面。

任何想法,这里有什么问题,以及如何在db:insert之前不使用另一个Mule4 db:select组件的情况下在Mule4中实现这一点?

sql-insert oracle12c mule4
2个回答
0
投票

我不知道“ mule4”,但这:

消息:ORA-01722:无效的号码

并不意味着语法错误(因为您已经测试过-同一条语句在其他工具中可以正常运行。]]

原因

:您执行了一条SQL语句,试图将字符串转换为数字,但是未成功。

分辨率

解决此Oracle错误的选项是:

Option#1

:在算术运算中只能使用数字字段或包含数字值的字符字段。确保所有表达式的计算结果均为数字。

Option#2

:如果要从日期中添加或减去日期,请确保已从日期中添加/减去了数值。

换句话说,当您传递的内容是string

时,似乎其中一列被声明为NUMBER。当您在SQL Developer中测试该语句时,Oracle执行了隐式转换,但是mule4似乎没有,因此出现了错误。

最明显的原因(基于您发布的内容)是将'123456789'放入TLID,因为其他值显然是字符串。因此,传递123456789(一个数字,在其周围没有单引号),看看会发生什么。应该可以。


0
投票

SQL Developer太宽容了。它将自动将字符串转换为数字,反之亦然。而且可以很多。Mulesoft DB连接器尝试相同的方法,但不如本机工具成功。它经常无法转换,尤其是在日期上转换,但这不是您的情况。简而言之-不要过分相信Mulesoft的数据。如果可行,那就太好了!否则,请尝试从中消除任何智能,并在查询中进行所有转换,最好从字符串中进行转换。通常,数字可以正常工作,但不能正常工作-使用to_number函数正确标记这是数字。

© www.soinside.com 2019 - 2024. All rights reserved.