【问题标题】:Spring Integration Stored Proc Outboud Gateway Call for In and Out Parameter(INDEX BY TABLE)Spring Integration Stored Proc Outbound Gateway 调用 In 和 Out 参数(INDEX BY TABLE)
【发布时间】:2014-11-05 02:53:15
【问题描述】:

我正在尝试从 spring integration stored-proc-outbound-gateway 执行 oracle 存储过程

下面是上下文

<int-jdbc:stored-proc-outbound-gateway
    id="checkSlotToDelete" data-source="dataSource" request-channel="slotRequestChannel"
    is-function="false" reply-channel="replyChannel"
    ignore-column-meta-data="true"
    stored-procedure-name="PKG_CONNECT_LOC_MNGMNT.PR_CREATE_RANGE_OR_DELETE_SLOT"
    expect-single-result="false">
    <int-jdbc:sql-parameter-definition name="USER_NUMIN" direction="IN" type="VARCHAR"/>
    <int-jdbc:sql-parameter-definition name="STORE_NUMIN" direction="IN" type="NUMERIC"/>
    <int-jdbc:sql-parameter-definition name="ZONE_NUMIN" direction="IN" type="VARCHAR"/>
    <int-jdbc:sql-parameter-definition name="SLOT_NUMIN" direction="IN" type="NUMERIC"/>
    <int-jdbc:sql-parameter-definition name="RANGE_COUNTIN" direction="IN" type="NUMERIC"/>
    <int-jdbc:sql-parameter-definition name="APP_PARAMIN" direction="IN" type="VARCHAR"/>
    <int-jdbc:sql-parameter-definition name="P_LIST" direction="OUT" type="OTHER"/>
    <int-jdbc:parameter name="USER_NUMIN" expression="payload.USER_NUMIN" />
    <int-jdbc:parameter name="STORE_NUMIN" expression="payload.STORE_NUMIN" type="NUMERIC"/>
    <int-jdbc:parameter name="ZONE_NUMIN" expression="payload.ZONE_NUMIN" />
    <int-jdbc:parameter name="SLOT_NUMIN" expression="payload.SLOT_NUMIN" />
    <int-jdbc:parameter name="RANGE_COUNTIN" expression="payload.RANGE_COUNTIN" />
    <int-jdbc:parameter name="APP_PARAMIN" value="CREATE" />
    <int-jdbc:returning-resultset name="P_LIST" row-mapper="singleRowMapper"/>
</int-jdbc:stored-proc-outbound-gateway>

下面是过程定义

    PROCEDURE PR_CREATE_RANGE_OR_DELETE_SLOT
       (
        USER_NUMIN    IN    VARCHAR2,
        STORE_NUMIN   IN    NUMBER,
        ZONE_NUMIN    IN    VARCHAR2,
        SLOT_NUMIN    IN    NUMBER,
        RANGE_COUNTIN IN    NUMBER DEFAULT 0,
        APP_PARAMIN   IN    VARCHAR2,
        P_LIST        OUT   T_LIST )

而T_LIST定义为

create or replace PACKAGE PKG_CONNECT_LOC_MNGMNT
 IS
TYPE T_LIST IS TABLE OF VARCHAR2(4000) INDEX BY PLS_INTEGER;
PROCEDURE PR_CREATE_RANGE_OR_DELETE_SLOT (USER_NUMIN IN VARCHAR2,STORE_NUMIN IN NUMBER,ZONE_NUMIN IN VARCHAR2,SLOT_NUMIN IN NUMBER,RANGE_COUNTIN IN     NUMBER DEFAULT 0 ,APP_PARAMIN IN VARCHAR2,P_LIST OUT T_LIST);
 END PKG_CONNECT_LOC_MNGMNT;

现在当我执行程序时,获取以下日志。

**org.springframework.jdbc.core.simple.SimpleJdbcCall  - The following parameters are used for call {call PKG_CONNECT_LOC_MNGMNT.PR_CREATE_RANGE_OR_DELETE_SLOT(?, ?, ?, ?, ?, ?, ?)} 
with: {SLOT_NUMIN=17, ZONE_NUMIN=1, APP_PARAMIN=CREATE, STORE_NUMIN=5, RANGE_COUNTIN=1, USER_NUMIN=MyUser}**
org.springframework.jdbc.core.JdbcTemplate  - Calling stored procedure [{call PKG_CONNECT_LOC_MNGMNT.PR_CREATE_RANGE_OR_DELETE_SLOT(?, ?, ?, ?, ?, ?, ?)}]
org.springframework.jdbc.core.StatementCreatorUtils  - Setting SQL statement parameter value: column index 1, parameter value [MyUser], value class [java.lang.String], SQL type 12
org.springframework.jdbc.core.StatementCreatorUtils  - Setting SQL statement parameter value: column index 2, parameter value [5], value class [java.lang.String], SQL type 2
org.springframework.jdbc.core.StatementCreatorUtils  - Setting SQL statement parameter value: column index 3, parameter value [1], value class [java.lang.String], SQL type 12
org.springframework.jdbc.core.StatementCreatorUtils  - Setting SQL statement parameter value: column index 4, parameter value [17], value class [java.lang.Integer], SQL type 2
org.springframework.jdbc.core.StatementCreatorUtils  - Setting SQL statement parameter value: column index 5, parameter value [1], value class [java.lang.Integer], SQL type 2
org.springframework.jdbc.core.StatementCreatorUtils  - Setting SQL statement parameter value: column index 6, parameter value [CREATE], value class [java.lang.String], SQL type 12


11418 [http--0.0.0.0-8080-1] [2014-10-31 14:52:24,393] WARN  org.springframework.integration.http.inbound.HttpRequestHandlingMessagingGateway  - failure occurred in gateway sendAndReceive
org.springframework.messaging.MessageHandlingException: org.springframework.jdbc.BadSqlGrammarException: CallableStatementCallback; bad SQL grammar [{call PKG_CONNECT_LOC_MNGMNT.PR_CREATE_RANGE_OR_DELETE_SLOT(?, ?, ?, ?, ?, ?, ?)}]; nested exception is java.sql.SQLException: ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'PR_CREATE_RANGE_OR_DELETE_SLOT'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

    at org.springframework.integration.handler.MethodInvokingMessageProcessor.processMessage(MethodInvokingMessageProcessor.java:78)
    at org.springframework.integration.handler.ServiceActivatingHandler.handleRequestMessage(ServiceActivatingHandler.java:71)
    at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:170)
    at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:78)
    at org.springframework.integration.dispatcher.BroadcastingDispatcher.invokeHandler(BroadcastingDispatcher.java:160)
    at org.springframework.integration.dispatcher.BroadcastingDispatcher.dispatch(BroadcastingDispatcher.java:142)
    at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:77)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:255)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:109)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSendAndReceive(GenericMessagingTemplate.java:144)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSendAndReceive(GenericMessagingTemplate.java:44)
    at org.springframework.messaging.core.AbstractMessagingTemplate.sendAndReceive(AbstractMessagingTemplate.java:75)
    at org.springframework.integration.gateway.MessagingGatewaySupport.doSendAndReceive(MessagingGatewaySupport.java:250)
    at org.springframework.integration.gateway.MessagingGatewaySupport.sendAndReceiveMessage(MessagingGatewaySupport.java:224)
    at org.springframework.integration.http.inbound.HttpRequestHandlingEndpointSupport.actualDoHandleRequest(HttpRequestHandlingEndpointSupport.java:473)
    at org.springframework.integration.http.inbound.HttpRequestHandlingEndpointSupport.doHandleRequest(HttpRequestHandlingEndpointSupport.java:370)
    at org.springframework.integration.http.inbound.HttpRequestHandlingMessagingGateway.handleRequest(HttpRequestHandlingMessagingGateway.java:101)
    at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:51)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:734)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)
    at com.asda.connect.utility.filter.RESTCorsDemoResponseFilter.doFilter(RESTCorsDemoResponseFilter.java:35)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
    at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.springframework.jdbc.BadSqlGrammarException: CallableStatementCallback; bad SQL grammar [{call PKG_CONNECT_LOC_MNGMNT.PR_CREATE_RANGE_OR_DELETE_SLOT(?, ?, ?, ?, ?, ?, ?)}]; nested exception is java.sql.SQLException: ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'PR_CREATE_RANGE_OR_DELETE_SLOT'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

    at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:231)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1137)
    at org.springframework.jdbc.core.JdbcTemplate.call(JdbcTemplate.java:1173)
    at org.springframework.jdbc.core.simple.AbstractJdbcCall.executeCallInternal(AbstractJdbcCall.java:378)
    at org.springframework.jdbc.core.simple.AbstractJdbcCall.doExecute(AbstractJdbcCall.java:341)
    at org.springframework.jdbc.core.simple.SimpleJdbcCall.execute(SimpleJdbcCall.java:190)
    at org.springframework.integration.jdbc.StoredProcExecutor.executeStoredProcedureInternal(StoredProcExecutor.java:328)
    at org.springframework.integration.jdbc.StoredProcExecutor.executeStoredProcedure(StoredProcExecutor.java:297)
    at org.springframework.integration.jdbc.StoredProcOutboundGateway.handleRequestMessage(StoredProcOutboundGateway.java:60)
    at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:170)
    at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:78)
    at org.springframework.integration.dispatcher.BroadcastingDispatcher.invokeHandler(BroadcastingDispatcher.java:160)
    at org.springframework.integration.dispatcher.BroadcastingDispatcher.dispatch(BroadcastingDispatcher.java:142)
    at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:77)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:255)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:223)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:109)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:44)
    at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:94)
    at org.springframework.messaging.core.AbstractMessageSendingTemplate.convertAndSend(AbstractMessageSendingTemplate.java:144)
    at org.springframework.messaging.core.AbstractMessageSendingTemplate.convertAndSend(AbstractMessageSendingTemplate.java:124)
    at org.springframework.integration.gateway.MessagingGatewaySupport.send(MessagingGatewaySupport.java:200)
    at org.springframework.integration.gateway.GatewayProxyFactoryBean.invokeGatewayMethod(GatewayProxyFactoryBean.java:344)
    at org.springframework.integration.gateway.GatewayProxyFactoryBean.doInvoke(GatewayProxyFactoryBean.java:304)
    at org.springframework.integration.gateway.GatewayProxyFactoryBean.invoke(GatewayProxyFactoryBean.java:295)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
    at com.sun.proxy.$Proxy26.send(Unknown Source)
    at com.asda.connect.locationmanagement.service.CheckServiceActivator.checkValidRequest(CheckServiceActivator.java:86)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.expression.spel.support.ReflectiveMethodExecutor.execute(ReflectiveMethodExecutor.java:63)
    at org.springframework.expression.spel.ast.MethodReference.getValueInternal(MethodReference.java:122)
    at org.springframework.expression.spel.ast.MethodReference.access$000(MethodReference.java:44)
    at org.springframework.expression.spel.ast.MethodReference$MethodValueRef.getValue(MethodReference.java:258)
    at org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:84)
    at org.springframework.expression.spel.ast.SpelNodeImpl.getTypedValue(SpelNodeImpl.java:114)
    at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:111)
    at org.springframework.integration.util.AbstractExpressionEvaluator.evaluateExpression(AbstractExpressionEvaluator.java:159)
    at org.springframework.integration.util.MessagingMethodInvokerHelper.processInternal(MessagingMethodInvokerHelper.java:268)
    at org.springframework.integration.util.MessagingMethodInvokerHelper.process(MessagingMethodInvokerHelper.java:142)
    at org.springframework.integration.handler.MethodInvokingMessageProcessor.processMessage(MethodInvokingMessageProcessor.java:75)
    ... 40 more
**Caused by: java.sql.SQLException: ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'PR_CREATE_RANGE_OR_DELETE_SLOT'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored**

    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:445)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
    at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:879)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:450)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)
    at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:204)
    at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:1041)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1329)
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3584)
    at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3685)
    at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:4714)
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1376)
    at org.jboss.jca.adapters.jdbc.CachedPreparedStatement.execute(CachedPreparedStatement.java:297)
    at org.jboss.jca.adapters.jdbc.WrappedPreparedStatement.execute(WrappedPreparedStatement.java:404)
    at org.springframework.jdbc.core.JdbcTemplate$6.doInCallableStatement(JdbcTemplate.java:1176)
    at org.springframework.jdbc.core.JdbcTemplate$6.doInCallableStatement(JdbcTemplate.java:1173)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1121)

【问题讨论】:

    标签: stored-procedures spring-integration


    【解决方案1】:

    您的问题是 advanced Oracle type 不是 CURSOR,因为您尝试使用 returning-resultset 处理它。

    首先你应该摆脱它并使用自 Spring Integration 3.0 以来引入的return-type 功能:

    ...
    <int-jdbc:sql-parameter-definition name="P_LIST" direction="OUT" type="#{T(oracle.jdbc.OracleTypes).ARRAY}" type-name="T_LIST" return-type="sqlReturnArray"/>
    ...
    
    <bean id="sqlReturnArray" class="org.springframework.data.jdbc.support.oracle.SqlReturnArray"/>
    

    最后一个来自Spring Data JDBC Extensions

    我已经很久没有使用 Oracle,我可能不适合正确的 SqlReturnType impl,但看起来你的 T_LIST 只是 VARCHAR2 的数组。

    对于这个问题,从包中取出 T_LIST 将解决错误数量/类型的参数问题。

    【讨论】:

    • 嗨@Artem Bilan 我做了更改.. 但又遇到了另一个异常.. 不支持的网络数据类型或表示
    • M-m-m。但是你在那里展示了相同的 StackTrace。尝试从参数定义中删除 type="VARCHAR"
    • 从参数定义中删除了所有类型属性......但仍然是同样的错误
    • 尝试将其命名为 type="ARRAY"。如果没有帮助,我建议您尝试仅使用原始 JDBC 来实现该存储过程调用的良好结果。当它准备好时,您可以返回给我寻求如何将其转换为 Spring Integration 适配器的帮助。我使用ARRAY 作为输入参数,并且需要将这些类型与SHEME_NAME 一起指定,并且它们在包之外。从另一面看,为什么不从 T_LIST 返回 CURSOR 作为 select
    • 嗨@Artem Bilan 我已经将 T_LIST 从包中更改出来,现在如果在没有类型异常的情况下执行 proc。但现在正在获取 oracle jar 的问题。 java.lang.ClassCastException: oracle.sql.ARRAY 无法转换为 oracle.sql.ARRAY 一个来自应用程序,另一个来自 jboss。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多