|
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语句包括:
SQLJ 不支持动态SQL。但是,一个SQLJ程序可能会利用JDBC调用,从而实现动态SQL。SQL子句和JDBC调用,在数据库连接、结果集、结果迭代一级上相互作用。这样,Java和PL/SQL都提供了在程序里组合静态和动态SQL的途径。 数据类型支持 —— Java和PL/SQL对Oracle的SQL类型系统,都提供了广泛的支持,其中包括对下面这些类型的支持:
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内置包和对应的Java等价物的对应关系。因为PL/SQL和Java 在服务器里很容易互操作,所以很容易就能从Java程序里发出调用,执行内置 PL/SQL包或者用Java封装器封装一个PL/SQL类,使得可以从分布式CORBA和企业JavaBean客户调用它。而且,对于PL/SQL和Java,Oracle保证可以从它们访问数据库服务器的特性。
|