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?
答案 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()