用Spring调用oracle StoredProcedure时出错

时间:2018-04-10 14:58:16

标签: java spring oracle stored-procedures

我有一个oracle存储过程,我无法更改或编码。程序收到以下I / O

CREATE OR REPLACE PROCEDURE "SCHEMA"."NAMEPROCEDURE"
            (
                ZCLIENTE_IN     IN  CHAR,
                CKBALCAO_IN     IN  CHAR,
                NRPROCES_IN     IN  NUMBER,
                DTINICIO_IN     IN  CHAR,
                DTFIM_IN        IN  CHAR,
                TPDOCUME_IN     IN  CHAR,
                EMAIL_IN        IN  CHAR,
                OK_KO_OUT       OUT CHAR,
                MSGERR_OUT      OUT VARCHAR2
            )
IS
PROXNUM     CHAR(14);

BEGIN ...

...

此过程在一些表中插入我的输入。 在springBoot应用程序中,我尝试使用以下存储库代码调用它:

 String procedureName = "NAMEPROCEDURE";
String catalogName = "SCHEMA";


String okKo ="";
String msgErro ="";

simpleJdbcCall.withCatalogName(catalogName).withProcedureName(procedureName)
.declareParameters(new SqlOutParameter("OK_KO_OUT", OracleTypes.CHAR), new SqlOutParameter("MSGERR", OracleTypes.VARCHAR),
      new SqlInOutParameter("ZCLIENTE_IN", OracleTypes.CHAR), 
      new SqlInOutParameter("CKBALCAO_IN", OracleTypes.CHAR),
      new SqlInOutParameter("NRPROCES_IN", OracleTypes.NUMBER),
      new SqlInOutParameter("DTINICIO_IN", OracleTypes.CHAR),
      new SqlInOutParameter("DTFIM_IN", OracleTypes.CHAR),
      new SqlInOutParameter("TPDOCUME_IN", OracleTypes.CHAR),
      new SqlInOutParameter("EMAIL_IN", OracleTypes.CHAR)
    );
MapSqlParameterSource inParams = new MapSqlParameterSource();
inParams.addValue("ZCLIENTE_IN", "1111111111", OracleTypes.CHAR);
inParams.addValue("CKBALCAO_IN", "0000", OracleTypes.CHAR);
inParams.addValue("NRPROCES_IN", 20160000001L, OracleTypes.BIGINT);
inParams.addValue("DTINICIO_IN", "2016-01-01", OracleTypes.CHAR);
inParams.addValue("DTFIM_IN", "2019-01-01", OracleTypes.CHAR);
inParams.addValue("TPDOCUME_IN", "0011", OracleTypes.CHAR);
inParams.addValue("EMAIL_IN", "someEmail@gmail.com", OracleTypes.CHAR);

Map<String, Object> simpleJdbcCallResult =  simpleJdbcCall.execute(inParams);

但是我收到了以下日志错误:

  

org.springframework.jdbc.BadSqlGrammarException:   CallableStatementCallback;糟糕的SQL语法[{call   SCHEMA.NAMEPROCEDURE()}];嵌套异常是   java.sql.SQLException:ORA-06550:linha 1,coluna 7:PLS-00306:número   errado ou tipos de argumentos na chamada para   'PROCEDURENAME'ORA-06550:linha 1,coluna 7:〜

     

引起:java.sql.SQLException:ORA-06550:linha 1,coluna 7:   PLS-00306:númeroerradoou tipos de argumentos na chamada para   'PROCEDURENAME'ORA-06550:linha 1,coluna 7:PL / SQL:   声明被忽略

     

at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:450)   〜[ojdbc7-12.1.0.2.jar:12.1.0.2.0] at   oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:399)   〜[ojdbc7-12.1.0.2.jar:12.1.0.2.0] at   oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1059)   〜[ojdbc7-12.1.0.2.jar:12.1.0.2.0] at   oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:522)   〜[ojdbc7-12.1.0.2.jar:12.1.0.2.0] at   oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:257)   〜[ojdbc7-12.1.0.2.jar:12.1.0.2.0] at   oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:587)   〜[ojdbc7-12.1.0.2.jar:12.1.0.2.0]

我不知道我做错了什么,因为如果我只用2个参数进行相同的调用并返回一个Cursor就可以完美地运行。

Tks in Advance

1 个答案:

答案 0 :(得分:0)

为遇到同样问题的人找到答案。 在我的Pom.xml中,我有ojdbc7驱动程序,需要有ojbdc6。继承人:

<dependency>
   <groupId>com.oracle</groupId>
   <artifactId>ojdbc6</artifactId>
   <version>11.2.0.4</version>
</dependency>

不知道为什么但它对我有用。 SQL调用函数和oracle之间必定存在一些不兼容性。