在 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
来调用包中的存储过程,并指定输入参数 10
和 20
,以及输出参数 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();
}
}
}