Java调用Oracle存储过程详解:无返回值与列表参数

需积分: 4 1 下载量 192 浏览量 更新于2024-09-17 收藏 20KB DOCX 举报
在Java中调用Oracle存储过程是一项常见的数据库操作,特别是在处理大量数据或者需要执行特定逻辑时。本文将详细介绍三种不同的调用场景,包括无返回值、有返回值但非列表类型以及返回列表的存储过程。 首先,对于无返回值的存储过程,例如: ```java CREATE OR REPLACE PROCEDURE stu_proc ( param1 IN VARCHAR2, param2 IN VARCHAR2 ) AS BEGIN INSERT INTO test_value (param1, param2); END; ``` Java代码示例中,创建了一个名为`stu_proc`的存储过程,它接收两个输入参数`param1`和`param2`,然后进行插入操作。在Java客户端调用这个存储过程时,我们通常使用`CallableStatement`来执行,如下所示: ```java import java.sql.*; public class OneNo { public OneNo() {} public static void main(String[] args) { String DB_URL = "jdbc:oracle:thin:@localhost:1521:orcl"; String DB_DRIVER = "oracle.jdbc.driver.OracleDriver"; String DB_USER = "test"; String DB_PWD = "test"; Connection conn = null; CallableStatement proc = null; try { Class.forName(DB_DRIVER); conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PWD); proc = conn.prepareCall("{call stu_proc(?, ?)}"); proc.setString(1, "zhangsan"); proc.setInt(2, 12); System.out.println("调用完成: " + conn); proc.execute(); // 执行存储过程 } catch (Exception e) { // 处理异常 } finally { try { if (null != proc) { proc.close(); // 关闭CallableStatement } conn.close(); // 关闭Connection } catch (SQLException ex) { // 处理关闭资源时可能出现的异常 } } } } ``` 在Java调用有返回值的存储过程时,Oracle使用`OUT`参数来传递结果,而非直接返回。如果返回值是非列表类型,可以在存储过程中设置这些变量,然后在Java代码中通过`ResultSet`获取。例如,如果存储过程设置了某个字段为输出参数,Java端可以这样处理: ```java CallableStatement.setObject(3, result); // 假设result是存储过程设置的输出变量 ResultSet rs = proc.getResultSet(); // 获取结果集 // 处理结果集... ``` 对于返回列表的存储过程,由于Oracle的`OUT`参数不能直接表示集合,这时通常会使用`PACKAGE`(包)来封装返回值。例如,创建一个包装类来承载结果: ```java package cn.org.test.pro; import java.sql.*; public class ResultWrapper { private List<YourDataType> list; // 用适当的列表类型替换 // 构造方法、getter和setter } public class Main { public static void main(String[] args) { // 使用CallableStatement获取并解析存储过程返回的ResultWrapper对象 ResultWrapper wrapper = (ResultWrapper) proc.getObject(3); // 处理wrapper对象中的列表数据 for (YourDataType item : wrapper.getList()) { // ... } } } ``` 总结来说,Java调用Oracle存储过程涉及准备语句、设置参数、执行存储过程以及处理可能的返回值。无返回值的调用相对简单,有返回值的可能需要处理`ResultSet`,而返回列表的情况则需要使用`PACKAGE`来组织数据结构。确保在编码过程中正确连接数据库,处理异常,并且遵循资源管理的最佳实践。