📅  最后修改于: 2020-10-13 01:31:03             🧑  作者: Mango
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. |
Connection接口的prepareCall()方法返回CallableStatement的实例。语法如下:
public CallableStatement prepareCall("{ call procedurename(?,?...?)}");
下面给出了获取CallableStatement实例的示例:
CallableStatement stmt=con.prepareCall("{call myprocedure(?,?)}");
它调用接收2个参数的过程myprocedure。
要调用存储过程,您需要在数据库中创建它。在这里,我们假设存储过程看起来像这样。
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表中。
在此示例中,我们调用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