WEB开发网      濠电娀娼ч崐濠氬疾椤愶附鍋熸い鏍ㄧ〒闂勫嫰鏌﹀Ο渚Ц闁诲氦顕ч湁婵犲﹤楠告禍鍓х磼鏉堛劌绗氶柟宄版嚇閹晠宕归銈嗘濠电偞鍨堕幐鎾磻閹捐秮褰掓偐閻戞﹩妫勯梺鎼炲妼鐎涒晝绮嬪澶樻晝闁挎繂鏌婇敃鍌涚厵閻庢稒锚閻忥絾绻濇繝鍐ㄧ伌闁诡垰鍟村畷鐔碱敂閸♀晙绱樺┑鐐差嚟婵儳螞閸曨剚鍙忛柍鍝勬噹缁€澶嬬箾閹存繄锛嶆鐐灲閹綊宕惰濡插鏌涢妸銉ヮ劉缂佸倸绉归弫鎾绘晸閿燂拷 ---闂備焦瀵уú鈺呭箯閿燂拷
开发学院数据库MSSQL Server 使用SQLJ编写存储过程 阅读

使用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文件的完整的清单。

上一页  1 2 3 4  下一页

Tags:使用 SQLJ 编写

编辑录入:coldstar [复制链接] [打 印]
赞助商链接