Java调用Oracle存储过程获取结果集示例

需积分: 42 2 下载量 105 浏览量 更新于2024-09-14 收藏 41KB DOC 举报
“CallableStatement调用Oracle存储过程返回结果集(ResultSet)” 在Java中,CallableStatement接口用于调用数据库中的存储过程,特别是那些有输入、输出参数甚至返回结果集的存储过程。Oracle数据库是广泛使用的数据库系统,它支持创建各种类型的存储过程。本示例将详细介绍如何使用CallableStatement在Java中调用Oracle存储过程并获取结果集。 1. 无返回值的存储过程调用 - 首先,我们有一个名为`PRO_1`的Oracle存储过程,它接收两个IN参数(PARA1和PARA2),并在DBO表中插入一条新记录。存储过程的创建语法如下: ```sql CREATE OR REPLACE PROCEDURE PRO_1 ( PARA1 IN VARCHAR2, PARA2 IN VARCHAR2 ) AS BEGIN INSERT INTO DBO.EMP (ID, NAME) VALUES (PARA1, PARA2); END PRO_1; ``` - 在Java中,使用CallableStatement调用这个存储过程,代码如下: ```java package com.icesoft.service; import java.sql.*; public class CallProcedureTest1 { public CallProcedureTest1() { super(); } public static void main(String[] args) { String driver = "oracle.jdbc.driver.OracleDriver"; String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl"; String user = "admin"; String pwd = "password"; Connection conn = null; CallableStatement cs = null; try { Class.forName(driver); conn = DriverManager.getConnection(url, user, pwd); cs = conn.prepareCall("{call DBO.PRO_1(?,?)}"); cs.setString(1, "10"); cs.setString(2, "Peter"); cs.execute(); } catch (SQLException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (cs != null) { // 关闭CallableStatement cs.close(); } } catch (SQLException ex) { ex.printStackTrace(); } } } ``` 这里,`prepareCall`方法用于创建CallableStatement对象,字符串"{call DBO.PRO_1(?,?)}"是SQL语句,其中问号是占位符,对应于存储过程的参数。`setString`方法用于设置参数值,然后调用`execute`执行存储过程。 2. 带有结果集的存储过程调用 - 如果存储过程返回一个结果集,可以通过CallableStatement的`registerOutParameter`方法注册输出参数,并通过`getResultSet`方法获取结果集。例如,假设`PRO_2`是一个返回结果集的存储过程: ```sql CREATE OR REPLACE PROCEDURE PRO_2 ( PARA1 IN VARCHAR2, OUT_PARAM OUT SYS_REFCURSOR ) AS BEGIN OPEN OUT_PARAM FOR SELECT * FROM DBO.EMP WHERE ID = PARA1; END PRO_2; ``` - 调用此存储过程的Java代码: ```java cs.registerOutParameter(2, OracleTypes.CURSOR); // 注册输出参数 cs.setString(1, "10"); // 设置输入参数 cs.execute(); // 执行存储过程 ResultSet rs = (ResultSet) cs.getObject(2); // 获取结果集 while (rs.next()) { // 遍历结果集 System.out.println(rs.getString("ID") + ", " + rs.getString("NAME")); } ``` 在这里,`registerOutParameter`用于指定第二个参数(索引从1开始)为输出类型,并将其关联到Oracle的游标类型。执行存储过程后,通过`getObject`方法获取输出参数,因为结果集在Oracle中是通过游标返回的,所以需要类型转换。 总结,Java中的CallableStatement接口提供了灵活的方式来调用Oracle存储过程,无论是无返回值还是带有结果集的。通过设置输入参数,注册输出参数,以及正确处理结果集,可以方便地与Oracle数据库进行交互。在实际开发中,确保正确关闭数据库连接和游标,以避免资源泄漏,同时使用异常处理来确保程序的健壮性。