Java CallableStatement接口

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

标签: java, Java面试题, Java下载, java教程, java技术, Java学习, Java学习教程, Java语言, Java开发, Java入门教程, Java进阶教程, Java高级教程, Java笔试题, Java编程思想