使用SQLJ编写存储过程

来源:互联网 发布:发牌程序java 编辑:程序博客网 时间:2024/06/06 01:42
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
 在《用SQLJ开发》一文中,我描述了SQLJ是什么;比较它和PL/SQL以及JDBC之间的差别;最后又讨论了SQLJ元素。在本文中,我将一步一步的介绍如何使用DeleteClassification存储过程。

  1.编写一个SQLJ存储过程

  2.把它装载进一个数据库

  3.在数据库中发布方法

  4.运行过程

  5.和PL/SQL相对应的过程比较结果

  

  DeleteClassification过程主要使用两个表工作,ValidTransaction(父表)和Classification(子表),是一种使用TransactionId外键的一到多的关系。存储过程的目的就是删除所有指定的时期/月份的ValidTransaction的Classification纪录。ValidTransaction表中的TransactionDate字段选择这个日期范围之内的记录。

  在例子中,ValidTransaction包含12个时期的数据,共有一百二十万行。在ValidTransaction表中的每一行,Classification表分别有10行与之对应,所以就共有一千二百万行数据。清除一个指定月份的Classification数据意味着从Classification表中删除1百万行数据。

  DeleteClassification过程的代码使用了一些Oracle8iPL/SQL中的新的特性,象BULKBINDS和BULKCOLLECT,用来改善事务的执行性能并增加你在事务中可交付的数据数量,从而减少事务的数目并且降低发生ORA-01555错误的可能性。BULKCOLLECT子句能使整个TransactToReset游标一步就被取出到v_TransactionIdPL/SQL表中。然后游标立即被关闭以避免交叉获取错误,这样也同样减少ORA-01555错误的发生。

  最后,这个过程计算删除行数的百分比。如果结果超过了限度,主关键字索引可能就会被损坏而且你还可能要重建它。

  代码段1 演示了DeleteClassification存储过程的PL/SQL版本。

  创建SQLJ存储过程将要编写服务器端SQLJ代码,另外将在一台客户机上执行编译过程。这个途径提供翻译SQLJ代码的最大灵活性--选项设置和错误处理在客户机上比在服务器上更方便。

  开发一个SQLJ存储过程由五个步骤组成:

  1.使用Java类的静态方法创建一个SQLJ源文件,后面将要把这个源文件通过SQL封装器与PL/SQL环境合并起来。

  2.把这个SQLJ源文件编译成一个Java类或者一组Java类。把所有的类合并成一个.jar文件。

  3.使用loadjava实用程序把这个.jar文件装载入Oracle数据库服务器。确定装载过程是成功的,为每个Java类都创建一个JavaClass类型的模式对象。

  4.为存储的Java过程/函数创建一个PL/SQL封装器。

  5.通过从SQL*Plus或者PL/SQL上调用存储的Java过程来测试这些过程。
  第一步:创建SQLJ源文件

  使用import语句启动PipelineReset.SQLJ文件。只导入你计划在你的类中使用的Java类和程序包。

importjava.sql.SQLException;
importjava.sql.Timestamp;
importjava.util.ArrayList;
importjava.util.Iterator;

  SQLJ运行时刻程序包可在JServerJava虚拟机(JVM)中找到。还有,你不必编写创建到数据库的连接的代码了,因为JServer本身带有到数据库服务器的隐含的连接。由于你将在客户机上编译源代码,所以必须包括下列三个import语句:

importoracle.jdbc.driver.OracleConnection;
importSQLJ.runtime.ref.DefaultContext;
importSQLJ.runtime.ExecutionContext;

  接下来,需要声明迭代程序类。在迭代程序类声明中定义了SQLJ为你构造的Java类。你必须把SQLJ迭代程序声明和连接上下文说明放在你的SQLJ源文件里的Java类的顶端,紧接着import语句之后。下列三个迭代程序声明提供PL/SQL版的三个游标函数:

#sqliteratorStartEndDate
(TimestampstartDate,TimestampendDate);

#sqliteratorValidTransactions
(LongtransactionId);

#sqliteratorClassificationCount
(long);

  使用下面三个参数定义PipelineReset.java类的静态DeleteClassification方法:

publicclassPipelineReset{

publicstaticvoidDeleteClassification(
StringperiodName,
intcommitBatchSize,
intpercentageDeleted)throwsSQLException{

...

}
}1

<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击