使用SQLJ编写存储过程
2007-11-11 04:42:26 来源:WEB开发网- ·一个SQL存储过程
·经验总结:ASP与存储过程解析
·sql server(WINDOWS平台上强大的数据库平台)编写存储过程小工具
·如何在SQL存储过程中处理错误
·使用C#创建sql server(WINDOWS平台上强大的数据库平台)的存储过程
·asp+存储过程的使用
·收藏几段SQL Server语句和存储过程
·sql server(WINDOWS平台上强大的数据库平台)2000中怎么对存储过程进行
·MySQL(和PHP搭配之最佳组合) 5.0新特性教程 存储过程
·ASP中使用存储过程
第二步: 翻译并编译SQLJ源文件
SQLJ翻译器通过检查不正确的SQLJ语法执行对SQLJ源文件的分析。然后调用一个可执行SQLJ语句的语义检验程序。如果在sqlj.exe命令中指定user = userName/password选项,语义检验程序将使用这个信息来连接数据库并检验存在的数据库表和用于SQLJ源文件的存储过程。随后SQLJ翻译器为SQLJ源文件中的每个连接类生成Java源文件和一个单独的配置文件。Java虚拟机调用编译程序( javac)把所有的.java文件编译为.class类文件。 最后,JVM调用Oracle(大型网站数据库平台) SQLJ定制程序把生成的配置文件转换为Oracle(大型网站数据库平台)特定的组件。
本文中不可能包含所有的SQLJ实用命令行选项,但是如果你需要更多信息,请参阅相应的Oracle(大型网站数据库平台)文档。
我发现把下面的信息放入名为Translator.properties的属性文件中会很方便:
sqlj.user=scott sqlj.password=tiger sqlj.driver=Oracle(大型网站数据库平台).jdbc.driver.Oracle(大型网站数据库平台)Driver sqlj.url=jdbc:Oracle(大型网站数据库平台):oci8:@ORCL sqlj.warn=verbose sqlj.linemap |
你可以在Oracle(大型网站数据库平台)Home/sqlj/demo目录中找到一个样本sqlj.properties文件。下面给出了用来翻译和编译SQLJ源文件的命令:
sqlj -props=translator.properties -explain -ser2class -status PipelineReset.sqlj |
推荐在SQLJ命令行中包括- explain和- status选项,这样就能显示并很容易了解翻译和编译步骤。 使用- ser2class标志把生成的配置文件(.ser文件)转换成.class文件。
在本例中,用六个类文件结束:主要的PipelineReset.class,三个迭代程序类( StartEndDate.class,ValidTransactions.class和ClassificationCount.class)以及配置类( PipelineReset_SJProfile.class和PipelineReset_SJProfileKeys.class)。使用下列命令把它们封装到一个PipelineReset.jar Java压缩文件中:
jar cvf0 PipelineReset.jar *.class |
现在需要把生成的类载入数据库中。
第三步:把Java文件装载入数据库服务器
Oracle(大型网站数据库平台)提供了一个默认的使用Oracle(大型网站数据库平台) JDBC OCI8驱动程序的loadjava实用程序来完成连接。下面就是用一个ORCL数据库和一个用户scott/tiger做为参数来使用这个实用程序的语法:
loadjava -user scott/tiger@ORCL -resolve PipelineReset.jar |
还可以指定Oracle(大型网站数据库平台) JDBC瘦驱动程序:
loadjava -thin -user scott/tiger@server:1521:ORCL -resolve PipelineReset.jar |
使用- resolve标志直接地分析类的引用而不是等待每个类被第一次调用。
在User_Objects Oracle(大型网站数据库平台)词典中运行查询,使loadjava把所有的类都成功加载。
select object_name, status from User_Objects where object_type = 'JAVA CLASS' order by object_name; |
下面是上面查询的输出结果:
OBJECT_NAME STATUS ------------------------------ ------- ClassificationCount VALID PipelineReset VALID PipelineReset_SJProfile0 VALID PipelineReset_SJProfileKeys VALID StartEndDate VALID ValidTransactions VALID 6 rows selected. |
正如所见,你所有的Java类都被成功地载入数据库中了。
第四步:为Java存储过程创建PL/SQL封装程序
即使Java代码已经在数据库中了,但是它还是不能真正的可用。 Oracle(大型网站数据库平台)数据库不能直接调用Java类方法。 它通过PL/SQL间接调用它们并把它们传到JServer Java虚拟机中来运行。这就是为什么需要为PipelineReset类的DeleteClassification静态方法创建一个PL/SQL封装程序(也就是在数据库服务器中发布Java方法)。
下面的脚本将创建PipelineResetFull程序包的一个JDeleteClassification过程。 这个过程是PipelineReset Java类的DeleteClassification静态方法的PL/SQL封装程序。
create or replace package PipelineResetFull as procedure JDeleteClassification (periodName in varchar2, commitBatchSize in number, percentDeleted in number); end PipelineResetFull; / create or replace package body PipelineResetFull as procedure JDeleteClassification (periodName in varchar2, commitBatchSize in number, percentDeleted in number) as language java name 'PipelineReset.DeleteClassification(java.lang.String, int, int)'; end PipelineResetFull; / |
例如:下列的语法是错误的:
... name 'PipelineReset.DeleteClassification(String, int, int)'; ... |
它能够编译,但是将抛出运行时间异常:
ERROR at line 1: ORA-29531: no method DeleteClassification in class PipelineReset |
这是怎么发生的呢?DeleteClassification不就在PipelineReset类中吗? 事实上,它是这个类中的唯一的方法!
Oracle(大型网站数据库平台)不能匹配PL/SQL封装程序中的DeleteClassification方法与一个实际类的方法。 在这种情况下,你必须明确地指定一个完全符合规格的类的路径,除非它是一个基类,就像在我们例子中的int Java类型。
第五步:测试Java存储过程
在数据库中发布Java代码之后,我们就会发现在PL/SQL和Java过程之间就没有用法差异了。可以使用下列代码从SQL * Plus中调用并测试PL/SQL和Java代码:
begin DeleteClassification('January 1999', 10000, 10); End; / begin PipelineResetFull.JDeleteClassification('January 1999', 10000, 10); end; / |
现在我们甚至不能分辩出哪个是Java过程,因为它已经完全和PL/SQL环境整合起来了。
更多精彩
赞助商链接