SQL 的未分类 SQLException
Posted
技术标签:
【中文标题】SQL 的未分类 SQLException【英文标题】:Uncategorized SQLException for SQL 【发布时间】:2014-06-03 11:49:15 【问题描述】:我在我的项目中使用 Spring Integration。 根据我的要求,我必须同时调用两个存储过程。这是我的代码:
<int:service-activator ref="msgHandler" method="buildRequestBasedDataSource" />
<int-jdbc:stored-proc-outbound-gateway
id="PQIssueHistory-StoredProcedure-PQCOMMENTLOOKUP"
auto-startup="true"
data-source="routingDataSource"
stored-procedure-name="$PQIssueHistory-StoredProcedure-PQCOMMENTLOOKUP"
skip-undeclared-results="true"
ignore-column-meta-data="true"
use-payload-as-parameter-source = "false"
expect-single-result="true" >
<int-jdbc:sql-parameter-definition name="P_CRDATTIM" direction="IN" type="VARCHAR" />
<int-jdbc:sql-parameter-definition name="P_RECORDCD" direction="IN" type="VARCHAR" />
<int-jdbc:sql-parameter-definition name="P_CRNODE" direction="IN" type="VARCHAR" />
<int-jdbc:parameter name="P_CRDATTIM" expression="#xpath(payload, '//CRDATTIM')" />
<int-jdbc:parameter name="P_RECORDCD" expression="#xpath(payload, '//RECORDCD')" />
<int-jdbc:parameter name="P_CRNODE" expression="#xpath(payload, '//CRNODE')" />
<int-jdbc:returning-resultset name="rowMapper" row-mapper="com.dsths.cs.awd.utils.ResultSetRowMapper"/>
</int-jdbc:stored-proc-outbound-gateway>
<int:service-activator ref="msgHandler" method="buildMessageFromExtSysResponseTestOne" />
<int:header-enricher default-overwrite="true" should-skip-nulls="true" >
<int:header name="$headerNames.originalPayload" expression="payload" />
</int:header-enricher>
</int:chain>
<int:channel id="test" />
<int:chain input-channel="test" output-channel="PQIssueHistory-XsltTransformInputChannel" >
<int-jdbc:stored-proc-outbound-gateway
id="PQIssueHistory-StoredProcedure-PQHISTORYLOOKUP"
auto-startup="true"
data-source="routingDataSource"
stored-procedure-name="$PQIssueHistory-StoredProcedure-PQHISTORYLOOKUP"
skip-undeclared-results="true"
ignore-column-meta-data="true"
use-payload-as-parameter-source = "false"
expect-single-result="true" >
<int-jdbc:sql-parameter-definition name="P_CRDATTIM" direction="IN" type="VARCHAR" />
<int-jdbc:sql-parameter-definition name="P_RECORDCD" direction="IN" type="VARCHAR" />
<int-jdbc:sql-parameter-definition name="P_CRNODE" direction="IN" type="VARCHAR" />
<int-jdbc:parameter name="P_CRDATTIM" expression="#xpath(payload, '//CRDATTIM')" />
<int-jdbc:parameter name="P_RECORDCD" expression="#xpath(payload, '//RECORDCD')" />
<int-jdbc:parameter name="P_CRNODE" expression="#xpath(payload, '//CRNODE')" />
<int-jdbc:returning-resultset name="rowMapper" row-mapper="com.dsths.cs.awd.utils.ResultSetRowMapper"/>
</int-jdbc:stored-proc-outbound-gateway>
<int:service-activator ref="msgHandler" method="buildMessageFromExtSysResponseTestTwo" />
</int:chain>
当我使用 junit 测试用例执行时,我可以毫无问题地访问存储过程。但是,当我尝试从 GUI 执行时(即与 UI 集成后),我收到以下错误:
org.springframework.integration.MessageHandlingException: error occurred in message handler [org.springframework.integration.handler.MessageHandlerChain#201$child.PQIssueHistory-StoredProcedure-PQHISTORYLOOKUP.handler]
at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:79)
at org.springframework.integration.handler.MessageHandlerChain.handleMessageInternal(MessageHandlerChain.java:131)
................................
............................
at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:598)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:662)
Caused by: org.springframework.jdbc.UncategorizedSQLException: CallableStatementCallback; uncategorized SQLException for SQL [call ZSPPQHISTORYLOOKUP(?, ?, ?)]; SQL state [000RZ]; error code [930027]; No record found in the VOC file for "BP". ; nested exception is java.sql.SQLException: No record found in the VOC file for "BP".
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:83)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1036)
at org.springframework.jdbc.core.JdbcTemplate.call(JdbcTemplate.java:1070)
at org.springframework.jdbc.core.simple.AbstractJdbcCall.executeCallInternal(AbstractJdbcCall.java:387)
at org.springframework.jdbc.core.simple.AbstractJdbcCall.doExecute(AbstractJdbcCall.java:350)
at org.springframework.jdbc.core.simple.SimpleJdbcCall.execute(SimpleJdbcCall.java:181)
at org.springframework.integration.jdbc.StoredProcExecutor.executeStoredProcedure(StoredProcExecutor.java:335)
at org.springframework.integration.jdbc.StoredProcExecutor.executeStoredProcedureInternal(StoredProcExecutor.java:325)
at org.springframework.integration.jdbc.StoredProcExecutor.executeStoredProcedure(StoredProcExecutor.java:294)
at org.springframework.integration.jdbc.StoredProcOutboundGateway.handleRequestMessage(StoredProcOutboundGateway.java:56)
at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:142)
at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:73)
... 146 more
Caused by: java.sql.SQLException: No record found in the VOC file for "BP".
at com.ibm.u2.jdbc.UniJDBCMsgFactory.createException(UniJDBCMsgFactory.java:101)
at com.ibm.u2.jdbc.UniJDBCExceptionSupport.addException(UniJDBCExceptionSupport.java:87)
at com.ibm.u2.jdbc.UniJDBCProtocolU2Impl.addServerError(UniJDBCProtocolU2Impl.java:2799)
at com.ibm.u2.jdbc.UniJDBCProtocolU2Impl.serverExecuteSql(UniJDBCProtocolU2Impl.java:2130)
at com.ibm.u2.jdbc.UniJDBCProtocolU2Impl.executeSql(UniJDBCProtocolU2Impl.java:2169)
at com.ibm.u2.jdbc.UniJDBCProtocolU2Impl.doExecute(UniJDBCProtocolU2Impl.java:2208)
at com.ibm.u2.jdbc.UniJDBCProtocolU2Impl.executeStatementQuery(UniJDBCProtocolU2Impl.java:606)
at com.ibm.u2.jdbc.UniJDBCPreparedStatementImpl.execute(UniJDBCPreparedStatementImpl.java:407)
at org.jboss.resource.adapter.jdbc.WrappedPreparedStatement.execute(WrappedPreparedStatement.java:299)
at org.springframework.jdbc.core.JdbcTemplate$6.doInCallableStatement(JdbcTemplate.java:1072)
at org.springframework.jdbc.core.JdbcTemplate$6.doInCallableStatement(JdbcTemplate.java:1070)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1020)
... 156 more
12:26:25,972 INFO [STDOUT] 12:26:25,971 DEBUG [org.springframework.integration.channel.DirectChannel.preSend] preSend on channel 'cs-exceptionHandlingChannel', message: [Payload=org.springframework.integration.MessageHandlingException: error occurred in message handler [org.springframework.integration.handler.MessageHandlerChain#201$child.PQIssueHistory-StoredProcedure-PQHISTORYLOOKUP.handler]][Headers=timestamp=1401778585971, id=60a1966f-e5ed-8bc0-d9d0-76ee7f6856d8, errorChannel=org.springframework.integration.core.MessagingTemplate$TemporaryReplyChannel@1c8968f, replyChannel=org.springframework.integration.core.MessagingTemplate$TemporaryReplyChannel@1c8968f]
从上面的异常可以清楚地看出,控件正在走向错误通道。在这里,我只想知道导致问题的 sql 查询。我已经打开了“调试”。如果有人能分享他们关于如何进一步查找/修复问题的想法,那就太好了。
【问题讨论】:
我不是 Spring 人,但看起来您的存储过程引发了异常。在 VOC 文件中找不到“BP”的记录我会尝试使用相同的数据手动执行它。 作为跟进,您可以通过 raiseerror 抛出信息性消息,通常会在特定消息编号范围内被忽略。我认为您要么必须更改 proc,要么弄清楚如何让 Spring 忽略这些消息(或以某种方式处理它们)。 当我手动执行存储过程时,它工作正常。 我认为您需要在抛出错误时使用确切的参数。 SQLSTate 和错误代码的一些背景知识 - msdn.microsoft.com/en-us/library/ms714687.aspx 如果您有存储过程的代码,我会查看它并找到该消息,它将向您显示抛出的内容并为您提供更好的工作起点。这里没有足够的信息来解决这个问题。 SQL 状态 [000RZ];错误代码 [930027]。它在堆栈跟踪中可用。 【参考方案1】:Ashok,我只能分享想法,因为我对springjdbc的了解可能较少。但我认为导致问题的原因是驱动程序添加的一条语句,例如getUpdateCount。
首先,您可以创建一个类来扩展 JdbcTemplate,但复制所有内容并更改构造函数,使其与 JdbcTemplate 相同。我假设你可以看到 JdbcTemplate 的源代码。
其次,在第 1020 行,找出它是什么以及如何调用它。异常已从 SQLException 转换为您未向我们展示的其他内容。请向我们展示,以便我们知道***异常是什么。你用的是什么版本的springjdbc?
第三,现在您可以修改您的代码以使用您自己的子类而不是 JdbcTemlate 并且您可以修改代码。评论句柄警告之类的东西。一步一步地,您从 try 块中的最后一行开始注释,在该块中,异常被捕获并一一进行。然后您应该能够找出驱动程序添加的额外 SQL 语句导致了问题。
这只是一个想法。请告诉我们您的结果,我们可以继续。
【讨论】:
【参考方案2】:如果您想查看发送到数据库的查询的实际内容,请使用间谍驱动程序;只是谷歌;其中有很多。或者使用 WireShark 或类似工具来获取网络跟踪。
【讨论】:
感谢 Gary 的回复。" 原因:org.springframework.jdbc.UncategorizedSQLException: CallableStatementCallback; SQL [call ZSPPQHISTORYLOOKUP(?, ?, ?)] 的未分类 SQLException;SQL 状态 [000RZ] ; 错误代码 [930027]; 在 VOC 文件中找不到 "BP" 的记录。 ; 嵌套异常是 java.sql.SQLException: 在 VOC 文件中找不到 "BP" 的记录。"这里我怀疑存储过程调用(ZSPPQHISTORYLOOKUP)的参数是否为空。我说的对吗? 如果你不能使用间谍驱动程序;我建议您在调试器中运行并在ExpressionEvaluatingSqlParameterSourceFactory.ExpressionEvaluatingSqlParameterSource.doGetValue()
中设置一些断点,以验证您的 xpath 表达式是否按预期进行评估。以上是关于SQL 的未分类 SQLException的主要内容,如果未能解决你的问题,请参考以下文章