查看原文
其他

Java教程-Java CallableStatement接口

点击关注👉 鸭哥聊Java 2023-08-31

整理:Java面试那些事儿


CallableStatement接口用于调用存储过程和函数


通过使用存储过程和函数,我们可以在数据库上实现业务逻辑,这样可以提高性能,因为它们是预编译的。


假设您需要根据出生日期获取员工的年龄,您可以创建一个接收日期作为输入并返回员工年龄作为输出的函数。


存储过程和函数之间的区别。


存储过程和函数之间的区别如下所示:

存储过程函数
用于执行业务逻辑。用于执行计算。
不能具有返回类型。必须具有返回类型。
可以返回0个或多个值。只能返回一个值。
可以从过程中调用函数。无法从函数中调用过程。
过程支持输入和输出参数。函数仅支持输入参数。
存储过程中可以使用try/catch块进行异常处理。在用户定义的函数中无法使用try/catch进行异常处理。


如何获取CallableStatement的实例?


Connection接口的prepareCall()方法返回CallableStatement的实例。语法如下:

public CallableStatement prepareCall("{ call procedurename(?,?...?)}");

以下示例演示获取CallableStatement实例:

CallableStatement stmt = con.prepareCall("{call myprocedure(?,?)}");

它调用名为myprocedure的过程,接受2个参数。

使用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表中。

专属福利

👉点击领取:651页Java面试题库


使用JDBC调用函数的示例


在此示例中,我们调用sum4函数,该函数接收两个输入并返回给定数字的总和。在这里,我们使用CallableStatement接口的registerOutParameter方法,该方法使用其相应的类型注册输出参数。它向CallableStatement提供有关所显示结果的类型的信息。


Types类定义了许多常量,例如INTEGER、VARCHAR、FLOAT、DOUBLE、BLOB、CLOB等。


让我们首先在数据库中创建简单的函数。

create or replace function sum4(n1 in number,n2 in number)return numberistemp number(8);begintemp := 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


 
最近技术热文

我就知道你会点赞+“在看”

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存