2

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。我应该为 11g 使用哪个 oracle jdbc 驱动程序?

4

4 回答 4

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()));
于 2019-09-09T19:32:08.213 回答
1

我在我的项目中使用了这个代码,它工作得很好

@Override
public ResultSet getCorrespondenceDetail(Long id)  {
    String sql="{call dbpk_person_correspondence.get_report_detail(?,?   )}";
    Connection conn = JDBCUtility.getConnection();
    ResultSet result = null;
    CallableStatement cstmt;
    try {
        cstmt = conn.prepareCall(sql);
    cstmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
    cstmt.setLong(2,id);
    cstmt.execute();
    result = (ResultSet)cstmt.getObject(1);
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return result;
}

项目依赖:

<dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc6</artifactId>
        <version>11.2.0</version>
</dependency>
于 2018-02-18T13:50:01.670 回答
0

从类路径中删除您使用所有类路径条目(可能是ojdbc7.jarclassesXX.jar等)。

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

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

-或者-

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

在哪里:

sdkTool命令行工具,例如 java、javac、javadoc 或 apt。有关列表,请参阅 JDK 工具。类路径 1;类路径 2.jar、.zip 或 .class 文件的类路径。每个类路径都应以文件名或目录结尾,具体取决于您将类路径设置为: 对于包含 .class 文件的 .jar 或 .zip 文件,类路径以 .zip 或 .jar 文件的名称结尾。对于未命名包中的 .class 文件,类路径以包含 .class 文件的目录结尾。对于命名包中的 .class 文件,类路径以包含“根”包(完整包名中的第一个包)的目录结尾。多个路径条目用分号分隔。使用 set 命令,省略等号 (=) 周围的空格很重要。

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

既不是目录也不是档案(.zip.jar文件)也不是 * 的类路径条目将被忽略。

于 2018-02-18T04:53:40.627 回答
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()
于 2020-02-27T07:50:47.737 回答