




已阅读5页,还剩61页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
学学位位论论文文面向对象的数据建模面向对象的数据建模数据筛选接口的设计数据筛选接口的设计论论文作者姓名:文作者姓名:申申请请学位学位专业专业:申申请请学位学位类别类别:指指导导教教师师姓姓名名(职职称称):论论文提交日期:文提交日期:面向对象的数据建模面向对象的数据建模数据筛选接口的设计数据筛选接口的设计摘摘要要WISE系统是一个功能强大的数据处理系统。它应用于某公司,此公司由于行业的关系需要它去处理庞大的数据,这些数据每天都在以上百万条甚至上亿条的数量在增加。因此它需要处理海量的数据,它的其中一个比较重要的功能是根据复杂并且灵活的条件筛选出适当的数据返回给客户。本论文主要讲述了如何针对数据筛选条件比较复杂并且比较灵活这一需求,在做了详尽的需求分析之后,进行了一系列的设计,包括解决方案的设计,数据建模,PLSQL程序设计,最终完成整个数据筛选接口的设计。在整个数据筛选接口的设计中,在传统的关系性数据库的基础上,会尝试着应用一些面向对象的思想去设计。尤其在数据建模阶段通过传统的数据模型之间的关系例如主外键关系实现了一些重要的面向对象的思想。关键字关键字:数据筛选;面向对象;数据建模;PLSQLImplementtheObjectOrientedthinkingintheprojecttodatamodelingthedesignabouttheAPItofilterdataAbstractTheWISEsystemisapowerfulsystemfordataprocessing.Itisappliedinacompanywhichneedstousethissystemtoprocesshugeamountdata.Andthesedatawillbeincreasedbymillionsorhundredsmillions.Soitneedstoprocessthehugeamountdata.Oneofitsimportantfunctionisreturntherightdatatoclientfilteredbysomecomplexandflexibleconditions.Themostcontentofthepapertalksabouthowtofinishthetotaldesignfortherequirementwhichistheconditionstofilterdatacanbecomplexandflexible.TheentiredesignwillincludethedesignofprojecttosolveproblemthedesignaboutdatamodelingandthedesignaboutPLSQLprogram.Finallythealldesignstoimplementtheinterfaceforfilteringthedataarefinished.Wewilltryimplementingtheobjectorientedthinkingtodesignonthebaseoftherelationaldatabaseintheprocesstofinishallthedesign.EspeciallyintheprocesstoimplementdatamodelingwewillimplementsomeimportantobjectorientedthinkingbysomerelationsamongtraditionaldatamodelssuchasPKorFKrelationship.Keywords:datafiltration;objectoriented;datamodeling;PLSQL目目录录论文总页数:24页1引言.12开发概述.13需求分析.131需求调研.132开发运行环境.34解决方案的设计.35数据建模.85.1数据模型的建立.85.2数据库表结构的设计.95.3数据库基础视图的设计.116PLSQL程序设计.12结论.22参考文献.22致谢.23声明.2411引引言言当今社会,某些行业的数据量越来越庞大,每天都在以上百万条甚至上亿条的数量在增加,因此对这些行业的数据处理系统的性能要求也越来越高。这些要求不但包括处理速度尽可能快,系统可维护性尽可能高等传统需求,而且增加了对数据的处理尽可能的灵活等一些新的需求。要满足这些新的需求,我们需要研究这些新需求的特性,挖掘一些解决办法。面向对象的数据建模是我们研究的一个重要方向。引用言论:SteveHoberman所提出的“抽象组件”的概念和面向对象设计中的“设计模式”非常类似。即数据库专家在多次的数据建模后,将各个项目中的类似部分抽象化,提取出特定的建模模型片段,以后只需在新的项目中对这些模型片段细化派生,即可快速构建出适合于该项目的数据库架构。22开发概述开发概述WISE系统是一个功能强大的数据处理系统。由于业务的关系,它需要处理海量的数据,它的比较重要的一个功能是根据复杂并且灵活的条件筛选出适当的数据返回给客户。针对这一数据筛选功能,开发的目标是设计一个合理的数据筛选接口。接口能做到便于动态控制,便于动态修改,以及便于维护。开发的过程包括需求分析,解决方案的设计,数据建模,PLSQL程序设计,最终完成整个数据筛选接口的设计。33需求分析需求分析3311需求调研需求调研WISE系统是某公司的数据处理系统,它的一个主要功能是每天根据复杂并且灵活的条件筛选出适当的数据返回给客户。所筛选的数据都来自于一张表,这张表的字段有260个,这些字段中有超过250个字段需要作为筛选字段,它们通常互为组合去筛选出客户需要的数据,根据客户的需要它们的组合又是多变的。这张表的数据量通常在一千万到一亿条记录之间。值得注意的是,筛选条件需要去匹配的值是具有特定意义的,尽管这些值数目众多,但它们的数量不是随意增长的。而且这些值是根据客户的需求可以去定制的。表1复杂表Complexity字段名数据类型说明C_ID数字主键C_U1文本C_U2文本C_U13文本C_U4货币C_U5数字C_U6货币C_U7文本C_U8货币C_U9文本C_U10货币C_U11文本C_U12文本C_U13日期时间C_U14日期时间C_U15数字C_U16数字C_U17文本C_U18文本C_U19文本C_U20货币C_U21数字C_U22货币C_U23文本C_U24货币C_U25文本等等一共260个字段因此对数据筛选的需求特点主要有:数据筛选需求特点数据量庞大来自于一张表表的字段较多,大多数为筛选字段筛选字段通常组合,组合较为灵活筛选列去需要去匹配的值,有特定意义,客户可以定制图1需求特点分析图数据量庞大在这里不是本次设计的研究重点,后三个特点是本次设计要解决好的需求。3322开发运行环境开发运行环境开发所需的基本软、硬件环境为:Windows2003或者WindowsXP。Oracle10gR2。CPU2.40GHz1G以上内存。2G以上可用硬盘空间。在Windows2003操作系统下,以ToadforOracleXpertv为开发工具,用Oracle10gR2为后台数据库。44解决方案的设计解决方案的设计在这里来逐步分析需求应该通过怎样的方式来实现,进行一些解决方案的设计。方案方案11:直接写过程来实现。根据不同的筛选条件,写不同的过程来实现数据筛选。问题:很显然,这种方案是行不通的。由于筛选字段数量达两百多个,而且相互之间可以互为组合,所以是不应该写过程来实现的。即便把目前需求要求的筛选条件通过写过程来实现了(暂不考虑开发人员的头疼),如果需要添加一些新的筛选,那将是非常麻烦的。再则,如果所写过程中出现一些问题,也是难以维护的。所以考虑到开发的质量与代码的可维护性,是不可能采用此方案的。方案方案22:结合数据建模与程序设计来实现。由于筛选条件数量众多,但是条件之间的很多部分相互重合,从面向对象的角度出发,这些条件间存在继承的关系,如果能采用面向对象的方法,或许能做到重用条件。假设一共有250个独立的筛选条件,也即表中的250个字段单独作为条件时的情况。这些条件能相互组合,组合后的条件越发复杂,写程序时如果按照方案1要想做到很好的代码重用是不可能实现的。所以根据方案1的失败,要想很好的做到代码重用,就很有必要引入面向对象的思想,采用继承的方法,做到条件组合,就好像类与类之间的继承。作为表中列名出现的字段,是不可能相互组合的。但是换个角度,大胆的设想,如果把这些字段不作为列名,能不能做到相互组合呢?如果把这些字段转换成变量,对变量一一赋值,和作为字段相比并没有做到很大的改善。如果把这些字段转换成表中的记录值呢?试想一下,似乎看到一线光明,因为在PLSQL里,可以用到动态SQL的方法,这样可以所需要的条件动态的组合了。但是能不能真正达到便于动态控制,便于动态修改,以及便于维护呢?我们需要一步一步去研究,以及测试。根据目前得出的结论,我们现在需要一个表,表中的某一列的记录值为Complexity表中作为筛选条件的列名,如下表2所示:表2FIELD字段名数据类型说明ID数字主键NAME文本COLUMN_NAME文本列名FIELD表中的COLUMN_NAME列存放Complexity表中作为筛选条件的列名。这样就可以做到把条件一步一步拼起来了。接着往下分析。需要选取出可能作为筛选条件的列名C_U1、C_U2、C_U3、C_U4四个字段,以后的分析将会以它们作为例子。这里把每个单独的列名作为筛选条件的条件叫做简单条件,而多个简单条件组合而成的条件叫做复杂条件。值得注意的是,筛选条件中有相当一部分是类似于C_U1IN(ABCD)的,它也是简单条件,但是比较特殊一点,这样的条件把它叫做简单序列条件。假设现在客户Ted需要的数据是以C_U1A和C_U2A和C_U2A或者C_U2=B,筛选列和匹配的数值我们都可以在相关表中取到,而筛选列和匹配的数值之间的关系,例如大于,小于,等于,时间从某时间开始,这些关系是我们在写代码的时候一直在重复的写的。而正是因为这个原因,代码不能做到代码间的继承和重用,这是一个失败指出。要是通过接口设计能把这些关系像处理筛选列与匹配的数值一样处理,这个问题也就解决了。能做到么?答案是肯定的。因为这些关系也就只有数种,例如数字间的比较,时间数值之间的比较,诸如此类的关系是可以得到有效控制的。对于序列条件,只有两种关系,即是否IN,很显然也可以得到有效的控制。通过以上的分析,现在只需要再加一个表就可以了,这张表用来存放简单条件的筛选列与匹配的数值之间的关系种类,而对于序列条件,就不用,在程序里很容易做到动态处理。为了不占据篇幅,数据筛选接口的完整数据库架构会在后面的数据建模部分中一并出现。55数据建模数据建模5.15.1数据模型的建立数据模型的建立根据解决方案的设计,画出数据筛选接口的完整数据库架构,如后页图所示:CONDITIONPKIDNAMENEGATEDCONTAINER_IDCOMPOUND_CONDITIONPKIDCONJUNCTION_IDSIMPLE_CONDITIONPKIDNAMUEOPERATOR_IDFIELD_IDLIST_CONDITIONPKIDFIELD_IDCONJUNCTIONPKIDNAMECODECONDITION_OPERATORPKIDCODENAMEFIELDPKIDNAMECOLUMN_NAMELIST_CONDITION_MATCH_VALUEPKIDLIST_CONDITION_IDMATCH_VALUE图5数据库架构图5.25.2数据库表结构的设计数据库表结构的设计根据前面完成的解决方案的设计以及数据模型的建立,可以设计出完整的数据库表结构。具体设计如下:用于存放筛选条件,具体设计如表3所示:表3条件表CONDITION字段名数据类型说明ID数字编号字段主键NAME文本条件名字NEGATED数字判断是否为否定字段CONTAINER_ID数字判断是否属于复合条件字段用于存放条件联接符,具体设计如表4所示:表4条件联接符表CONJUNCTION字段名数据类型说明ID数字编号字段主键NAME文本名字CODE文本联接符编码用于存放复合条件,具体设计如表5所示:表5复合条件表COMPOUND_CONDITION字段名数据类型说明ID数字编号字段主键CONJUNCTION_ID数字联接符编号用于存放简单条件信息,具体设计如表6所示:表6简单条件表SIMPLE_CONDITION字段名数据类型说明ID数字编号字段主键NAME文本简单条件名字VALUE文本简单条件数值OPERATOR_ID数字条件运算符编号FIELD_ID数字筛选列编号用于存放条件运算符信息,具体设计如表7所示:表7条件运算符表CONDITION_OPERATOR字段名数据类型说明ID数字编号字段主键NAME文本条件运算符名字CODE文本条件运算符编码用于存放序列条件信息,具体设计如表8所示:表8序列条件表LIST_CONDITION字段名数据类型说明ID数字编号字段主键FIELD_ID数字筛选列编号用于存放序列条件需要去匹配的数值信息,具体设计如表9所示:表9序列条件匹配数值表LIST_CONDITION_MATCH_VALUE字段名数据类型说明ID数字编号字段主键LIST_CONDITION_ID数字序列条件编号MATCH_VALUE文本序列条件匹配值用于存放筛选列信息,具体设计如表10所示:表10筛选列信息表FIELD字段名数据类型说明ID数字编号字段主键NAME文本筛选列名字(可作标记)COLUMN_NAME文本实际筛选列名5.35.3数据库基础视图的设计数据库基础视图的设计通过之前的分析,我发现数据库中的八个表之间关联比较多,应该把通常发生关联的表封装起来,视图正是实现这个封装的最佳选择。需要创建四个视图,分别为简单条件视图,序列条件视图,组合条件视图,以及条件视图。通过这四个视图可以把简单条件,序列条件,以及组合条件和FIELD表很好的封装起来。为了避免占据过多篇幅,这里只以序列条件视图和组合条件视图为例。序列条件视图:CREATEORREPLACEVIEWV_LIST_CONDITION(FIELD_NAMECOLUMN_NAMEFIELD_TYPE_NAMEFIELD_TYPE_CODEFIELD_TABLE_TYPE_NAMEFIELD_TABLE_TYPE_CODENEGATEDITEM_COUNTIDFIELD_IDFIELD_TYPE_IDCONTAINER_ID)ASselectF.NameasField_NameF.Column_NameIC.Negated(selectcount()fromList_Cond_Match_ValueLCMVwhere(LCMV.List_Condition_ID=LC.ID)asI_CountLC.IDF.IDasField_IDF.Type_IDasField_Type_IDIC.Container_IDfromList_ConditionLCleftouterjoinConditionCon(C.ID=LC.ID)leftouterjoinFieldFon(F.ID=LC.Field_ID)组合条件视图:CREATEORREPLACEVIEWV_COMPOUND_CONDITION(NEGATEDCONJUNCTION_NAMECONJUNCTION_CODECONDITION_COUNTIDCONTAINER_IDCONJUNCTION_ID)ASselectIC.NegatedC.NameasConjunction_NameC.CodeasConjunction_Code(selectcount()fromConditionChildConditionwhere(ChildCondition.Container_ID=CIC.ID)asCondition_CountCC.IDIC.Container_IDCC.Conjunction_IDfromCompound_ConditionCCleftouterjoinConditionICon(IC.ID=CC.ID)leftouterjoinConjunctionCon(C.ID=CC.Conjunction_ID)这样就通过创建视图,把简单条件,序列条件,以及组合条件和FIELD表很好的封装起来了。到此,数据建模完成。66PLSQLPLSQL程序设计程序设计现在进行本接口设计的PLSQL程序设计部分。从客户出发,这里来整理一下思路。当客户提出一系列筛选条件的要求时,开发人员首先需要把这些基本的简单条件和匹配的数值,以及相关的记录值,一一插入相关的表中。开发人员可以用写一系列的过程来实现,通过传入必需的参数来调用相关的过程,插入一些数值。从下到上,首先要对表直接进行操作,需要一系列最基本的用来实现把数值插入表的过程。以简单条件为例:procedureIns_Simple_Condition(p_calling_user_idinteger-Requiredp_namevarchar2:=nullp_negatednumber:=0-Requiredp_container_idinteger:=nullp_field_idinteger-Requiredp_valuevarchar2:=nullp_enum_value_idinteger:=nullp_comparison_field_idinteger:=nullp_operator_idinteger-Requiredp_new_row_idoutinteger)isbegin-省略部分代码Ins_Condition(p_calling_user_idp_namep_negatedp_container_idp_new_row_id)insertintoSimple_Condition(IDField_IDValueEnum_Value_IDComparison_Field_IDOperator_ID)values(p_new_row_idp_field_idp_valuep_enum_value_idp_comparison_field_idp_operator_id)-省略部分代码end然后,需要在这些基础过程之上,写一些调用这些基础过程的过程,也以简单条件为例:procedureAdd_Simple_Condition(p_calling_user_idinteger-Requiredp_app_idintegerp_table_type_codevarchar2-Requiredp_namevarchar2:=nullp_negatednumber:=0p_container_idinteger:=nullp_field_namevarchar2-Requiredp_valuevarchar2:=nullp_value_datedate:=nullp_comparison_field_namevarchar2:=nullp_operator_codevarchar2-Requiredp_new_row_idoutinteger)is-l_field_idintegerl_field_type_codevarchar2(100)l_comparison_field_idintegerl_comparison_field_type_codevarchar2(100)l_operator_codevarchar2(100)l_operator_idintegerl_valuevarchar2(1000)begin-省略部分代码selectIDCodeintol_operator_idl_operator_codefromCondition_Operatorwhere(lower(Code)=lower(p_operator_code)-省略部分代码Ins_Simple_Condition(p_calling_user_id=p_calling_user_idp_name=p_namep_negated=p_negatedp_container_id=p_container_idp_field_id=l_field_idp_value=l_valuep_comparison_field_id=l_comparison_field_idp_operator_id=l_operator_idp_new_row_id=p_new_row_id)-省略部分代码end现在就可以创建一些比较复杂的组合条件了。为了不占据篇幅,这里只以一个简单的复合条件为例:-Firstcompoundcondition(NO_NOTICEIN(BCD)ANDMSG_DELINQ_DAYS90ANDDO_NOT_PROCESS=9ANDCLIENT_ID=116)declarel_calling_user_idintegerl_dps_appl_idintegerl_countintegerl_spec_idintegerl_item_idintegerl_simple_idintegerl_inventory_item_idintegerl_temp_idintegerl_compound_idintegerl_field_idintegerl_rule_idintegerl_list_idintegerl_state_4_ted1varchar2(4000):=BCDbegin-省略部分代码-addconditionAdd_Compound_Item_condition(p_name=TheFourthcompoudconditionp_negated=0p_conjunction=Andp_container_id=nullp_new_row_id=l_rule_id)selectidintol_field_idfromfield_wherename=NO_NOTICEand(application_id=l_dps_appl_idorapplication_idisnull)Add_List_Item_condition(p_name=NO_NOTICEIN(BCD)p_negated=1p_field_id=l_field_idp_container_id=l_rule_idp_new_row_id=l_list_id)forxin(withsrcas(selectl_state_4_ted1expfromdual)numas(selectrownumIfromdualconnectbyrownum0orderbyr)loopAdd_List_Item_condition_MV(p_list_item_condition_id=l_list_idp_match_value=x.rp_new_row_id=l_temp_id)endloopselectidintol_field_idfromfield_wherename=MSG_DELINQ_DAYSand(application_id=l_dps_appl_idorapplication_idisnull)Add_Simple_Item_condition(p_name=nullp_negated=0p_container_id=l_rule_idp_field_id=l_field_idp_value=90p_comparison_field_name=nullp_operator=Greaterp_new_row_id=l_simple_id)selectidintol_field_idfromfield_wherename=DO_NOT_PROCESSand(application_id=l_dps_appl_idorapplication_idisnull)Add_Simple_Item_condition(p_name=nullp_negated=0p_container_id=l_rule_idp_field_id=l_field_idp_value=9p_comparison_field_name=nullp_operator=Equalsp_new_row_id=l_simple_id)selectidintol_field_idfromfield_wherename=CLIENT_IDand(application_id=l_dps_appl_idorapplication_idisnull)Add_Simple_Item_condition(p_name=nullp_negated=0p_container_id=l_rule_idp_field_id=l_field_idp_value=116p_comparison_field_name=nullp_operator=Equalsp_new_row_id=l_simple_id)COMMITend到此筛选列和需要匹配的数值,就可以得到灵活控制了。还需要对存储在表CONDITION_OPERATOR中的数值,也就是记录筛选列和需要匹配的数值之间的关系的数值进行处理,以便能动态处理。下面只以需要匹配的数值的数据类型为日期类型的情况为例。当需要匹配的数值的数据类型为日期类型时,如下:functionComparison_Date(p_rowV_Simple_Condition%rowtypep_field_refvarchar2p_comparison_field_refvarchar2)returnvarchar2isl_comparisonvarchar2(4000)l_operatorvarchar2(2)l_value_this_daydatel_value_this_day_stringvarchar2(1000)l_value_next_daydatel_value_next_day_stringvarchar2(1000)begin-省略部分代码if(p_comparison_field_refisnotnull)then-省略部分代码l_value_this_day_string:=trunc(|p_comparison_field_ref|dd)l_value_next_day_string:=trunc(|p_comparison_field_ref|+1dd)elseif(p_row.Valueisnotnull)thenl_value_this_day:=to_date(p_row.Valueg_date_at)l_value_this_day_string:=to_date(|p_row.Value|g_date_at|)l_value_next_day:=l_value_this_day+1l_value_next_day_string:=to_date(|to_char(l_value_next_dayg_date_at)|g_date_at|)endifendifcasep_row.Operator_CodewhenEqualsthenif(p_comparison_field_refisnotnull)thenif(p_row.Negated=0)thenl_comparison:=(|p_field_ref|isnull)and|(|p_comparison_field_ref|isnull)or|(|p_field_ref|=|l_value_this_day_string|)|and|(|p_field_ref|=|l_value_this_day_string|)|and|(|p_field_ref|=elsel_operator:=A和C_U2A和C_U2A或者C_U2=B,筛选列和匹配的数值我们都可以在相关表中取到,而筛选列和匹配的数值之间的关系,例如大于,小于,等于,时间从某时间开始,这些关系是我们在写代码的时候一直在重复的写的。而正是因为这个原因,代码不能做到代码间的继承和重用,这是一个失败指出。要是通过接口设计能把这些关系像处理筛选列与匹配的数值一样处理,这个问题也就解决了。能做到么?答案是肯定的。因为这些关系也就只有数种,例如数字间的比较,时间数值之间的比较,诸如此类的关系是可以得到有效控制的。对于序列条件,只有两种关系,即是否IN,很显然也可以得到有效的控制。通过以上的分析,现在只需要再加一个表就可以了,这张表用来存放简单条件的筛选列与匹配的数值之间的关系种类,而对于序列条件,就不用,在程序里很容易做到动态处理。为了不占据篇幅,数据筛选接口的完整数据库架构会在后面的数据建模部分中一并出现。55数据建模数据建模5.15.1数据模型的建立数据模型的建立根据解决方案的设计,画出数据筛选接口的完整数据库架构,如后页图所示:CONDITIONPKIDNAMENEGATEDCONTAINER_IDCOMPOUND_CONDITIONPKIDCONJUNCTION_IDSIMPLE_CONDITIONPKIDNAMUEOPERATOR_IDFIELD_IDLIST_CONDITIONPKIDFIELD_IDCONJUNCTIONPKIDNAMECODECONDITION_OPERATORPKIDCODENAMEFIELDPKIDNAMECOLUMN_NAMELIST_CONDITION_MATCH_VALUEPKIDLIST_CONDITION_IDMATCH_VALUE图5数据库架构图5.25.2数据库表结构的设计数据库表结构的设计根据前面完成的解决方案的设计以及数据模型的建立,可以设计出完整的数据库表结构。具体设计如下:用于存放筛选条件,具体设计如表3所示:表3条件表CONDITION字段名数据类型说明ID数字编号字段主键NAME文本条件名字NEGATED数字判断是否为否定字段CONTAINER_ID数字判断是否属于复合条件字段用于存放条件联接符,具体设计如表4所示:表4条件联接符表CONJUNCTION字段名数据类型说明ID数字编号字段主键NAME文本名字CODE文本联接符编码用于存放复合条件,具体设计如表5所示:表5复合条件表COMPOUND_CONDITION字段名数据类型说明ID数字编号字段主键CONJUNCTION_ID数字联接符编号用于存放简单条件信息,具体设计如表6所示:表6简单条件表SIMPLE_CONDITION字段名数据类型说明ID数字编号字段主键NAME文本简单条件名字VALUE文本简单条件数值OPERATOR_ID数字条件运算符编号FIELD_ID数字筛选列编号用于存放条件运算符信息,具体设计如表7所示:表7条件运算符表CONDITION_OPERATOR字段名数据类型说明ID数字编号字段主键NAME文本条件运算符名字CODE文本条件运算符编码用于存放序列条件信息,具体设计如表8所示:表8序列条件表LIST_CONDITION字段名数据类型说明ID数字编号字段主键FIELD_ID数字筛选列编号用于存放序列条件需要去匹配的数值信息,具体设计如表9所示:表9序列条件匹配数值表LIST_CONDITION_MATCH_VALUE字段名数据类型说明ID数字编号字段主键LIST_CONDITION_ID数字序列条件编号MATCH_VALUE文本序列条件匹配值用于存放筛选列信息,具体设计如表10所示:表10筛选列信息表FIELD字段名数据类型说明ID数字编号字段主键NAME文本筛选列名字(可作标记)COLUMN_NAME文本实际筛选列名5.35.3数据库基础视图的设计数据库基础视图的设计通过之前的分析,我发现数据库中的八个表之间关联比较多,应该把通常发生关联的表封装起来,视图正是实现这个封装的最佳选择。需要创建四个视图,分别为简单条件视图,序列条件视图,组合条件视图,以及条件视图。通过这四个视图可以把简单条件,序列条件,以及组合条件和FIELD表很好的封装起来。为了避免占据过多篇幅,这里只以序列条件视图和组合条件视图为例。序列条件视图:CREATEORREPLACEVIEWV_LIST_CONDITION(FIELD_NAMECOLUMN_NAMEFIELD_TYPE_NAMEFIELD_TYPE_CODEFIELD_TABLE_TYPE_NAMEFIELD_TABLE_TYPE_CODENEGATEDITEM_COUNTIDFIELD_IDFIELD_TYPE_IDCONTAINER_ID)ASselectF.NameasField_NameF.Column_NameIC.Negated(selectcount()fromList_Cond_Match_ValueLCMVwhere(LCMV.List_Condition_ID=LC.ID)asI_CountLC.IDF.IDasField_IDF.Type_IDasField_Type_IDIC.Container_IDfromList_ConditionLCleftouterjoinConditionCon(C.ID=LC.ID)leftouterjoinFieldFon(F.ID=LC.Field_ID)组合条件视图:CREATEORREPLACEVIEWV_COMPOUND_CONDITION(NEGATEDCONJUNCTION_NAMECONJUNCTION_CODECONDITION_COUNTIDCONTAINER_IDCONJUNCTION_ID)ASselectIC.NegatedC.NameasConjunction_NameC.CodeasConjunction_Code(selectcount()fromConditionChildConditionwhere(ChildCondition.Container_ID=CIC.ID)asCondition_CountCC.IDIC.Container_IDCC.Conjunction_IDfromCompound_ConditionCCleftouterjoinConditionICon(IC.ID=CC.ID)leftouterjoinConjunctionCon(C.ID=CC.Conjunction_ID)这样就通过创建视图,把简单条件,序列条件,以及组合条件和FIELD表很好的封装起来了。到此,数据建模完成。66PLSQLPLSQL程序设计程序设计现在进行本接口设计的PLSQL程序设计部分。从客户出发,这里来整理一下思路。当客户提出一系列筛选条件的要求时,开发人员首先需要把这些基本的简单条件和匹配的数值,以及相关的记录值,一一插入相关的表中。开发人员可以用写一系列的过程来实现,通过传入必需的参数来调用相关的过程,插入一些数值。从下到上,首先要对表直接进行操作,需要一系列最基本的用来实现把数值插入表的过程。以简单条件为例:procedureIns_Simple_Condition(p_calling_user_idinteger-Requiredp_namevarchar2:=nullp_negatednumber:=0-Requiredp_container_idinteger:=nullp_field_idinteger-Requiredp_valuevarchar2:=nullp_enum_value_idinteger:=nullp_comparison_field_idinteger:=nullp_operator_idinteger-Requiredp_new_row_idoutinteger)isbegin-省略部分代码Ins_Condition(p_calling_user_idp_namep_negatedp_container_idp_new_row_id)insertintoSimple_Condition(IDField_IDValueEnum_Value_IDComparison_Field_IDOperator_ID)values(p_new_row_idp_field_idp_valuep_enum_value_idp_comparison_field_idp_operator_id)-省略部分代码end然后,需要在这些基础过程之上,写一些调用这些基础过程的过程,也以简单条件为例:procedureAdd_Simple_Condition(p_calling_user_idinteger-Requiredp_app_idintegerp_table_type_codevarchar2-Requiredp_namevarchar2:=nullp_negatednumber:=0p_container_idinteger:=nullp_field_namevarchar2-Requiredp_valuevarchar2:=nullp_value_datedate:=nullp_comparison_field_namevarchar2:=nullp_operator_codevarchar2-Requiredp_new_row_idoutinteger)is-l_field_idintegerl_field_type_codevarchar2(100)l_comparison_field_idintegerl_comparison_field_type_codevarchar2(100)l_operator_codevarchar2(100)l_operator_idintegerl_valuevarchar2(1000)begin-省略部分代码selectIDCodeintol_operator_idl_operator_codefromCondition_Operatorwhere(lower(Code)=lower(p_operator_code)-省略部分代码Ins_Simple_Condition(p_calling_user_id=p_calling_user_idp_name=p_namep_negated=p_negatedp_container_id=p_container_idp_field_id=l_field_idp_value=l_valuep_comparison_field_id=l_comparison_field_idp_operator_id=l_operator_idp_new_row_id=p_new_row_id)-省略部分代码end现在就可以创建一些比较复杂的组合条件了。为了不占据篇幅,这里只以一个简单的复合条件为例:-Firstcompoundcondition
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电子版档案托管合同范本
- 机械厂管理协议合同范本
- 自由房产合作的合同范本
- 电子汽车买卖合同协议书
- 材料采购合同定金协议书
- 用劳务公司人员合同范本
- 背靠背合同三方终止协议
- 独居小沙发租房合同范本
- 飞机保险合作协议书模板
- 瑜伽普拉提合作合同协议
- 2025年酒店管理专业基础知识考试试题及答案
- 2025年四川酒业茶业投资集团有限公司及下属子公司招聘笔试参考题库含答案解析
- 新能源汽车热管理系统的能量优化与梯级利用策略探讨
- (高清版)DB13 5808-2023 餐饮业大气污染物排放标准
- T/CGCC 66-2022外卖智能取餐柜
- 【泡泡玛特营销策略研究的文献综述】3100字
- 医师多点备案协议书
- 2006年江苏高考政治真题及答案
- 志愿者社区服务责任免除及合作协议
- 视频制作拍摄服务方案投标文件(技术方案)
- 静脉留置针的试题及答案
评论
0/150
提交评论