开发项目时,遇到一个错误:"[Oracle][ODBC]Numeric value out of range."
经查,应该是数据值超过字段的定义长,但是检查了良久,仍然没有发现超长的数据.
最后,终于发现有个这样的问题,不知是否为Oracle适配器的一个BUG.
目标为Oracle数据库,采用Oracle适配器进行数据交换,如果目标表中有date类型的字段,而对该字段未赋值,则会出现问题.
报错:"[Oracle][ODBC]Numeric value out of range."
测试如下:
1.Oracle数据库中建表:
ID为varchar2(10)类型,data1 为date类型.
2.建流程项目:
源架构:
目标架构(即刚建好的表架构):
转换关系,DATA1不赋值:
流程逻辑比较简单:
3.测试结果:
端口冻结,流程挂起:
报错为:
Code
适配器无法传输要发往发送端口“SendPortCoredb”(URL 为“OracleDb://coredb_9fb1d07f-a403-4f7d-954b-52218fc56fc2”)的消息。在为该发送端口指定的重试时间间隔过后,将会重新传输该消息。详细信息:“Error transmitting message: <SOAP-ENV:Fault xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><faultcode>SOAP-ENV:Server</faultcode><faultstring>Request ID: Unknown
Exception Type: System defined exception
Exception Info:
Exception occurred:
Source: OracleDb
Cause: OracleDb://exception=DBException (Unique ID <none>)
22003 : [Oracle][ODBC]Numeric value out of range.
Exception data:
struct DBException =
WideString StatusCode = "22003"
WideString Description = "[Oracle][ODBC]Numeric value out of range."</faultstring><detail><exposed:DBException xmlns:exposed="http://schemas.microsoft.com"><exposed:StatusCode>22003</exposed:StatusCode><exposed:Description>[Oracle][ODBC]Numeric value out of range.</exposed:Description></exposed:DBException></detail></SOAP-ENV:Fault>”。
<ns0:Insert xmlns:ns0="http://schemas.microsoft.com/[OracleDb://coredb/SHAREDB/Tables/T_TESTDATE]">
<ns0:Rows>
<ns0:InsertRecord>
<ns0:ID>2</ns0:ID>
</ns0:InsertRecord>
</ns0:Rows>
</ns0:Insert>
可以看到,消息中没有出现data1字段的对应值.
4. 更改映射
如果name的值非正确的date类型时,报错:
Code
Error transmitting message: <SOAP-ENV:Fault xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><faultcode>SOAP-ENV:Server</faultcode><faultstring>Request ID: Unknown
Exception Type: A cross object system conversion error occurred
Exception Info:
Exception occurred:
E-CORE0055: Type conversion from source to target param failed
Call to Insert@OracleDb://coredb/SHAREDB/Tables/T_TESTDATE
Implementation = OracleDb://coredb/SHAREDB/Tables/T_TESTDATE
SOAP://xmlns/schemas.microsoft.com/T_TESTDATE/InsertRecord:Type/[]/DATA1 ==> struct OracleDb://timestamp
(SOAP://xmlns/schemas.microsoft.com/T_TESTDATE/Insert:Element/Rows ==> sequence<struct OracleDb://coredb/SHAREDB/Tables/T_TESTDATE/InsertRecord&>)
(Error occurred before call to foreign method)</faultstring></SOAP-ENV:Fault>
有关更多信息,请参阅在 http://go.microsoft.com/fwlink/events.asp 的帮助和支持
<ns0:Insert xmlns:ns0="http://schemas.microsoft.com/[OracleDb://coredb/SHAREDB/Tables/T_TESTDATE]">
<ns0:Rows>
<ns0:InsertRecord><ns0:ID>3</ns0:ID><ns0:DATA1>33</ns0:DATA1>
</ns0:InsertRecord>
</ns0:Rows>
如果name为空或者为正确的date类型,则能正常插入.
5.结论
用Biztalk做Oracle项目时,目标为Oracle数据库,采用Oracle适配器进行数据交换,如果目标表中有date类型的字段,而对该字段未赋值,则会出现问题,并且该问题的迷惑性很大,常让人往字段超长方面去解决问题,结果往往误入歧途,死的很惨.
报错:"[Oracle][ODBC]Numeric value out of range.",不一定是真正的超长错误.
所以遇到该问题时,多分析.需要手动添加赋值,以免流程挂起.
-----------------------------分割线--------------------------