使用SQLJ编写存储过程
2007-11-11 04:42:26 来源:WEB开发网核心提示: ·一个SQL存储过程·经验总结:ASP与存储过程解析·sql server(WINDOWS平台上强大的数据库平台)编写存储过程小工具·如何在SQL存储过程中处理错误·使用C#创建sql server(WINDOWS平台上强大的数据库平台)的存储过程
- ·一个SQL存储过程
·经验总结:ASP与存储过程解析
·sql server(WINDOWS平台上强大的数据库平台)编写存储过程小工具
·如何在SQL存储过程中处理错误
·使用C#创建sql server(WINDOWS平台上强大的数据库平台)的存储过程
·asp+存储过程的使用
·收藏几段SQL Server语句和存储过程
·sql server(WINDOWS平台上强大的数据库平台)2000中怎么对存储过程进行
·MySQL(和PHP搭配之最佳组合) 5.0新特性教程 存储过程
·ASP中使用存储过程
第一步: 创建SQLJ源文件
使用import语句启动PipelineReset.sqlj文件。 只导入你计划在你的类中使用的Java类和程序包。
import java.sql.SQLException; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Iterator; |
SQLJ运行时刻程序包可在JServer Java虚拟机( JVM)中找到。 还有,你不必编写创建到数据库的连接的代码了,因为JServer本身带有到数据库服务器的隐含的连接。由于你将在客户机上编译源代码,所以必须包括下列三个import语句:
import Oracle(大型网站数据库平台).jdbc.driver.Oracle(大型网站数据库平台)Connection; import sqlj.runtime.ref.DefaultContext; import sqlj.runtime.ExecutionContext; |
接下来,需要声明迭代程序类。在迭代程序类声明中定义了SQLJ为你构造的Java类。你必须把SQLJ迭代程序声明和连接上下文说明放在你的SQLJ源文件里的Java类的顶端,紧接着import语句之后。 下列三个迭代程序声明提供PL/SQL版的三个游标函数:
#sql iterator StartEndDate (Timestamp startDate, Timestamp endDate); #sql iterator ValidTransactions (Long transactionId); #sql iterator ClassificationCount (long); |
使用下面三个参数定义PipelineReset.java类的静态DeleteClassification方法:
public class PipelineReset { public static void DeleteClassification( String periodName, int commitBatchSize, int percentageDeleted) throws SQLException { ... } } |
现在我们把代码放入方法中。 首先你需要实例化一个迭代程序对象决定具体时期的起始和结束时间。 使用periodname参数:
StartEndDate dateIter; Timestamp endDate = null; Timestamp startDate = null; #sql dateIter = { select startDate, endDate from Period where description = :periodName }; if (dateIter.next()) { startDate = dateIter.startDate(); endDate = dateIter.endDate(); }; dateIter.close(); |
StartEndDate dateIter;下一步是实例化ValidTransactions类型的迭代程序对象并把你的具体时期内全部的TransactionId都放入ArrayList类型的vtIdList对象中。 在PL/SQL版本中,这个工作是由游标csrTransactToReset完成的。
ValidTransactions vtIter; #sql vtIter = { select T.TransactionId from ValidTransaction T where T.TransactionDate >= :startDate and T.TransactionDate <= :endDate and exists (select '1' from Classification C where C.TransactionId = T.TransactionId) }; ArrayList vtIdList = new ArrayList(); while (vtIter.next()) { vtIdList.add((Long) vtIter.TransactionId()); } vtIter.close(); |
现在在vtIDList对象中循环,删除Classification中TransactionId每个值所对应的行。
ExecutionContext ec = DefaultContext.getDefaultContext().getExecutionContext(); ClassificationCount countIter; long vDeletedRows = 0; long vTotalRows = 0; int vCount = 0; if (vtIdList.size() > 0) { #sql countIter = { select count(*) from Classification }; #sql { fetch : countIter into :vTotalRows }; countIter.close(); Iterator itr = vtIdList.iterator(); while (itr.hasNext()) { vCount++; #sql [ec] { delete from Classification where TransactionId = :((Long) itr.next()) }; vDeletedRows = vDeletedRows + ec.getUpdateCount(); if ((vCount % commitBatchSize) == 0) { #sql [ec] { commit }; } } #sql [ec] { commit }; } |
最后,你必须决定你是否要重建索引。 从你的SQLJ代码中调用相同的RebuildIndex PL/SQL存储过程:
if ((((float) vDeletedRows / (float) vTotalRows) * 100) >= percentageDeleted ) { #sql [ec] {call RebuildIndex('CLASSIFICATION_PK_IND', 'parallel nologging compute statistics')}; } |
代码清单2 显示了PipelineReset.sqlj文件的完整的清单。
更多精彩
赞助商链接