【正文】
以 Toad for Oracle Xpert 為開發(fā)工具,用 Oracle 10 g R2 為后臺數(shù)據(jù)庫。 問題:很顯然,這種方案是行不通的。 所以考慮到開發(fā)的質(zhì)量與代碼的可維護(hù)性,是不可能采用此方案的。這些條件能相互組合,組合后的條件越發(fā)復(fù)雜,寫程序時(shí)如果按照方案1要想做到很好的代碼重用是不可能實(shí)現(xiàn)的。 如果把這些字段轉(zhuǎn)換成表中的記錄值呢?試想一下,似乎看到一線光明,因?yàn)樵?PL/SQL 里,可以用到動(dòng)態(tài) SQL 的方法,這樣可以所需要的條件動(dòng)態(tài)的組合了。 接著往下分析。 假設(shè)現(xiàn)在客戶 Ted需要的數(shù)據(jù)是以 C_U1A和 C_U2B或者 C_U3=C 和 C_U1=D作為篩選條件而獲取的,而另一客戶 Robin 需要的數(shù)據(jù)則是以 C_U1A 和 C_U2B并且 C_U3=C 和 C_U1=D 作為篩選條件而獲取的。 現(xiàn)在就可以做到把一個(gè)個(gè)簡單條件通過兩種關(guān)系的一種‘拼裝’起來,組合而成一個(gè)個(gè)復(fù)雜條件。 C O N D I T I O NP K I D N A M E N E G A T E D C O N T A I N E R _ I DC O M P O U N D _ C O N D I T I O NP K I D C O N J U N C T I O N _ I DS I M P L E _ C O N D I T I O NP K I D N A M E V A L U E O P E R A T O R _ I D F I E L D _ I DL I S T _ C O N D I T I O NP K I D F I E L D _ I DC O N J U N C T I O NP K I D N A M E C O D EF I E L D P K I D N A M E C O L U M N _ N A M E 圖 3 條件功能組合圖一 到此 就可以實(shí)現(xiàn)需求里的篩選條件間的自由組合這一功能了。所以必須要把這些數(shù)值存放到表中去。 所以為了能把這些數(shù)值‘拼裝’起來,這些數(shù)值就需要獨(dú)立的存放在一張表中。 但是有一個(gè)問題,假設(shè)通過 寫程序來產(chǎn)生了非常多的篩選條件,某一天,客戶需要再增加一系列 數(shù)量眾多的篩選條件,會發(fā)生什么呢?那就 會花大量的時(shí)間去寫代碼。問題在哪兒呢?分析一下,對于簡單條件,比如‘ C_U1 A’ 或者‘ C_U2=B’,篩選列和匹配的數(shù)值我們都可以在相關(guān)表中取到,而篩選列和匹配的數(shù)值之間的關(guān)系,例如大于,小于,等于,時(shí)間從某時(shí)間開始,這些關(guān)系是我們在寫代碼的時(shí)候一直在重復(fù)的寫的。因?yàn)檫@些關(guān)系也就只有數(shù)種,例如數(shù)字間的比較,時(shí)間數(shù)值之間的比較,諸如此類的關(guān)系是可以得到有效控制的。 5 數(shù)據(jù)建模 數(shù)據(jù)模型的建立 根據(jù)解決方案的設(shè)計(jì),畫出數(shù)據(jù)篩選接口的完整數(shù)據(jù)庫架構(gòu), 如后頁 圖所示: C O N D I T I O NP K I D N A M E N E G A T E D C O N T A I N E R _ I DC O M P O U N D _ C O N D I T I O NP K I D C O N J U N C T I O N _ I DS I M P L E _ C O N D I T I O NP K I D N A M E V A L U E O P E R A T O R _ I D F I E L D _ I DL I S T _ C O N D I T I O NP K I D F I E L D _ I DC O N J U N C T I O NP K I D N A M E C O D EC O N D I T I O N _ O P E R A T O RP K I D C O D E N A M EF I E L D P K I D N A M E C O L U M N _ N A M EL I S T _ C O N D I T I O N _ M A T C H _ V A L U EP K I D L I S T _ C O N D I T I O N _ I D M A T C H _ V A L U E圖 5 數(shù)據(jù)庫架構(gòu) 圖 數(shù)據(jù)庫表結(jié)構(gòu)的設(shè)計(jì) 根據(jù)前面完成的解決方案的設(shè)計(jì)以 及數(shù)據(jù)模型的 建立, 可以設(shè)計(jì)出完整的數(shù)據(jù)庫表結(jié)構(gòu)。為了避免占據(jù)過多篇幅,這里只以序列條件視圖和組合條件視圖為例。 從客戶出發(fā),這里 來整理一下思路。 以簡 單條件為例: procedure Ins_Simple_Condition ( p_calling_user_id integer, Required p_name varchar2 := null, p_negated number := 0, Required p_container_id integer := null, p_field_id integer, Required p_value varchar2 := null, p_enum_value_id integer := null, p_parison_field_id integer := null, p_operator_id integer, Required p_new_row_id out integer ) is begin 省略部分代碼 Ins_Condition ( p_calling_user_id, p_name, p_negated, p_container_id, p_new_row_id )。 l_field_type_code varchar2( 100 )。 l_operator_id integer。 省略部分代碼 end。 l_count integer。 l_inventory_item_id integer。 l_rule_id integer。 begin 省略部分代碼 add condition Add_Compound_Item_condition ( p_name = 39。, p_container_id = null, p_new_row_id = l_rule_id)。 Add_List_Item_condition ( p_name = 39。,39。,39。,39。,39。 end loop。 Add_Simple_Item_condition ( p_name = null, p_negated = 0, p_container_id = l_rule_id, p_field_id = l_field_id, p_value = 90, p_parison_field_name = null, p_operator = 39。DO_NOT_PROCESS39。, p_new_row_id = l_simple_id)。 Add_Simple_Item_condition ( p_name = null, p_negated = 0, p_container_id = l_rule_id, p_field_id = l_field_id, p_value = 116, p_parison_field_name = null, p_operator = 39。 end。 當(dāng)需要匹配的數(shù)值的數(shù)據(jù)類型為日期類型時(shí),如下: function Comparison_Date ( p_row V_Simple_Condition%rowtype, p_field_ref varchar2, p_parison_field_ref varchar2 ) return varchar2 is l_parison varchar2( 4000 )。 l_value_next_day date。 || p_parison_field_ref || 39。39。 || p_parison_field_ref || 39。39。to_date( 39。39。, 39。39。 )39。to_date( 39。39。, 39。39。 )39。 case when 39。 || p_field_ref || 39。 || p_parison_field_ref || 39。 || p_field_ref || 39。 || 39。 || p_field_ref || 39。 else l_parison := 39。 || 39。 || 39。 || 39。 || 39。 || l_value_this_day_string || 39。 || p_field_ref || 39。 end if。 is not null39。 || p_field_ref || 39。 || 39。 || p_field_ref || 39。 else l_parison := 39。 || 39。 || p_field_ref || 39。 || 39。 || p_field_ref || 39。 end if。Greater39。 else l_operator := 39。 39。 else The value we39。Less39。=39。 || l_operator || 39。re checking against is null, so we should have no matches. l_parison := g_false_condition。 || )。 總結(jié)一下,本接口設(shè)計(jì)的 PL/SQL 程序設(shè)計(jì)部分 是通過如下過程實(shí)現(xiàn)了靈活控制篩選條件,并完成了數(shù)據(jù)篩選接口的基本部分的。 function Cond_Where_Simple ( p_item_condition_id integer, p_index_field_prefix varchar2 ) return varchar2 is Required l_where_clause varchar2( 4000 )。 l_parison_field_ref varchar2( 1000 ) := null。.39。 被調(diào)用 被調(diào)用 基礎(chǔ)操作條件過程 1 對數(shù)據(jù)庫的相關(guān)條件表進(jìn)行 操作,包括插入 ,更新等 基礎(chǔ)操作條件過程 2 動(dòng)態(tài)處理記錄篩選列和需 要匹配的數(shù)值之間的關(guān)系 的數(shù)值 調(diào)用基礎(chǔ)條件過程 用于創(chuàng)造一些復(fù)雜的組合條件 select * into l_row from V_SimpleCondition where( ID = p_item_condition_id )。 case when 39。Date39。 then l_where_clause := l_where_clause || Comparison_String( l_row, l_field_ref, l_parison_field_ref )。 when 39。 return l_where_clause。 l_condition_type varchar2( 100 )。s either a simple, pound, or list condition. l_condition_type := Condition_Type( p_condition_id )。 when 39。 when 39。Unknown type for item condition 39。 )39。需要什么樣的條件,無論復(fù)雜與否,都只需要根據(jù)需求,通過傳入相關(guān)參數(shù)調(diào)用產(chǎn)生條件的公共接口,然后用動(dòng)態(tài) SQL 的方法,‘拼’在篩選條件的地方就可以了。 [2] Steven Feuerstein,Bill PL/SQL Programming 4th Edtion[M].O39。 [4] Arup Nanda,Steven PL/SQL for DBAs[M].O39。 [6] 張海藩 .軟件工程導(dǎo)論 [M].北京 清華大學(xué)出版社 ,1999。 作者簡介: 姓 名:葉凱 性別:男 出生年月: 1984 年 02 月 12 日 民族:漢 Email: 聲 明 本論文的工作是 2021年 2月至 2021年 6月在成都信息工程學(xué)院網(wǎng)絡(luò)工程系完成的。 ( 2)學(xué)??梢圆捎糜坝?、縮印或其他復(fù)制方式保存學(xué)位論文。 除非另有科研合同和其他法律文書的制約,本論文的科研成果屬于成都信息工程學(xué)院。本論文主要講述了如何針對數(shù)據(jù)篩選條件比較復(fù)雜并且比較靈活這一需求,在做了詳盡的需求分析之后,進(jìn)行了一系列的設(shè)計(jì),包括解決方案的設(shè)計(jì),數(shù)據(jù)建模, PL/SQL 程序設(shè)計(jì),最終完成整個(gè)數(shù)據(jù)篩選接口的設(shè)計(jì)。這些要求不但包括處理速度盡可能快,系統(tǒng)可維護(hù)性盡可能高等傳統(tǒng)需求,而且增加了對數(shù)據(jù)的處理盡可能的靈活等一些