1

这是我如何通过 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

我想我在这里遗漏了一些基本的东西。有人看到我在哪里失败了吗?谢谢。

4

1 回答 1

4

尝试以下操作:

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.

于 2014-10-14T05:34:04.197 回答