其他
Java教程-Java CallableStatement接口
整理: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表中。
专属福利
使用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
我就知道你会点赞+“在看”