您的位置:寻梦网首页编程乐园Java天地JDBC用PL/SQL和Java开发Oracle8i 应用程序
Java 天地
用PL/SQL和Java开发Oracle8i 应用程序(3)

作者:翻译:张猛  来源:Java开发者

PL/SQL和JAVA的公共特性

现在,我们理解了PL/SQL和 Java 存储过程在Oracle8i 里互操作的方式,下面让我们进一步探讨Oracle8i 为这两种语言提供的公共特性。PL/SQL和Java被设计成共享大量公共特性:公共的库管理和依赖性维护模型,公共的安全和权限模型,公共的纯态(purity)模型,处理大量SQL相关操作的公共机制,以及其它大量公共特性。这些共性,意味着用这两种语言进行程序开发,给开发人员提供了公共的存储过程开发编程模型。

下面,我们详细介绍这些特性。

库管理特性

在Oracle8i服务器里,PL/SQL和Java对象 (源代码、类或 jar 文件)都作为数据库的库单元保存和检索。库单元是Oracle中包、过程、表、视图的基本存储单元。

库单元管理——两种语言都提供了库管理工具,可以管理所有这些库单元,也能响应来自适当执行引掣的请求,在运行时装入过程和类。

自动维护依赖性——任意一个用PL/SQL或Java编写的源程序,都支持因为源代码修改,而导致的依赖库自动重编译。它们管理着单元间的依赖信息,以便在更新的时候,提供重新建立依赖单元的自动操作手段。在导入和配置之后,它们会自动把Java和 PL/SQL程序维护成最新。

对于Oracle8i里的PL/SQL和Java,数据库服务器也会自动维护PL/SQL和Java之间的一些依赖性。如果修改了发布到SQL里的某个Java 类,相关的Java调用规范也做了修改,反映出新的类,那么所有依赖这个调用规范的PL/SQL包,都会自动重新编译,确保处于最新状态。

现在,如果修改了某个PL/SQL存储过程,那么通过JDBC或SQLJ调用这个PL/SQL存储过程的Java 类,并不会自动由系统维护成最新状态。但是日后,随着服务器内SQLJ的增强,我们将提供利用SQLJ类型检测特性的工具,确保通过SQLJ访问PL/SQL的Java类会自动重编译。 (请注意:因为JDBC是一个动态接口,所以JDBC 程序在运行之前,不能检测到这种修改。)

安全模型

数据库有一个供PL/SQL和Java共同使用的公共安全模型,涉及三个方面的安全:加密、认证、访问控制。

网络加密在通过Net8 ™ 、IIOP (或8.1.6支持的HTTP)与Oracle8i 里的PL/SQL程序或 Java 程序通信的时候,客户和服务器之间的通信,可以用标准的SSL x.509v3 证书进行加密。

认证—有两种认证用户的方法:一种是使用标准的数据库用户名和口令,另一种是使用SSL 证书本身。

访问控制—用户得到服务器的认证之后,就需要拥有执行指定存储过程的权限。PL/SQL存储过程和 Java 存储过程都支持二种权限模型:定义者权限-意味着存储过程执行时,使用的特权,是定义该过程的用户所具有的特权;调用者权限-意味着存储过程执行时,使用的特权,是调用该过程的用户所具有的特权。使用调用者权限的程序,将继承调用该程序的用户的特权和名称解析模板(上下文)。如果安装那些通用的、在执行时代表调用用户进行操作的通用软件组件时,调用者权限则非常有用。因为调用者权限组件会自动继承调用者的上下文环境,所以可以仅安装组件的单一拷贝,就供给多个用户调用。

纯态模型

在Oracle8i之前,如果用户想在SQL语句里调用函数,必须指定它的纯态级(例如:函数是否读/写数据库或包的状态)。具体操作是通过RESTRICT_REFERENCES 限制完成的。编译器使用这个纯态信息,把它和额外计算出的信息组合在一起,最后判断执行这些操作是否安全。这个限制通常是非常严格的,而且禁止了编译时允许进行的一些操作。Oracle8i 简化了纯态模型。在Oracle8i 里,在编译时不再必须支持这个限制。取而代之的是,在运行时把非法操作标记出来。这种简单的技术比限制技术更灵活,也更容易使用,而且它对PL/SQL和Java的支持是一致的。

访问SQL

因为运行在服务器里的存储程序通常是数据密集型的程序,所以Oracle8i里的Java 和 PL/SQL都为支持SQL访问提供了优秀的特性。

静态SQL支持——PL/SQL和SQLJ提供了直接把静态SQL语句嵌入到PL/SQL程序和Java程序里的语法。在编译的时候,PL/SQL和SQLJ都会检测下列内容的正确性:SQL语法,宿主变量与调用它们的SQL语句的类型兼容性(仅指SQLJ,因为PL/SQL拥有与SQL相同的数据类型),根据数据库大纲里表、视图、存储过程等的定义,确定查询本身的正确性。在编译期间检查SQL语句,让程序开发人员可以在编译的时候,而不是在运行时,就检测到语法错误和语义错误(例如:类型不匹配错误)。

动态SQL支持——动态SQL支持,提供了对动态SQL程序的支持。动态SQL程序是指这样的一些PL/SQL和Java程序:只有在程序执行的时候,才能确定程序中SQL语句的完整内容。在Oracle8i之前,PL/SQL里的动态SQL语句,只能使用DBMS_SQL包接口才能执行。在Oracle8i里,PL/SQL现在能够支持本机的动态SQL,这同使用DBMS_SQL相比,更简单、更紧凑,也更迅速。动态SQL语句包括:

  • SQL语句
  • PL/SQL匿名块
  • 数据定义语言 (DDL) 语句
  • 事务控制语句
  • 会话控制语句 (有限制)

SQLJ 不支持动态SQL。但是,一个SQLJ程序可能会利用JDBC调用,从而实现动态SQL。SQL子句和JDBC调用,在数据库连接、结果集、结果迭代一级上相互作用。这样,Java和PL/SQL都提供了在程序里组合静态和动态SQL的途径。

数据类型支持 —— Java和PL/SQL对Oracle的SQL类型系统,都提供了广泛的支持,其中包括对下面这些类型的支持:

  • 所有 Oracle 7 ™SQL数据类型—— NUMBER、DECIMAL、INTEGER、FLOAT、REAL、DOUBLE PRECISION、DATE、STRING、CHAR、VARCHAR、RAW、LONG RAW
  • Oracle8 数据类型——对象类型(ADT)、集合(VARRAY和嵌套表)、以及LOB (BLOB、CLOB、B文件、NCLOB)

PL/SQL提供对这些数据类型的本机支持,因PL/SQL和SQL共享相同的类型系统。Java 提供了oracle.sql.* 这个Java包,里面提供了与每个原始SQL类型对应的Java类,还提供了在SQL类型和Java类型之间转换的功能。

其它公共特性

最后,PL/SQL和Java在服务器里还有许多其它公共特性。

外部过程

外部过程提供了一个从SQL、PL/SQL或Java程序里调用外部C/C++程序的机制。外部程序在服务器之外单独的进程空间里运行。外部过程提供了一个简单、易用和安全的方法,把外部系统和3GL应用程序的代码的接口提供给数据库服务器,同时保持了整改事务性的语义。外部过程让应用程序开发人员可以编写C/ C++ 程序,把它们登记成数据库服务器的动态链接库,然后就象调用正常的存储过程一样调用它们。外部过程或外部子程序,可以使用Oracle ® 调用接口或Pro*C ™,反过来在同一个事务里,对数据库进行调用。对于Oracle8i 里的外部过程,有两个新的增强:它们的速度明显提高,可以通过Pro*C调用SQL(从8.0开始,就已经能够用Oracle调用接口访问外部过程)。

内置包和库

最后,要想用PL/SQL和Java,充分利用数据库里的这么多特性,建立强大的面向服务器的程序,Oracle8i 提供了大量的内置库。

PL/ S QL 内置包—— PL/SQL特别提供了大量库,可以分成三大类:

  • 应用程序开发包—— 由可以用来开发应用程序的PL/SQL包组成,包括:
     (1.) DBMS_PIPE :DBMS管道,用来在会话和DBMS_ALERT之间通信,向用户广播报警;
     (2.) DBMS_LOCK和DBMS_TRANSACTION:DBMS锁定和DBMS事务,用于锁和事务管理;
     (3.) DBMS_AQ、DBMS_LOB、DBMS_ROWID、UTL_RAW、UTL _REF:分别操作Oracle的高级队列管理、LOB、ROWID、RAW和RE F特性。
  • 服务器管理包—— 由数据库和系统管理员用来监视系统操作的PL/SQL包组成,包括
    (1.) DBMS_SESSION和DBMS_SYSTEM:DBMS会话和DBMS系统,管理会话信息和设置调试用事件;
    (2.) DBMS_SPACE 和DBMS_SHARED_POOL:DBMS空间和DBMS共享池,取得空间信息,在服务器里保留共享池资源。
    (3.) DBMS_JOB:DBMS任务,用来调度服务器里的任务。
  • PL/SQL还为分布式数据库访问提供了大量的包,提供了对快照、高级复制、冲突解决、延迟事务和RPC等特性的访问。
  • Java 内置库—— 同样,Oracle8i 提供了大量的Java 库,包括:
  • 核心JDK —— Oracle8i 支持除了GUI/AWT这部分库以外的所有标准 JDK 库,因为GUI/AWT在RDBMS里没有运行的意义。它支持的有些标准库支持包括:java.lang、java.io、 java.util、java.net [tcp/ ip 套接字支持]、java.math[任意精度的算术]、java.lang.reflect [类型内检]、java.text [文本处理/格式化]、以及java.util.zip [.jar 文件支持]。
  • 内置 Java —— 除了标准库之外,Oracle8i 还提供了其它大量Java 库,例如:基于Java的CORBA ORB,企业JavaBean特性,基于Java的XML解析器(在8.1.5里可用,在8.1.6中打包提供),以及Java Web 服务器(8.1.6提供)。
  • 而且,由于Oracle8i 是一个完全符合标准的Java 虚拟机,所以它可以运行大量开发商和应用程序开发工具在市场上提供的各种各样的Java 应用程序和库。

下表显示了一些最重要的PL/SQL内置包和对应的Java等价物的对应关系。因为PL/SQL和Java 在服务器里很容易互操作,所以很容易就能从Java程序里发出调用,执行内置 PL/SQL包或者用Java封装器封装一个PL/SQL类,使得可以从分布式CORBA和企业JavaBean客户调用它。而且,对于PL/SQL和Java,Oracle保证可以从它们访问数据库服务器的特性。

PL/SQL包

Java等价物

DBMS_ALERT

没有纯粹的Java等价物。只能通过SQLJ或JDBC调用这个包。

DBMS_DDL

JDBC 拥有这个功能。

DBMS_JOB

没有纯粹的Java等价物。但是可以安排一个调用Java存储过程的任务(JOB)。

DBMS_LOCK

没有纯粹的Java等价物。只能通过SQL或JDBC调用这个包。

DBMS_MAIL

可以在Oracle8i里运行JavaMail 1.1.1。JavaMail 提供了通过标准Internet协议发送、接收邮件的完整API。

DBMS_OUTPUT

Java 有一个OutputStream 子类:oracle.aurora.rdbms.OracleDBMSOutputStream。这个子类在DBMS_OUTPUT顶部提供了标准的Java OutputStream API。还有一个存储过程DBMS_JAVA.SET_STREAMS,它把System.out重定向到DBMS_OUTPUT。

DBMS_PIPE

通过SQLJ或JDBC调用这个包。有关的纯Java功能是:通过CORBA在会话间通信的能力 (请参阅 javavm/examples/corba/session/clientserverserver),但是并不完全是一回事。

DBMS_SESSION

可以使用JDBC执行对应的ALTER SESSION 语句。

DBMS_SNAPSHOT

通过SQLJ或JDBC调用这个包。

DBMS_SQL

使用JDBC。

DBMS_TRANSACTION

使用JDBC 执行 ALTER SESSION。

DBMS_UTILITY

通过SQLJ或JDBC调用这个包。

UTL_FILE

授权 JAVAUSERPRIV,并使用常规的Java IO 入口点(类文件件,文件输出流-FileOutputStream和文件输入流-FileInputStream)。

上一页 下一页