Java Database Connectivity (JDBC) API 是 J2EE 的一部分,是 Java 语言访问关系数据库的基于标准的首要机制,提供了对数据库访问和缓存管理的直接控制。
JDBC 中的 CallableStatement 对象为所有的关系数据库管理系统 (RDBMS: Relational Database Management System) 提供了一种标准形式调用存储过程的方法。对存储过程的调用有两种形式:带结果参数和不带结果参数。结果参数是一种输出参数,是存储过程的返回值。两种形式都可带有数量可变的输入(IN 参数)、输出(OUT 参数)或输入和输出(INOUT 参数)的参数。
在 JDBC 中调用存储过程的语法为:{call procedure_name[(?, ?, ...)]} ;返回结果参数的存储过程的语法为:{? = call procedure_name[(?, ?, ...)]} ;不带参数的存储过程的语法为:{call procedure_name} 。其中,问号代表参数,方括号表示其间的内容是可选项。
使用 CallableStatement 对象调用存储过程的过程如下:
1. 使用 Connection.prepareCall 方法创建一个 CallableStatement 对象。
2. 使用 CallableStatement.setXXX 方法给输入参数(IN)赋值。
3. 使用 CallableStatement.registerOutParameter 方法来指明哪些参数只做输出参数(OUT),哪些是输入输出参数(INOUT)。
4. 调用以下方法之一来调用存储过程:
* int CallableStatement.executeUpdate: 存储过程不返回结果集。
* ResultSet CallableStatement.executeQuery: 存储过程返回一个结果集。
* Boolean CallableStatement.execute: 存储过程返回多个结果集。
* int[] CallableStatement.executeBatch: 提交批处理命令到数据库执行。
5. 如果存储过程返回结果集,则得到其结果集。
6. 调用 CallableStatement.getXXX 方法从输出参数 (OUT) 或者输入输出参数 (INOUT) 取值。
7. 使用完 CallableStatement 对象后,使用 CallableStatement.close 方法关闭 CallableStatement 对象。
举例
清单1是一个使用 executeUpdate 来执行的存储过程的例子。存储过程名为 exampleJDBC,含有五个参数,前两个分别是 String 和 Int 类型的输入参数,后三个分别是整型,整型和字符型的输出参数。分别给输入参数赋值 ”Beijing” 和 2008,执行 executeUpdate 命令后,从后三个输出参数中可以得到输出值,没有结果集返回。需要说明的是,这里的参数下标是以 1 开始的,与 java 数组下标以 0 开始不同。
清单 1.
使用 executeUpdate 来执行的存储过程
Connection con = null;
...
// Create a CallableStatement object
CallableStatement cstmt = con.prepareCall("CALL exampleJDBC (?, ?, ?, ?, ?)");
cstmt.setString (1, “BeiJing”); // Set input parameter
cstmt.setInt (2, 2008); // Set input parameter
cstmt.registerOutParameter (3, Types.INTEGER);
cstmt.registerOutParameter (4, Types.INTEGER);
cstmt.registerOutParameter (5, Types.VARCHAR);
cstmt.executeUpdate(); // Call the stored procedure
int goldnumber = cstmt.getInt(3); // Get the output parameter values
int silvernumber = cstmt.getInt(4);
String errorinfo = cstmt.getString(5);
cstmt.close();
当存储过程返回一个结果集时,只需遍历该结果集便可以得到存储过程执行的所有结果。具体例子见清单2。
清单 2.
存储过程返回一个结果集
CallableStatement cstmt = null;
…
boolean moreResultSets = cstmt.execute();
ResultSet rs1 = cstmt.getResultSet();
while (rs1.next())
System.out.println(rs1.getString(1) + " " + rs1.getString(2));
当存储过程返回多个结果集时,遍历所有结果集才能得到执行的所有结果,使用 getMoreResults() 方法跳转到下一个结果集。具体例子见清单3。
清单 3.
存储过程返回多个结果集
CallableStatement cstmt = null;
…
While (cstmt.getMoreResults()) {
ResultSet rs2 = cstmt.getResultSet();
while (rs2.next())
System.out.println(rs2.getString(1) + " " + rs2.getString(2));
rs2.close();
}
如果存储过程返回多个结果集,每个结果集的数据结构都不一样,或者某些结果集的数据结构未知,则可以使用 getColumnName() 方法来得到结果集中数据的列名。具体例子见清单 4。
清单 4.
存储过程返回多个结果集,并且每个结果集的数据结构未知或者不一样
CallableStatement cstmt = null;
…
boolean moreResultSets = cstmt.execute();
while (moreResultSets) {
ResultSet rs = cstmt.getResultSet();
ResultSetMetaData rsmd = rs.getMetaData();
StringBuffer buffer = new StringBuffer();
for (int i = 1; i <= rsmd.getColumnCount(); i++){
buffer.append(rsmd.getColumnName(i)).append("\t");
System.out.println(buffer.toString());
while (rs.next()) {
buffer.setLength(0);
for (int i = 1; i <= rsmd.getColumnCount(); i++)
buffer.append(rs.getString(i)).append("\t");
System.out.println(buffer.toString());
}
}
rs.close();
moreResultSets = cstmt.getMoreResults();
}
适用场景:
多年来 JDBC 一直是 Java 开发人员进行数据访问的标准,这是一种稳定且被广泛证实的技术,目前已经发展成可以提供完全具有高速缓存和资源池机制的完善的数据库驱动程序。使用 JDBC 来调用存储过程是最常见的一种方式,由于 JDBC 是最接近于数据库的 API,因而其效率也是最高的。CallableStatement 对象为所有的 DBMS 提供了标准形式调用存储过程的方法,对于要求实现灵活,执行效率要求比较高应用,直接采用 JDBC API 来实现存储过程能很好地满足需要。
分享到:
相关推荐
本篇文章将深入探讨如何使用JDBC调用存储过程。 首先,存储过程是预编译的SQL代码集合,它们封装在数据库中,可以接收输入参数,处理数据,然后返回结果或输出参数。存储过程在提高性能、增强安全性和简化复杂操作...
本文将详细讲解如何使用JDBC来调用存储过程,以实现数据的增删改查操作。 首先,理解存储过程是数据库中的一个重要概念。存储过程是一组预先编译好的SQL语句集合,它可以包含控制流语句、输入/输出参数,甚至可以有...
### JDBC调用存储过程 1. **加载驱动**:使用`Class.forName()`方法加载Oracle的JDBC驱动,例如`oracle.jdbc.driver.OracleDriver`。 2. **建立连接**:通过`DriverManager.getConnection()`方法获取数据库连接。 3....
本文将详细阐述如何通过JDBC在Java程序中调用存储过程和函数,并提供一个实际的例子。 ### 1. JDBC概述 JDBC是Java API,它提供了统一的接口来访问不同类型的数据库。通过JDBC,开发者可以进行数据库连接、执行SQL...
在给定的代码片段中,我们可以看到一个典型的使用JDBC调用存储过程的例子。下面,我们将分步骤解析这段代码: 1. **加载JDBC驱动**: ```java try{ Class.forName(...
本篇文章将详细讲解如何利用JDBC调用存储过程、函数以及处理游标。 首先,存储过程是数据库中预编译的一组SQL语句,它允许我们封装复杂的业务逻辑,提高执行效率,减少网络传输的数据量。在JDBC中调用存储过程通常...
3. **创建CallableStatement对象**:JDBC提供`CallableStatement`接口来调用存储过程。你需要提供一个SQL的CALL语句,格式为`{call procedure_name(?, ?...)}`,其中问号代表参数: ```java CallableStatement cs ...
上述代码中的文件名列表(如Project1.cfg、Unit1.dcu等)与Java调用存储过程无关,它们看起来像是Delphi或FreePascal项目的文件,这些文件通常用于描述项目配置、单元信息、表单布局等,而不是与Java直接相关。...
- **使用API或驱动**:大多数数据库提供API(如Java的JDBC,C#的ADO.NET)或驱动程序,允许开发者在应用程序代码中调用存储过程。例如,在Java中,使用CallableStatement对象可以调用存储过程。 - **SQL命令**:在...
JDBC(Java Database Connectivity)是Java语言中用来与数据库交互的标准API,它提供了一种标准的方式来调用存储过程。本篇将详细介绍如何通过JDBC来调用Oracle数据库中的存储过程,并解析示例代码的关键部分。 ###...
在这个“JDBC调用存储过程的小例子”中,我们将探讨如何使用JDBC来执行数据库中的存储过程,这是一个非常实用的功能,特别是在处理复杂的业务逻辑或批量数据操作时。 首先,我们需要了解什么是存储过程。存储过程是...
本篇将详细介绍如何使用JDBC连接Oracle数据库并执行存储过程。 首先,我们需要理解JDBC的基本概念。JDBC是Java平台的标准API,它允许Java程序与各种数据库进行通信。通过JDBC,我们可以创建数据库连接、发送SQL语句...
JDBC提供了一组接口和类,使得Java程序能够执行SQL语句,包括调用存储过程。主要涉及的接口有`java.sql.CallableStatement`,它是`PreparedStatement`的子接口,用于执行数据库的存储过程。 3. **CallableStatement...
3. **调用存储过程**:使用`CallableStatement`对象来执行存储过程。对于带参数的存储过程,需要设置参数并执行`executeProcedure()`。 ```java String procedureName = "{call findAllBook(?) }"; // 例如,调用...
总结来说,Hibernate调用存储过程是通过`StoredProcedureQuery`对象实现的,提供了更简便的对象化API。对比JDBC,Hibernate更注重开发者体验,而JDBC则更适合对数据库操作有深度控制的需求。在实际开发中,根据项目...
下面将详细介绍如何在MyEclipse中使用Java调用存储过程,并探讨相关的知识点。 1. **存储过程概述** 存储过程是预编译的SQL语句集合,存储在数据库服务器中,可以被多次调用,以提高执行效率。它们允许开发者封装...
在Java编程中,调用Oracle数据库的存储过程和函数是常见的任务,这通常涉及到JDBC(Java Database Connectivity)API的使用。以下将详细介绍这个过程,包括必要的步骤、使用的类和方法,以及可能遇到的问题和解决...
6. **CallableStatement对象**:用于调用存储过程和函数,可以设置输入、输出和输入/输出参数。 7. **ResultSet对象**:表示SQL查询的结果集,提供了遍历查询结果的方法,如next()方法用于移动到下一行。 8. **...
JDBC(Java Database Connectivity)是Java中访问数据库的标准API,可以直接使用JDBC来调用存储过程。 ##### 2.1 创建CallableStatement对象 我们可以使用`Connection`对象的`prepareCall`方法来创建一个`...
在本场景中,我们讨论的是如何使用JDBC调用Oracle数据库中的存储过程。存储过程是一组预先编译的SQL语句,可以提高数据库操作的效率和安全性。 首先,我们需要了解如何创建Oracle存储过程。在示例中,我们看到了三...