如何使用 JDBC 程序调用返回输出参数的存储过程?

jdbcjava 8object oriented programmingprogramming

答:存储过程是子例程,是存储在 SQL 目录中的 SQL 语句片段。所有可以访问关系数据库(Java、Python、PHP 等)的应用程序都可以访问存储过程。

存储过程包含 IN 和 OUT 参数或两者。如果您使用 SELECT 语句,它们可能会返回结果集。存储过程可以返回多个结果集。

您可以使用以下语法调用存储过程:

CALL procedure_name (input_parameter1, input_parameter2, input_parameter3)

JDBC 提供了标准的存储过程 SQL 转义语法,您可以使用该语法在所有 RDBMS 中执行过程

要使用 JDBC 程序调用存储过程,您需要:

  • 使用 DriverManager 类的 registerDriver() 方法注册驱动程序类。将驱动程序类名称作为参数传递给它。

  • 建立连接:使用 DriverManager 类的 getConnection() 方法连接到数据库。将 URL(字符串)、用户名(字符串)、密码(字符串)作为参数传递给它。

  • 创建 Statement:使用 Connection 接口的 prepareCall() 方法创建 CallableStatement 对象。

  • 执行查询:使用 Statement 接口的 executeupdate() 方法执行查询。

示例

假设数据库中有一个名为 Sales 的表,其内容如下:

+----+-------------+--------------+--------------+--------------+-------+----------------+
| ID | ProductName | CustomerName | DispatchDate | DeliveryTime | Price | Location       |
+----+-------------+--------------+--------------+--------------+-------+----------------+
| 1  | Key-Board   | Raja         | 2019-09-01   | 05:30:00     | 2000  | Hyderabad      |
| 2  | Earphones   | Roja         | 2019-05-01   | 05:30:00     | 2000  | Vishakhapatnam |
| 3  | Mouse       | Puja         | 2019-03-01   | 05:29:59     | 3000  | Vijayawada     |
| 4  | Mobile      | Vanaja       | 2019-03-01   | 04:40:52     | 9000  | Chennai        |
| 5  | Headset     | Jalaja       | 2019-04-06   | 18:38:59     | 6000  | Goa            |
+----+-------------+--------------+--------------+--------------+-------+----------------+

我们在数据库中创建了一个名为 getProductPrice 的存储过程,如下所示:

mysql> DELIMITER // ;
mysql> CREATE PROCEDURE getProductPrice (
          IN in_id INTEGER,
          OUT out_ProdName VARCHAR(20),
          OUT out_CustName VARCHAR(20),
          OUT out_price INTEGER)
       BEGIN
          SELECT ProductName, CustomerName, Price
          INTO out_ProdName, out_CustName, out_price
          FROM Sales where id = in_id;
       END //
Query OK, 0 rows affected (0.04 sec)
mysql> DELIMITER ;

此过程接受客户的 ID 作为 IN 参数,并从客户表中返回产品名称(字符串)、客户名称(字符串)和价格(整数)值作为 OUT 参数。

以下 JDBC 程序与 MySQL 数据库建立连接,并通过传递 ID 值来调用名为 getProductPrice 的过程,并从此过程的 OUT 参数中检索产品名称、客户名称和价格值并显示这些值。

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Types;
public class CallngStoredProcedureExample_OUT {
   public static void main(String args[]) throws SQLException {
      //注册驱动程序
      DriverManager.registerDriver(new com.mysql.jdbc.Driver());
      //获取连接
      String mysqlUrl = "jdbc:mysql://localhost/mydatabase";
      Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
      System.out.println("Connection established......");
      //准备 CallableStatement 来调用过程
      CallableStatement cstmt = con.prepareCall("{call getProductPrice(?, ? ,?, ? )}");
      //设置 TN 参数的值
      cstmt.setInt(1, 3);
      //注册 OUT 参数的类型
      cstmt.registerOutParameter(2, Types.VARCHAR);
      cstmt.registerOutParameter(3, Types.VARCHAR);
      cstmt.registerOutParameter(4, Types.INTEGER);
      //执行 CallableStatement
      cstmt.executeUpdate();
      //检索产品名称、客户名称和价格的值
      String product_name = cstmt.getString(2);
      String customer_Name = cstmt.getString(3);
      int price = cstmt.getInt(4);
      System.out.println("Details of the sale with given id are: ");
      //显示值
      System.out.println("Product Name: "+product_name);
      System.out.println("Customer Name: "+customer_Name);
      System.out.println("Price: "+price);
   }
}

输出

Connection established......
Details of the sale with given id are:
Product Name: Mouse
Customer Name: Puja
Price: 3000

相关文章