Oracle存储过程java.sql.SQLException:列类型无效:2012(REF_CURSOR)

时间:2018-02-18 01:56:04

标签: oracle stored-procedures jdbc sys-refcursor ref-cursor

Oracle 11g,Java 8,ojdbc8 / ojdbc7

带有OUT REF_CURSOR的

存储过程,例如,

create or replace procedure foo(employeeId IN number, c OUT SYS_REFCURSOR) AS
BEGIN
    open c for select * from Employee where id = employeeId;
END;

从sqlplus开始,它可以正常工作。

JDBC调用过程:

CallableStatement statement = connection.prepareCall("{call foo(?,?)}");
statement.setObject(1, 100);
statement.registerOutParameter(2, java.sql.Types.REF_CURSOR);  // ERROR here
statement.execute();

错误:

java.sql.SQLException: Invalid column type: 2012

类型2012是Types.REF_CURSOR。

用oracle 11g尝试了ojdbc7和ojdbc8,同样的错误 Oracle 11g支持REFCURSOR。 java 8定义了Types.REF_CURSOR。我应该将哪个oracle jdbc驱动程序用于11g?

4 个答案:

答案 0 :(得分:1)

使用spring jdbc,我得到了相同的错误,但是我这样使用OracleTypes.CURSOR进行了解决。

  SimpleJdbcCall jdbc=new SimpleJdbcCall(this.dataSource)
            .withSchemaName("DELIVERY")
            .withCatalogName("PKG_APISTOCK")
            .withProcedureName("SP_S_STOCK_PRODUCTO")
            .declareParameters(
                    new SqlParameter("P_COD_LOCAL", Types.VARCHAR),
                    new SqlParameter("P_COD_PRODUCTO", Types.VARCHAR),
                    new SqlParameter("P_CIA", Types.VARCHAR),
                    new SqlOutParameter("C_STOCK", OracleTypes.CURSOR,new StockMapper()));

答案 1 :(得分:0)

删除 所有类路径条目(可能是 ojdbc7.jar classesXX.jar 等)其他,而不是使用类路径中的

  

class path是Java运行时环境搜索的路径   用于类和其他资源文件。班级搜索路径(更多   通常用较短的名称来知道,"类路径")可以使用   调用JDK工具时的-classpath选项(首选   方法)或通过设置CLASSPATH环境变量。该   -classpath选项是首选,因为您可以为每个应用程序单独设置它,而不会影响其他应用程序   其他应用程序修改其值。

     

C:> sdkTool -classpath classpath1;classpath2...

     

-OR -

     

C:> set CLASSPATH=classpath1;classpath2...

     

其中:

     

sdkTool 一个命令行工具,例如java,javac,javadoc或apt。对于   列表,请参阅JDK工具。 classpath1; classpath2 类的路径   .jar,.zip或.class文件。每个类路径都应以文件名结尾   或目录取决于您将类路径设置为:For   包含.class文件的.jar或.zip文件,类路径结束   使用.zip或.jar文件的名称。对于未命名的.class文件   包,类路径以包含该目录的目录结束   .class文件。对于命名包中的.class文件,类路径结束   使用包含" root"的目录包(第一个包   在完整的包名称)。多个路径条目分隔   分号。使用set命令,从中省略空格很重要   在等号(=)附近。

     

默认类路径是当前目录。设置CLASSPATH   变量或使用-classpath命令行选项会覆盖它   默认,因此如果要在搜索中包含当前目录   路径,你必须包括"。"在新设置中。

     

既不是目录也不是归档的类路径条目(.zip或   <{1}}文件)也*被忽略。

答案 2 :(得分:0)

我在我的项目中使用了这个代码并且它的工作非常好

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

项目依赖:

pyspark

答案 3 :(得分:0)

对于Scala,将以下依赖项添加到build.sbt文件中。

libraryDependencies += "com.oracle.ojdbc" % "ojdbc8" % "19.3.0.0"

然后您可以调用存储过程。

val callableStatement = connection.prepareCall("{call foo(?)}")
callableStatement.registerOutParameter(1, OracleTypes.CURSOR)
callableStatement.execute()