Java程序调用Oracle存储过程示例及参数处理

需积分: 36 3 下载量 161 浏览量 更新于2024-09-17 收藏 45KB DOC 举报
在Java程序中调用存储过程是数据库编程中的一项重要技能,特别是在处理Oracle数据库时。本文将详细介绍如何在Java环境中通过JDBC (Java Database Connectivity) 来实现与Oracle存储过程的交互。首先,我们需要设置好数据库环境,使用scott/tiger用户权限进行操作。 步骤一:数据库环境准备 在Oracle数据库中,我们创建了两个表carl_test和carl_test1,用于演示数据操作。`carl_test`表有一个VARCHAR2类型的字段A,而`carl_test1`表有多个数据项。插入示例数据如下: ```sql CREATE TABLE carl_test (A VARCHAR2(200)); CREATE TABLE carl_test1 (B VARCHAR2(200)); INSERT INTO carl_test1 VALUES ('carl1'); INSERT INTO carl_test1 VALUES ('carl2'); INSERT INTO carl_test1 VALUES ('carl3'); COMMIT; ``` 步骤二:创建存储过程 接下来,我们为Java程序创建一个名为`carl_sp_test`的存储过程,它接受三个参数:一个输入参数`v_monthly`,以及两个输出参数`last_inserted_rows_num`和`all_effected_rows_num`。这个过程包含了数据清理、插入和更新操作,并在每个阶段更新受影响的行数。存储过程代码如下: ```sql CREATE OR REPLACE PROCEDURE carl_sp_test ( v_monthly IN VARCHAR2, last_inserted_rows_num OUT NUMBER, all_effected_rows_num OUT NUMBER) IS BEGIN -- 清除carl_test表中的所有记录 DELETE FROM carl_test; -- 获取删除操作的影响行数 all_effected_rows_num := SQL%ROWCOUNT; COMMIT; -- 插入用户输入参数 INSERT INTO carl_test (A) VALUES (v_monthly); all_effected_rows_num := all_effected_rows_num + SQL%ROWCOUNT; -- 将carl_test1中的所有记录插入carl_test INSERT INTO carl_test SELECT * FROM carl_test1; -- 获取最后插入的行数 last_inserted_rows_num := SQL%ROWCOUNT; all_effected_rows_num := all_effected_rows_num; END; ``` 在Java程序中调用这个存储过程,你需要以下步骤: 1. 加载数据库驱动:使用JDBC连接Oracle数据库,首先确保已添加JDBC驱动到项目的类路径中。 2. 建立连接:通过DriverManager或DataSource对象获取数据库连接。 3. 创建Statement或PreparedStatement:对于简单的存储过程,可以使用Statement;如果涉及参数,推荐使用PreparedStatement以防止SQL注入攻击。 4. 执行存储过程:设置PreparedStatement的参数(如果适用),然后调用execute()或executeQuery()方法。 5. 获取结果:如果存储过程有输出参数,可以通过Statement的getResultSet()方法获取结果集,然后处理输出参数。 6. 关闭资源:确保关闭Connection、Statement和ResultSet以释放数据库资源。 下面是一个简化的Java示例代码片段,展示了如何调用`carl_sp_test`存储过程: ```java import java.sql.*; public class Main { public static void main(String[] args) { String url = "jdbc:oracle:thin:@your_host:your_port:your_service"; String user = "scott"; String password = "tiger"; try (Connection conn = DriverManager.getConnection(url, user, password); CallableStatement stmt = conn.prepareCall("{call carl_sp_test(?, ?, ?)}")) { // 设置输入参数 stmt.setString(1, "example_month"); // 获取输出参数的占位符 stmt.registerOutParameter(2, Types.NUMERIC); // last_inserted_rows_num stmt.registerOutParameter(3, Types.NUMERIC); // all_effected_rows_num // 执行存储过程 stmt.execute(); // 获取输出参数 ResultSet rs = stmt.getResultSet(); if (rs.next()) { int lastInsertedRows = rs.getInt(1); // last_inserted_rows_num int allAffectedRows = rs.getInt(2); // all_effected_rows_num System.out.println("Last inserted rows: " + lastInsertedRows); System.out.println("All affected rows: " + allAffectedRows); } } catch (SQLException e) { e.printStackTrace(); } } } ``` 总结,本文详细介绍了在Java程序中如何通过JDBC调用Oracle数据库的存储过程,包括创建表、存储过程的定义和执行过程。理解这些概念和步骤,可以帮助你有效地进行数据库操作,提升Java应用程序与数据库的集成能力。