CallableStatement接口用于调用存储过程和函数。
通过使用存储过程和函数, 我们可以在数据库上使用业务逻辑, 因为这些过程和函数是预编译的, 因此可以提高性能。
假设你需要根据出生日期获取雇员的年龄, 则可以创建一个函数来接收日期作为输入, 并返回雇员的年龄作为输出。
存储过程和函数之间有什么区别?
存储过程和函数之间的区别如下:
储存程序 | 功能 |
---|---|
用于执行业务逻辑。 | 用于执行计算。 |
不得具有返回类型。 | 必须具有返回类型。 |
可能会返回0个或多个值。 | 可能仅返回一个值。 |
我们可以从过程中调用函数。 | 无法从函数调用过程。 |
程序支持输入和输出参数。 | 功能仅支持输入参数。 |
使用try / catch块的异常处理可以在存储过程中使用。 | 使用try / catch的异常处理不能在用户定义的函数中使用。 |
如何获取CallableStatement的实例?
Connection接口的prepareCall()方法返回CallableStatement的实例。语法如下:
public CallableStatement prepareCall("{ call procedurename(?, ?...?)}");
下面给出了获取CallableStatement实例的示例:
CallableStatement stmt=con.prepareCall("{call myprocedure(?, ?)}");
它调用接收2个参数的过程myprocedure。
使用JDBC调用存储过程的完整示例
要调用存储过程, 你需要在数据库中创建它。在这里, 我们假设存储过程看起来像这样。
create or replace procedure "INSERTR"
(id IN NUMBER, name IN VARCHAR2)
is
begin
insert into user420 values(id, name);
end;
/
表结构如下:
create table user420(id number(10), name varchar2(200));
在此示例中, 我们将调用存储过程INSERTR, 该存储过程接收id和name作为参数并将其插入到表user420中。请注意, 你还需要创建user420表来运行此应用程序。
import java.sql.*;
public class Proc {
public static void main(String[] args) throws Exception{
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con=DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:xe", "system", "oracle");
CallableStatement stmt=con.prepareCall("{call insertR(?, ?)}");
stmt.setInt(1, 1011);
stmt.setString(2, "Amit");
stmt.execute();
System.out.println("success");
}
}
现在检查数据库中的表, 将值插入到user420表中。
使用JDBC调用函数的示例
在此示例中, 我们调用sum4函数, 该函数接收两个输入并返回给定数字的总和。在这里, 我们使用了CallableStatement接口的registerOutParameter方法, 该方法将输出参数注册为其相应的类型。它向CallableStatement提供有关所显示结果类型的信息。
Types类定义了许多常量, 例如INTEGER, VARCHAR, FLOAT, DOUBLE, BLOB, CLOB等。
让我们首先在数据库中创建简单函数。
create or replace function sum4
(n1 in number, n2 in number)
return number
is
temp number(8);
begin
temp :=n1+n2;
return temp;
end;
/
现在, 让我们编写一个简单的程序来调用该函数。
import java.sql.*;
public class FuncSum {
public static void main(String[] args) throws Exception{
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con=DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:xe", "system", "oracle");
CallableStatement stmt=con.prepareCall("{?= call sum4(?, ?)}");
stmt.setInt(2, 10);
stmt.setInt(3, 43);
stmt.registerOutParameter(1, Types.INTEGER);
stmt.execute();
System.out.println(stmt.getInt(1));
}
}
Output: 53
评论前必须登录!
注册