在 Oracle 中,可以将存储过程(PROCEDURE)定义在一个包(PACKAGE)中。

要调用包中的存储过程,需要使用包名和存储过程名来引用它们。以下是一个示例:

假设我们有一个名为 my_package 的包,其中包含一个名为 add_numbers 的存储过程,用于将两个数字相加。存储过程定义如下:

CREATE OR REPLACE PACKAGE my_package AS
  PROCEDURE add_numbers(num1 IN NUMBER, num2 IN NUMBER, sum OUT NUMBER);
END my_package;

CREATE OR REPLACE PACKAGE BODY my_package AS
  PROCEDURE add_numbers(num1 IN NUMBER, num2 IN NUMBER, sum OUT NUMBER) AS
  BEGIN
    sum := num1 + num2;
  END add_numbers;
END my_package;

要调用包中的存储过程,需要使用以下语法:

DECLARE
  result NUMBER;
BEGIN
  my_package.add_numbers(10, 20, result);
  DBMS_OUTPUT.PUT_LINE(result);
END;

在上面的示例中,我们首先使用 DECLARE 语句定义一个名为 result 的变量。然后,我们使用 my_package.add_numbers 来调用包中的存储过程,并指定输入参数 1020,以及输出参数 result。最后,我们使用 DBMS_OUTPUT.PUT_LINE 函数在控制台上输出结果。如果一切顺利,我们将在控制台上看到输出结果为 30。注意,此示例中使用的 DBMS_OUTPUT.PUT_LINE 函数用于输出结果到控制台,但在某些情况下,可能需要根据具体情况进行修改。

 

Java使用CallableStream调用

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Types;

public class Example {
    public static void main(String[] args) {
        try {
            // 1. 创建数据库连接
            String url = "jdbc:mysql://localhost:3306/mydatabase";
            String username = "root";
            String password = "mypassword";
            Connection conn = DriverManager.getConnection(url, username, password);

            // 2. 创建 CallableStatement 对象
            String sql = "{call my_package.add_numbers(?, ?, ?)}";
            CallableStatement stmt = conn.prepareCall(sql);

            // 3. 设置输入参数
            int param1 = 10;
            int param2 = 20;
            stmt.setInt(1, param1);
            stmt.setInt(2, param2);

            // 4. 注册输出参数
            stmt.registerOutParameter(3, Types.INTEGER);

            // 5. 执行存储过程
            stmt.execute();

            // 6. 获取输出参数
            int result = stmt.getInt(3);
            System.out.println("Result: " + result);

            // 7. 关闭连接和语句
            stmt.close();
            conn.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}