资产审核系统中的动态SQL研究

作者:    更新时间:2008-8-6 10:56:38
朱力强
(西华师范大学  计算机学院,四川  南充  637002)
 
    摘 要  SQL是关系型数据库的主流语言,它包括数据定义语言DDL、数据操纵语言DML、数据控制语言DCL,通过在资产审核系统中的动态SQL实现,对比分析了各种动态SQL格式的特点和作用,这对优化代码环境下的高速、灵活的数据检索和操纵具有十分重要的意义。
    关键词  资产审核;动态SQL;Powerscript
 

 

    根据用户的需要,开发人员在MIS中嵌入SQL语句非常方便,可以完成大部分对数据库的操作。但有时需要使用数据库提供的一些命令,例如在数据库中用Creat Table创建临时表等DDL命令[1],这些命令就不能直接写到嵌入的SQL语句中;还有一些特殊的情况如开发时无法确定SQL语句输入输出参数,而要在执行过程中动态确定,这时就需要采用动态SQL语句来实现MIS中的复杂任务。

1  资产审核系统概述与总体结构

    顺庆区政府用资产审核系统是以《企业国有资产监督管理暂行条例》等法律、法规为基础,以加强对企业的国有资产监督管理,规范企业清产核资工作,真实反映企业的资产及财务状况,完善企业基础管理为基本原则[2],并通过Powerbuilder9.0和ASA8.0设计和实现的分布式审核和决策系统,它能为科学评价和规范考核企业经营绩效及国有资产保值增值提供决策依据。其登录界面如图1所示。
 
图1 资产审核系统登录界面
    审核系统的基本功能包括“基本信息管理”、“输入审核明细”、“输出明细打印”、“输出审核汇总”、“系统设置”和“帮助”,工作人员可以实现对“房产与地产债务形成”、“房屋建筑类固定资产”、“对外投资”、“国有地产”、“经营性资产”(如图2所示)、“固定资产债权”、“未办产权情况”和“资产经营状况”的录入、审核、明细打印、汇总输出和决策支持。

2  资产审核系统中的动态SQL研究

2.1 动态SQL格式一

    使用这种格式执行的SQL语句不产生结果集,并且不需要输入参数。资产审核系统中的审核数据每年都以极快的速度在增长,当工作人员需要对关注的焦点数据进行快速检索的时候,就需要将数据按一定的要求进行分类,在检索数据时,仅提取包含焦点数据的子类数据就可以了,为此我们需要动态地去创建一个临时表来存放子类数据[5]。以创建“经营性资产审核”临时表为例,Powerscript如下:
string ls_mysql
ls_mysql = "create table abusiness_for_ assets_ condition_ temp " &
            + "(unit char(40) not null,unit_property char(20) not null," &
+ "unit_address char(40) not null,unit_employee integer," &
+ "unit_salary numeric(19,4),unit_income numeric(19,4)," &
+ "unit_output numeric(19,4),unit_left numeric(19,4)," &
+ "small_total_assets numeric(19,4),should_be_have numeric(19,4)," &
+ "memo varchar(100))"
execute immediate:ls_mysql;  //立即执行动态SQL语句:ls_mysql
    采用这种格式的动态SQL语句可以执行所有的数据定义语言。在审核系统中,我们利用它来运行一些类似的辅助性操作。

 
图2 经营性资产的审核功能

 

2.2 动态SQL格式二

    使用这种格式执行的SQL语句会产生结果集,也需要输入参数,并且输入和输出的列项都是可知的[7]。在“经营性资产”的审核过程中,我们采用此类SQL语句为各单位的审核明细数据汇总,实现的Powerscript如下:
integer i,j,k,l
string ls_mysql
string check_it
DELETE FROM "business_for_assets_condition_total"; //清空审核表中的汇总数据
declare get_total_detail dynamic cursor for sqlsa; //定义动态游标
ls_mysql= "select unit_property,unit_address,unit_employee,unit_salary," &
"unit_income,unit_output,unit_left,small_total_assets,should_be_have " &
"from business_for_assets_condition where unit = ? "
prepare sqlsa from:ls_mysql;
i = get_unit(8)         //利用get_unit函数获取“经营性资产审核记录”中的实际单位数量
for j = 1 to I          //对每个单位汇总字段进行累计汇总
    SELECT count("business_for_assets_condition"."unit") INTO:k 
    FROM "business_for_assets_condition" goup by "business_for_assets_condition"."unit"
having "business_for_assets_condition"."unit" =:unit[j,2];
//以上的语句得到同一单位的实际审核记录数,为循环操作提供次数
check_it = unit[j,2]
open dynamic get_total_detail using:check_it;//打开动态游标
汇总字段变量初始化   //伪操作
for l = 1 to k
fetch get_total_detail into:临时字段变量;  //伪操作
累加汇总字段变量      //通过临时字段变量来累加汇总字段变量
next
close get_total_detail;       //关闭动态游标
插入一条新的汇总记录       //伪操作
next
    在以上代码中,我们使用到了DynamicStagingArea类,它的作用是把Powerbuilder执行语句和数据库事务对象联系起来,由它得到的默认的实例SQLSA属于系统全局变量,另外,开发人员也可以根据自己的需要定义Dynamic StagingArea类型的转接域变量。使用此类动态SQL语句具有如下的特点[3]
    1) SELECT语句的数据检索方式非常灵活
    软件开发人员可以根据应用的多种需要将Where、Order By、Group By和Having等子句和通配符等存储于局部的字符串变量中,然后在审核系统的运行过程中,通过和用户的交互来判定和动态地合成这些子句。
    2) 系统占用资源低
    当用户需要定义多个静态游标变量时,需要分别为其定义多个游标变量名,开发人员在引用的时候会出现游标变量繁杂、游标不易管理和占用内存资源等缺点。而当开发人员采用此格式的动态游标时,就可以通过choose case….end choose,并结合多个不同类型的SELECT语句字符串变量和OPEN语句中using子句就可实现不同功能的游标共用一个动态游标变量名。
    3) SELECT语句列数目
    SELECT语句中列的数目必须固定。

2.3 动态SQL格式三

    这是一种全动态的SQL语句,在编写代码时并不知道SELECT语句的输入参数的个数,或者不知道结果集中列的项数、类型,它们都是变化的。我们可以通过以下的枚举常量来判别输入输出参数的类型:TypeBoolean!、TypeDate!、TypeDateTime!、TypeDecimal!、TypeDouble!、TypeInteger!、TypeLong!  TypeReal!、TypeString!、TypeTime!、TypeUint!、TypeUlong!、TypeUnknown!;我们也可以用下面的函数分别获取不同类型的输出参数值:GetDynamicDate()、GetDynamicDateTime()、GetDynamicNumber()、  GetDynamic String()、GetDynamicTime()[6]
    在资产审核系统中,工作人员需要以直观的方式浏览整个数据库的业务数据,我们结合ASA数据库中的扩展属性系统表pbcattbl和pbcatcol,并根据用户对DDLB控件的下拉点击,动态显示出他们感兴趣的不同类型的数据。以下是“列表字段”对应的DDLB控件的SelectChanged事件代码:
string ls_col
string ls_mysql
string ls_field
string ls_value
ls_col = this.text         //将确定的字段名称赋给字符串变量ls_col
if ls_col = '' then return    //如果没有选择为查看数据的具体字段,则事件返回,不做任何操作
ddlb_value.reset()        //由于用户重新指定了字段,故对应字段的具体取值需要清空
select pbc_cnam into:ls_field from pbcatcol
  where pbc_tnam =:is_tablename and pbc_hdr =:ls_col;
  /*通过系统表pbcatcol,将“审核数据表”表名为:is_tablename并且表中字段的标签为:ls_col的字段名插入字符串变量ls_field中。*/
ls_mysql = "select distinct " + ls_field + " from " + is_tablename        //构建检索字段值的SQL语句
prepare sqlsa from:ls_mysql;                                  
//准备动态转接域
describe sqlsa into sqlda;                                      
//描述转接域与描述域 
declare get_value dynamic cursor for sqlsa;                      
//定义动态游标get_value
open dynamic get_value using descriptor sqlda;              
//使用描述器SQLDA来打开动态游标
fetch get_value using descriptor sqlda;
do while sqlca.sqlcode = 0
choose case sqlda.outparmtype[1]             
//利用描述域的输出参数类型来判别指定字段的类型
case typestring!                   
//下拉选中的表的字段类型为字符串类型
                ls_value = getdynamicstring(sqlda,1)
case typedate!                        
//下拉选中的表的字段类型为日期型
                ls_value = string(getdynamicdate(sqlda,1),"yyyy/mm/dd")
case else                        
//下拉选中的表的字段类型为其它类型
                ls_value = string(getdynamicnumber (sqlda,1))
end choose
ddlb_value.additem(ls_value)       
//在“字段取值”中添加由sqlda获取的字段取值
fetch get_value using descriptor sqlda;     
//获取下一字段取值
loop
close get_value;                          
//关闭游标get_value
    以上代码对应的前台图形用户界面如图3所示,在实际的项目开发中,我们利用此类格式,并结合ASA提供的扩展属性数据字典,即PBCatTbl(数据库中的表)、PBCatCol(数据库中的列)、PBCatFmt(显示格式)、PBCatVld(有效性规则)、PBCatEdt(编辑风格),进行灵活多样的数据检索。
 
图3 数据浏览界面

3 结论与展望

    实践证明,顺庆区资产审核系统运行稳定,能实时、并发处理系统用户的各种要求,基于动态SQL的数据检索具有高效和开放式特征,用户使用也显得方便和直观;同时也提高了软件项目的代码效率和代码重用率,保护了开发人员已做的成果。这对减少项目开发过程中的返工次数、实现代码优化、增强代码可读性和实施可度量的软件质量保证[4]都具有十分重要的意义。

参考文献

[1] 罗超理,李万红.管理信息系统原理与应用[M].北京,清华大学出版社,2002
[2] 国有企业清产核资办法[EB/OL]. http://www.swjdcy. cn/qqlw_view.asp?newsid=818,2007
[3] 柯建勋,张涛.PowerBuilder9.0进阶开发篇[M].北京:清华大学出版社,2003
[4] 杨明,马帅.软件测试与软件质量保证[M].北京:珠海市豪迈实业有限公司,2003
[5] 李春艳,郭阳.PB下动态SQL语句的应用[J].唐山师范学院学报,2007,29(2)
[6] 王柠,李晓明.在Powerbuilder中使用动态SQL语句访问数据库[J].齐齐哈尔大学学报,2006,22(1)
[7] 苏子林,韩晓玲.Powerbuilder中采用动态SQL实现公式处理[J].电脑开发与应用,2004,2
 
    收稿日期:9月24日   修改日期:10月5日

    作者简介:朱力强(1978 - ),男,四川内江人,西华师范大学讲师,研究生,主研方向:软件工程、数据库系统应用。

上一篇:JSP程序设计中通用的分页及下载设计
下一篇:基于JSP技术进行信息交互的研究与应用
站内搜索
无忧学术网 | 论文写作研究网 | 支付宝 | 电子工程师论坛 | 上海交通大学 | 东南大学 | 复旦大学 | 同济大学 | 浙江大学 | 清华大学 | 北京大学 | 承运天成 | 搜狐 | 百度 | google | 搜狗 | 雅虎 | 新浪 | 网易 | 麻省理工学院 | 中华英才网 | 无忧工作网 | 智联招聘 | 爱词霸 | 淘宝网 | 阿里巴巴 | 校友录 | 哈佛大学 | 耶鲁大学 | 腾讯 |
代写硕士论文 | 代写工程硕士论文 | 上海代写硕士论文 | 上海代写论文 | 职称论文 | 代写研究生论文 | 代写MBA论文 | 代写MPA论文 | 代写论文网