📜  Java CallableStatement接口

📅  最后修改于: 2020-10-13 01:31:03             🧑  作者: Mango

Java CallableStatement接口

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

通过使用存储过程和函数,我们可以在数据库上拥有业务逻辑,这将使性能更好,因为它们是预编译的。

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

存储过程和函数之间有什么区别?

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

Stored Procedure Function
is used to perform business logic. is used to perform calculation.
must not have the return type. must have the return type.
may return 0 or more values. may return only one values.
We can call functions from the procedure. Procedure cannot be called from function.
Procedure supports input and output parameters. Function supports only input parameter.
Exception handling using try/catch block can be used in stored procedures. Exception handling using try/catch can’t be used in user defined functions.

如何获取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