Java调用Oracle存储过程获取结果集示例
需积分: 42 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数据库进行交互。在实际开发中,确保正确关闭数据库连接和游标,以避免资源泄漏,同时使用异常处理来确保程序的健壮性。
2020-09-21 上传
2020-12-16 上传
2022-07-06 上传
2009-05-15 上传
2022-06-11 上传
2024-06-28 上传
2008-10-14 上传
2008-05-08 上传
chtalan
- 粉丝: 10
- 资源: 1
最新资源
- 构建基于Django和Stripe的SaaS应用教程
- Symfony2框架打造的RESTful问答系统icare-server
- 蓝桥杯Python试题解析与答案题库
- Go语言实现NWA到WAV文件格式转换工具
- 基于Django的医患管理系统应用
- Jenkins工作流插件开发指南:支持Workflow Python模块
- Java红酒网站项目源码解析与系统开源介绍
- Underworld Exporter资产定义文件详解
- Java版Crash Bandicoot资源库:逆向工程与源码分享
- Spring Boot Starter 自动IP计数功能实现指南
- 我的世界牛顿物理学模组深入解析
- STM32单片机工程创建详解与模板应用
- GDG堪萨斯城代码实验室:离子与火力基地示例应用
- Android Capstone项目:实现Potlatch服务器与OAuth2.0认证
- Cbit类:简化计算封装与异步任务处理
- Java8兼容的FullContact API Java客户端库介绍