您现在正在浏览:首页 > 职教文章 > 职教论文 > 基于 Oracle 10g的 JAVA 存储过程应用研究

基于 Oracle 10g的 JAVA 存储过程应用研究

日期: 2010/5/17 浏览: 93 来源: 学海网收集整理 作者: 佚名

http://www.paper.edu.cn

-1-

基于 Oracle 10g 的 JAVA 存储过程应用研究

张楠

大连理工大学软件学院,辽宁大连 (116023)

E-mail:bluesea-zhang@sohu.com

摘 要:介绍了 Oracle 和存储过程,在对 JAVA 存储过程和 PL/SQL 存储过程的比较分析

的基础上, 探讨了 JAVA 存储过程在 Oracle 10g 中的应用,详细阐述了 JAVA 存储过程的

应用方法。

关键词:Oracle;PL/SQL;JAVA 存储过程

中图分类号:TP311



1. 引 言

大型应用系统运行过程中,经常要进行大规模的数据库操作,在调用数以万计的数据

的时候,平常所用的逐条执行 SQL 语句的模式显然不能满足性能需要;在实现业务逻辑的

时候,数据库端只存有一些简单的 SQL 语句,而在客户端程序中使用大量的代码来实现,

这样系统将利用大量时间执行代码和通过网络传送数据,造成性能低下[3]。存储过程的使

用可以解决这些问题。存储过程运行在 DBMS 自身,所有关联的 SQL 操作都可以在数据

库内部实现,网络上的数据往返次数的减少可以减少应用程序的等待时间,从而极大地优

化性能;数据相关的业务逻辑也可以配置在数据库内部,而不需要在程序中用大量的代码

实现,通过调用存储过程,可以用很少的代码实现复杂的业务逻辑,使程序高效而且便于

开发和维护。本文详细介绍 Oracle 10g 中 JAVA 存储过程的编写,发布和调用。

2. 存储过程的定义

存储过程 (storage procedure) 是一种数据库对象,是服务器端反复使用的经过预编译

的 Transact-SQL 语句的集合[3]。它将常用的或很复杂的工作,预先用 SQL 语句写好并用一

个指定的名称存储起来,当需要数据库提供与已定义好的存储过程的功能相同的服务时,

只需调用存储过程,把存储过程的名称及指定的参数通过 JDBC 连接发送给 DBMS,执行

存储过程并通过连接返回结果。它是一种封装重复任务操作的方法,支持用户提供的参数

变量,并且具有强大的编程能力。存储过程能够改善 Transact- SQL 语句的运行性能,提高

其执行效率。它将运行于数据库层中的持久性逻辑与运行于中间层中的商务逻辑有效地分

离开来,这种分离可以降低整个应用程序的复杂性,并提供其重用性、安全性和可伸缩性。

3. 存储过程的优点

1. 存储过程只在创建时进行编译,以后每次执行存储过程都不需再重新编译,而且存

储过程是被编译后存放在数据库服务器的高速缓存中,而一般 SQL 语句每执行一次就编译

一次,所以使用存储过程可提高数据库执行速度[4]。

2. 当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query,Delete 时),可将此

复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。

3. 存储过程可以重复使用,可减少数据库开发人员的工作量。

4. 实现模块化设计。存储过程允许开发人员封装商业功能,提供给用户一个简单的接

口,用户只关心它们能够处理的信息即可。存储过程是一种减少过程设计复杂度的好方法。

http://www.paper.edu.cn

-2-

5. 增强可维护性。通过隐藏存储过程后面数据库的结构细节,当数据库管理员改变数

据库结构时,可以减少改变其他所有组件( 客户端应用程序和中间组件) 的必要性。

6. 减少网络流量。如果一个客户端/服务器系统设计得好,客户端将会只接收它需要

的信息, 通常这些信息只是数据库的一部分,与文件服务器结构相比网络流量显著减少。

7. 安全性高。一个好的数据库系统的标志就是它可以防止用户直接访问表,强制用户

使用存储过程执行特定的函数,而通过函数来管理一组存储过程,也比直接管理表和列级

的许可要容易得多。

4. Oracle 介绍

Oracle公司于1979年,首先推出基于SQL标准的关系数据库产品,可在100多种硬件平台

上运行(包括微机、工作站、小型机、中型机和大型机),支持很多种操作系统[1]。Oracle

支持最大数据库,其大小可到几百千兆,可充分利用硬件设备。支持大量用户同时在同一数

据上执行各种数据应用,并使数据争用最小,保证数据一致性;Oracle遵守数据存取语言、

操作系统、用户接口和网络通信协议的工业标准;Oracle为了充分利用计算机系统和网络,

允许将处理分为数据库服务器和客户应用程序,所有共享的数据管理由数据库管理系统的计

算机处理,而运行数据库应用的工作站集中于解释和显示数据。

5. 选择 PL/SQL 还是 JAVA

PL/SQL 是一种高性能的基于事务处理的语言,能运行在任何 Oracle 环境中,支持所

有数据处理命令[2]。通过使用 PL/SQL 程序单元处理 SQL 的数据定义和数据控制元素。

PL/SQL 支持所有 SQL 数据类型和所有 SQL 函数,同时支持所有 Oracle 对象类型。PL/SQL

块可以被命名和存储在 Oracle 服务器中,同时也能被其他的 PL/SQL程序或 SQL 命令调用,

任何客户/服务器工具都能访问 PL/SQL 程序,具有很好的可重用性。可以使用 Oracle 数据

工具管理存储在服务器中的 PL/SQL 程序的安全性。可以授权或撤销数据库其他用户访问

PL/SQL 程序的能力。PL/SQL 代码可以使用任何 ASCII 文本编辑器编写,所以对任何 Oracle

能够运行的操作系统都是非常便利的。对于 SQL,Oracle 必须在同一时间处理每一条 SQL

语句,在网络环境下这就意味作每一个独立的调用都必须被 Oracle 服务器处理,这就占用

大量的服务器时间,同时导致网络拥挤,而 PL/SQL 是以整个语句块发给服务器,这就降

低了网络开销。

从 Oracle8i 开始,Oracle 在数据库中支持 JAVA,从而为存储过程提供了不同于 PL/SQL

的开放式和可移植的方法。

两种语言都适用于数据库编程,都有自己的优点和弱点。在决定选择哪一种语言时,

可以参考下面根据经验得出的通用规则:

对于要求与 SQL 进行无缝集成的数据库中心来说可以使用 PL/SQL,从而完成对数据

库对象、类型和特性的访问。

出于与数据库无关性考虑时,可以选择 JAVA 作为开放式的语言来取代 PL/SQL,同

时也为了集成和沟通 SQL、XML、J2EE 和 Web 服务等各个领域。

与 PL/SQL 存储过程相比,JAVA 存储过程的优点主要有:

1. 数据库无关性,JAVA 存储过程是一种不同于 PL/SQL 的开放式,可移植的存储过

程。

2. JAVA 存储过程只被发送到数据库一次,相对于 SQL 语句或 PL/SQL 块而言,其网

http://www.paper.edu.cn

-3-

络通信量更小。

3. 存储过程充分利用了 Oracle 共享内存的能力。在将存储过程装载到内存中后,多个

用户可以同时调用该存储过程,从而降低了应用对 Oracle 的实际内存需求。

4. JAVA 存储过程可以集成和沟通 SQL,XML,J2EE 和 WEB 服务各个领域,对于基

于 J2EE 的 WEB 项目来说,是很适合的。

5. JAVA 语言具有更强大的运算能力,提供了更多的运算方法。当要完成进行复杂运

算的存储过程时,使用 JAVA 存储过程将是很好的选择。

6. JAVA 存储过程无需向 PL/SQL 那样使用控制结构,可以在纯 JAVA 语言中直接嵌入

SQL 语句,这对于 JAVA 开发人员来说更加简单实用。

6. 应用 JAVA 存储过程

6.1 编写 JAVA 存储过程

步骤如下:

1.导入需要的类:

import java.sql.*;

import Oracle.jdbc.driver.OracleDriver;

import Oracle.jdbc.driver.OracleConnection;

import java.sql.ResultSet;

2.参考游标(ref cursor)从 Oracle 7.3 开始引入,作用是允许在存储过程,函数,包中

返回记录集。Oracle9i 之前不支持 resultset 与 refcursor 之间的映射,现在 Oracle 10g 已经支

持该特性,但是必须首先设置这个开关为打开:

((OracleConnection)conn).setCreateStatementAsRefCursor(true);

3.通过调用 java.sql.DriverManager 类的 registerDriver 方法显式注册数据库驱动程序

DriverManager.registerDriver(new OracleDriver());

4.建立缺省连接

Connection conn = new OracleDriver().defaultConnection();

5.编写需要的 sql 语句

String sql = "SELECT……";

PreparedStatement pstmt = conn.prepareStatement(sql1);

pstmt.setString(1, object);

ResultSet rset = pstmt.executeQuery();

6.在存储过程中的返回值是一个 resultset,在数据库中相当于一个游标。

6.2 用 loadjava 命令将 JAVA 类加载到数据库中

Loadjava 是加载 JAVA 源文件、JAVA 类文件和 JAVA 资源文件的实用程序,它可以用

来验证字节码,并将 JAVA 类和 JAR 文件部署到数据库中。它既可以通过命令行调用,也

可以通过包含于 DBMS_JAVA 类中的 loadjava()方法调用。在开发过程中,每个存储过程必

须且仅需 load 一次,以后都可以直接调用该存储过程。

1.设置 ClassPath

在系统环境变量中设置如下:

ORACLE_HOME=” Oracle 安装路径”

classpath=%ORACLE_HOME%\ jdbc\lib\classes111.zip;

http://www.paper.edu.cn

-4-

%ORACLE_HOME%\ sqlj\lib\runtime.zip;

%ORACLE_HOME%\ sqlj\lib\translator.zip;

可以预先设置 ORACLE_HOME 使用相对路径,也可以直接在 classpath 中使用它们的

绝对路径。

2.在 Oracle 中装载 JAVA 代码

Loadjava -user user/password@:: -o -v -f -r e:\ ClassName.java

其中 e:\ ClassName.java 为该 JAVA 代码的存放路径。

6.3 在 Oracle 中发布和调用 JAVA 存储过程

在 Oracle 10g 中,loadjava 允许通过为包含在被处理的类中的方法创建相应的 Call

Specs 来自动将 JAVA 类发布为存储过程[5]。

1.创建一个 package,在 package 中声明一个游标变量:

create or replace package refcurpkg is

type refcur_t is ref cursor;

end refcurpkg;

2.发布 JAVA 类,将 resultset 映射为 refcursor

create or replace function name (column in varchar2) return refcurpkg.refcur_t is

language java name ‘ClassName. methodName() return java.sql.ResultSet’;

3.调用 JAVA 存储过程

call functionName() into: Object;

call completed.

7. 结论

本文介绍了 Oracle 和存储过程,通过 PL/SQL 存储过程和 JAVA 存储过程的对比分析,

发现 JAVA 存储过程的优点更多,于是采用 JAVA 存储过程。在 Oracle 10g 中应用 JAVA 存

储过程的步骤比较多,实现起来比较繁琐,以后可以随着 JAVA 和 Oracle 的不断发展,提

出更方便快捷的方法。

http://www.paper.edu.cn

-5-

参考文献

[1] Oracle 公司.Oracle White Paper[EB/OL].http://www.oracle.com, 2004.

[2] 王海亮,林立新.Oracle 10g PL/SQL 编程[M].北京:中国水利水电出版社,2004.

[3] 王卓,腾召胜.Oracle 存储过程应用实例[J].现代电子技术,2006,6.

[4] 全立新.使用 Java 编写 Oracle 存储过程[J].计算机时代,2004,6.

[5] 康会来.Oracle 数据库中的 JAVA 语言[J].电脑编程技巧与维护,2005,5.







Research on JAVA Storage Procedure Application Based on

Oracle 10g

Zhang Nan

Software College,Dalian University of Technology,Dalian,China (116023)

Abstract

The article introduces Oracle and storage procedure, based on JAVA and PL/SQL storage procedure

comparative analyse, discusses JAVA storage procedure application in Oracle 10g, particularly narrate

application method of JAVA storage procedure.

Keywords: Oracle; PL/SQL; JAVA storage procedure.


基于 Oracle 10g的 JAVA 存储过程应用研究

返回顶部