我正在尝试在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中实现这一点?
我不知道“ mule4”,但这:
消息:ORA-01722:无效的号码
并不意味着语法错误(因为您已经测试过-同一条语句在其他工具中可以正常运行。]]
时,似乎其中一列被声明为NUMBER。当您在SQL Developer中测试该语句时,Oracle执行了隐式转换,但是mule4似乎没有,因此出现了错误。原因
:您执行了一条SQL语句,试图将字符串转换为数字,但是未成功。分辨率
:解决此Oracle错误的选项是:
Option#1
:在算术运算中只能使用数字字段或包含数字值的字符字段。确保所有表达式的计算结果均为数字。Option#2
:如果要从日期中添加或减去日期,请确保已从日期中添加/减去了数值。换句话说,当您传递的内容是string
最明显的原因(基于您发布的内容)是将'123456789'
放入TLID
,因为其他值显然是字符串。因此,传递123456789
(一个数字,在其周围没有单引号),看看会发生什么。应该可以。
SQL Developer太宽容了。它将自动将字符串转换为数字,反之亦然。而且可以很多。Mulesoft DB连接器尝试相同的方法,但不如本机工具成功。它经常无法转换,尤其是在日期上转换,但这不是您的情况。简而言之-不要过分相信Mulesoft的数据。如果可行,那就太好了!否则,请尝试从中消除任何智能,并在查询中进行所有转换,最好从字符串中进行转换。通常,数字可以正常工作,但不能正常工作-使用to_number函数正确标记这是数字。