Stored procedures Spring集成存储Proc Outboud网关调用In和Out参数(按表索引)

Stored procedures Spring集成存储Proc Outboud网关调用In和Out参数(按表索引),stored-procedures,spring-integration,Stored Procedures,Spring Integration,我正在尝试从spring集成存储过程出站网关执行oracle存储过程 下面是上下文 <int-jdbc:stored-proc-outbound-gateway id="checkSlotToDelete" data-source="dataSource" request-channel="slotRequestChannel" is-function="false" reply-channel="replyChannel" ignore-column-meta-d

我正在尝试从spring集成存储过程出站网关执行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>
而T_列表定义为

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)

当您试图使用
返回结果集处理
时,
高级Oracle类型
的问题不是
游标

首先,您应该去掉它,并使用自Spring Integration 3.0以来引入的
返回类型
功能:

...
<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"/>
。。。
...
最后一个是从哪里来的

我已经很长时间没有使用Oracle了,hance我可能不适合使用正确的
SqlReturnType
impl,但看起来您的
t\u列表
只是一个
VARCHAR2
数组


对于这个问题,将T_列表移出包将解决错误的参数数量/类型问题

嗨@Artem Bilan我做了改变。。但还有一个例外。。不支持的网络数据类型或表示m-m-m。但是你在那里展示了同样的StackTrace。尝试从参数定义中删除
type=“VARCHAR”
。从参数定义中删除所有类型属性…但仍然存在相同的错误尝试将其命名为类似
type=“ARRAY”
。如果没有帮助,我建议您尝试使用原始JDBC实现存储的propcedure调用的良好结果。当它准备好后,您可以返回给我,以获得如何将其转换为Spring集成适配器的帮助。我使用
ARRAY
作为输入参数,需要指定这些类型以及
SHEME_NAME
,它们不在包中。从另一个角度看,为什么不将光标返回为
t_列表中选择
?Hi@Artem Bilan我已经将t_列表从包中更改了出来,现在,如果在没有类型异常的情况下执行,则该过程。但现在,oracle jar面临一个问题。java.lang.ClassCastException:oracle.sql.ARRAY不能从应用程序转换为oracle.sql.ARRAY,也不能从jboss转换为oracle.sql.ARRAY。
...
<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"/>