如何从 JDBC Callablestatement 访问这个存储过程?

Posted

技术标签:

【中文标题】如何从 JDBC Callablestatement 访问这个存储过程?【英文标题】:How to access this stored Procedure from JDBC Callablestatement? 【发布时间】:2011-07-24 03:07:39 【问题描述】:

public class TestOCIApp 

public static void main(String args[]) throws ClassNotFoundException,
SQLException 

try 
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:orcle", "scott", "tiger");

CallableStatement cs = conn.prepareCall("call test(?,?)");
cs.setInt(1, 10);

cs.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR);

ResultSet rs = (ResultSet)cs.getObject(2);

while(rs.next())

System.out.println(rs.getString(2));


conn.close();
 catch (Exception e) 
e.printStackTrace();



我得到了异常

java.sql.SQLException:列索引无效 * 在 oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:180)* * 在 oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:222)* * 在 oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:285)* * 在 oracle.jdbc.driver.OracleStatement.prepare_for_new_get(OracleStatement.java:2804)* * 在 oracle.jdbc.driver.OracleStatement.getObjectValue(OracleStatement.java:4983)* * 在 oracle.jdbc.driver.OracleStatement.getObjectValue(OracleStatement.java:4964)* * 在 oracle.jdbc.driver.OracleCallableStatement.getObject(OracleCallableStatement.java:586)* * 在 TestOCIApp.main(TestOCIApp.java:23)*

create or replace procedure test( p_deptno IN number
, p_cursor OUT SYS_REFCURSOR)
is
begin
open p_cursor FOR
select *
from emp
where deptno = p_deptno;
end test;
/

【问题讨论】:

【参考方案1】:

当与 oracle 游标解除对齐时,CallableStatement 对象被强制转换为 OracleCallableStatement 以使用 getCursor 方法,该方法是标准 JDBC 应用程序编程接口 (API) 的 Oracle 扩展,并将 REF CURSOR 返回到 ResultSet 对象中。

cstmt.registerOutParameter(1, OracleTypes.CURSOR);
cstmt.execute();
cursor = ((OracleCallableStatement)cstmt).getCursor(1);

while (cursor.next ())
System.out.println (cursor.getString(1));
 

但这会将您的代码耦合到 oracle 数据库 [:(]

【讨论】:

以上是关于如何从 JDBC Callablestatement 访问这个存储过程?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 JDBC 创建或替换 Oracle 中的过程?

如何从休眠会话中获取 jdbc 连接? [复制]

如何从 AWS Glue 中的 JDBC 编目连接加载部分数据?

如何从 JDBC ResultSet 中获取列数?

如何从 JDBC 查询中获取所有元素

如何从 jdbc 代码传递数组对象