技术开发 频道

J2EE 应用程序中的数据管理和数据持久性

         从 Java 代码调用存储过程

  存储过程是一组 SQL 语句,它们建立了一个逻辑单元,并执行特定任务。可以用存储过程来封装一个操作或者查询的集合,这些操作或查询都将在一个数据库服务器上执行。存储过程是在数据库服务器中被编译和存储的。因此,每次调用存储过程时,DBMS 都将重用已编译的二进制代码,因此执行速度会更快。

  JDBC 允许您从 Java 应用程序中调用数据库存储过程。第一步是创建 CallableStatement 对象。与 Statement 和 PreparedStatement 对象一样,这项操作是用一个打开的 Connection 对象完成的。 CallableStatement 对象包含对存储过程的调用;但它并不包含存储过程自身。列表 6 中的第一行代码使用 con 连接建立了对存储过程 SHOW_ACCOUNT 的调用。波形括号中括住的部分是存储过程的转义语法。当驱动程序遇到 {call SHOW_ACCOUNT} 时,它将该转义语法翻译成数据库所使用的本地 SQL,从而调用名为 SHOW_ACCOUNT 的存储过程。

  列表 6. 实际运行中的存储过程

1 CallableStatement cs = con.prepareCall("{call SHOW_ACCOUNT(?)}");
2 cs.setInt(1,myaccountnumber);
3 ResultSet rs = cs.executeQuery();
4

  假设 Sybase 中的存储过程 SHOW_ACCOUNT 包含列表 7 中所示的代码。

  Listing 7. SHOW_ACCOUNT stored procedure

1 CREATE PROCEDURE SHOW_ACCOUNT (@Acc int)
2 AS
3 BEGIN
4     Select balance from USER_ACCOUNTS where Account_no = @Acc
5 END
6

  ResultSet rs 看起来类似于:

1 balance            
2 ----------------        
3 12000.95
4

  注意,用来执行 cs 的方法是 executeQuery() ,由于 cs 调用的存储过程只包含一个查询,所以只产生一个结果集。如果该过程只包含一个更新或者一个 DDL 语句,则将使用 executeUpdate() 方法。然而,有时候存在存储过程包含多个 SQL 语句的情况,在这种情况下,它将产生多个结果集、多个更新计数,或者结果集和更新计数的某种结合。因此,应该使用 execute() 方法执行 CallableStatement 。

  CallableStatement 类是 PreparedStatement 的子类,因此 CallableStatement 对象可以接受与 PreparedStatement 对象相同的参数。而且, CallableStatement 对象可以接受输出参数,并将该参数用于输入和输出。 INOUT 参数和 execute() 方法通常很少使用。要想处理 OUT 参数,需要通过使用 registerOutParameter(int, int) 方法将 OUT 参数注册到存储过程。

  举例说明,我们假设 GET_ACCOUNT 过程包含列表 8 中的代码。

  列表 8. GET_ACCOUNT

1 CREATE PROCEDURE GET_ACCOUNT (@Acc int, @balance float OUTPUT)
2 AS
3 BEGIN
4 Select @balance = balance from USER_ACCOUNTS where Account_no =     @Acc
5 END
6

  在这个实例中,参数 balance 被声明是一个 OUT 参数。现在,调用该过程的 JDBC 代码如列表 9 所示。

  列表 9. 调用一个存储过程的 JDBC 代码

1 CallableStatement csmt = con.prepareCall("{GET_ACCOUNT(?,?)");
2 csmt.setInt(1,youraccountnumber);
3 csmt.registerOutParamter(2,java.sql.Types.FLOAT);
4 csmt.execute();
5

  正使用 Java 序列化时,并不需要访问任何外部的系统,如 DBMS。换句话说,序列化是一个纯 Java 语言现象,它不涉及执行一个外部环境中的已编译代码。因此,在序列化中不存在与 CallableStatement 对象相对应的机制。这意味着您不能将数据处理转移到外部系统或者组件中,尽管这些系统或者组件可能更适合它。

0
相关文章