Java CallableStatement接口

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; /

【Java CallableStatement接口】现在, 让我们编写一个简单的程序来调用该函数。
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

    推荐阅读