在Java中调用Oracle存储过程

时间:2014-10-14 01:09:23

标签: java database oracle stored-procedures sys-refcursor

以下是我能够通过SqlDeveloper

执行存储过程的方法
var p refcursor;
exec DMG.Getstudentids(12342343,:p);
print p;

输出

P
-----------
STUDENT_ID
-----------
23432425
54353455

现在我尝试以相同的方式执行存储过程,但是在Java中。这是我的代码,我遗漏了一些输入/输出参数或它们的数据类型。

Connection connection = DriverManager.getConnection(url, user, pass);
CallableStatement cs = connection.prepareCall("{call DMG.Getstudentids(?,?)}");
cs.setFloat(1, 12342343);
cs.registerOutParameter(2, Types.OTHER);
cs.execute();
List<Integer> result = (List<Integer>) cs.getArray(2);

我收到以下错误

java.sql.SQLException: Invalid column type: 1111

我想我在这里缺少一些基本的东西。谁知道我失败了?感谢。

1 个答案:

答案 0 :(得分:3)

请尝试以下操作:

Connection connection = DriverManager.getConnection(url, user, pass);
CallableStatement cs = connection.prepareCall("{call DMG.Getstudentids(?,?)}");
cs.setFloat(1, 12342343);
cs.registerOutParameter(2, OracleTypes.CURSOR);
cs.executeQuery();
ResultSet resultSet=cs.getObject(1);
List<Integer> result = new ArrayList<Integer>();
while(resultSet.next()){
 result.add(resultSet.getInt(STUDENT_ID));
}

Note :由于procedure正在返回refcursor,您需要将OracleTypes.CURSOR注册为输出参数。

另外需要注意的是,您需要将整个数据集(refcursor)捕获到Result Set中,对其进行迭代并将提取的值放入List