【正文】
這些要求不但包括處理速度盡可能快,系統(tǒng)可維護性盡可能高等傳統(tǒng)需求,而且增加了對數據的處理盡可能的靈活等一些新的需求。 除非另有科研合同和其他法律文書的制約,本論文的科研成果屬于成都信息工程學院。 作者簡介: 姓 名:葉凱 性別:男 出生年月: 1984 年 02 月 12 日 民族:漢 Email: 聲 明 本論文的工作是 2021年 2月至 2021年 6月在成都信息工程學院網絡工程系完成的。 [4] Arup Nanda,Steven PL/SQL for DBAs[M].O39。需要什么樣的條件,無論復雜與否,都只需要根據需求,通過傳入相關參數調用產生條件的公共接口,然后用動態(tài) SQL 的方法,‘拼’在篩選條件的地方就可以了。Unknown type for item condition 39。 when 39。 l_condition_type varchar2( 100 )。 when 39。Date39。 被調用 被調用 基礎操作條件過程 1 對數據庫的相關條件表進行 操作,包括插入 ,更新等 基礎操作條件過程 2 動態(tài)處理記錄篩選列和需 要匹配的數值之間的關系 的數值 調用基礎條件過程 用于創(chuàng)造一些復雜的組合條件 select * into l_row from V_SimpleCondition where( ID = p_item_condition_id )。 l_parison_field_ref varchar2( 1000 ) := null。 總結一下,本接口設計的 PL/SQL 程序設計部分 是通過如下過程實現了靈活控制篩選條件,并完成了數據篩選接口的基本部分的。re checking against is null, so we should have no matches. l_parison := g_false_condition。=39。 else The value we39。 else l_operator := 39。 end if。 || 39。 || 39。 || p_field_ref || 39。 || p_field_ref || 39。 end if。 || l_value_this_day_string || 39。 || 39。 || 39。 || p_field_ref || 39。 || p_field_ref || 39。 || p_field_ref || 39。 )39。, 39。to_date( 39。39。39。39。39。 l_value_next_day date。 end。, 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 = 90, p_parison_field_name = null, p_operator = 39。,39。,39。 Add_List_Item_condition ( p_name = 39。 begin 省略部分代碼 add condition Add_Compound_Item_condition ( p_name = 39。 l_inventory_item_id integer。 省略部分代碼 end。 l_field_type_code varchar2( 100 )。 從客戶出發(fā),這里 來整理一下思路。 5 數據建模 數據模型的建立 根據解決方案的設計,畫出數據篩選接口的完整數據庫架構, 如后頁 圖所示: 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 數據庫架構 圖 數據庫表結構的設計 根據前面完成的解決方案的設計以 及數據模型的 建立, 可以設計出完整的數據庫表結構。問題在哪兒呢?分析一下,對于簡單條件,比如‘ C_U1 A’ 或者‘ C_U2=B’,篩選列和匹配的數值我們都可以在相關表中取到,而篩選列和匹配的數值之間的關系,例如大于,小于,等于,時間從某時間開始,這些關系是我們在寫代碼的時候一直在重復的寫的。 所以為了能把這些數值‘拼裝’起來,這些數值就需要獨立的存放在一張表中。 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 條件功能組合圖一 到此 就可以實現需求里的篩選條件間的自由組合這一功能了。 假設現在客戶 Ted需要的數據是以 C_U1A和 C_U2B或者 C_U3=C 和 C_U1=D作為篩選條件而獲取的,而另一客戶 Robin 需要的數據則是以 C_U1A 和 C_U2B并且 C_U3=C 和 C_U1=D 作為篩選條件而獲取的。 如果把這些字段轉換成表中的記錄值呢?試想一下,似乎看到一線光明,因為在 PL/SQL 里,可以用到動態(tài) SQL 的方法,這樣可以所需要的條件動態(tài)的組合了。 所以考慮到開發(fā)的質量與代碼的可維護性,是不可能采用此方案的。 在 Windows 2021 操作系統(tǒng)下,以 Toad for Oracle Xpert 為開發(fā)工具,用 Oracle 10 g R2 為后臺數據庫。這張表的數據量通常在一千萬到一億條記錄之間。即數據庫專家在多次的數據建模后 , 將各個項目中的類似部分抽象化,提取出特定的建模模型片段,以后只需在新的項目中對這些模型片段細化派生,即可快速構建出適合于該 項目的數據庫架構。本論文主要講述了如何針對數據篩選條件比較復雜并且比較靈活這一需求,在做了詳盡的需求分析之后,進行了一系列的設計,包括解決方案的設計,數據建模, PL/SQL 程序設計,最終完成整個數據篩選接口的設計。 在整個數據篩選接口的設計中,在傳統(tǒng)的關系性數據庫的基礎上,會嘗試著應用一些面向對象的思想去設計。 2 開發(fā)概述 《 WISE 系統(tǒng)》是一個功能強大的數據處理系統(tǒng)。值得注意的是,篩選條件需要去匹配的值是具有特定意義的,盡管這些值數目眾多,但它們的數量不是隨意增長的。 4 解決方案的設計 在這里 來逐步分析需求應該通過怎樣的方式來實現,進行一些解決方案的設計。 方案 2: 結合數據建模 與程序設計來實現。 但是能不能真正達到便于動態(tài)控制,便于動態(tài)修改,以及便于維護呢?我們需 要一步一步去研究,以及測試。 現在 可以 得到一個結論:兩個簡單條件間的關系只有兩種, AND 和 OR。 還 需 要想辦法去實現篩選條件需要去匹配的值是具有特定意義的,而且客戶可以定制這一需求。 那就 需要再創(chuàng)建一張表 LIST_CONDITION_MATCH_VALUE。而正是因為這個原因,代碼不能做到代碼間的繼承和重用,這是一個失敗指出。具體設計如下: 用于存放篩選條件,具體設計如表 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 文本 實際篩選列名 數據庫基礎視圖的設計 通過之前的分析,我發(fā)現數據庫中的八個表之間關聯比較多, 應該把通常發(fā)生關聯的表封裝起來,視圖正 是實現這個‘封裝’的最佳選擇。當客戶提出一系列篩選條件的要求時,開發(fā)人員 首先需要把這些基本的簡單條件和匹配的數值,以及相關的記錄值,一一插入相關的表中。 l_parison_field_id integer。 現在 就可以創(chuàng)建一些比較復雜的組合條件了。 l_temp_id integer。The Fourth poud condition39。[NO_NOTICE IN(B,C,D)]39。, 39。 || , 39。Greater39。 select id into l_field_id from field_ where name = 39。 到此篩選列和需要匹配的數值,就可以得到靈活控制了。 l_value_next_day_string varchar2( 1000 )。 )39。 )39。 || || 39。 || g_date_format || 39。 || 39。 || 39。 。 is null ) and 39。 = 39。 39。( 39。( 39。 ) or 39。 else if( is null ) then if( = 0 ) then l_parison := p_fi