以下是我能够通过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
我想我在这里缺少一些基本的东西。谁知道我失败了?感谢。
答案 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
。