原文連結:Declaring a Complex Internal Table
先前章節有簡單提及用單一變數構成的Internal Table,現在既然已經介紹完structure,就來看看如何用structure建構具有多欄位的Internal Table吧!
上圖的numbers
為第9天中有介紹到的單欄Internal Table,下表connections
則是用connection
這個structure建構而成,具有多欄位的Internal Table。
所謂的複雜Internal Table定義其實很簡單,就是用structure做為每一列(row)的資料型態,因此可以擁有許多欄(columns),Internal Table的欄位順序、名稱和型別與structure是相對應的。
跟資料表格有關的章節很推薦各位去翻原文附圖,附有精美圖示易懂又好理解。
internal table的資料存取可分為索引存取與鍵存取:
索引存取(index access):以1開始作為第一列,指定資料所在表格中的列數進行存取。
鍵存取(key access):
尋找特定列中的特定值,在多欄位的複雜internal table中更為方便。可以一次將多個列中的值都設為搜索條件。
* 以上圖中的表connections為例
connection = connections[ 3 ]. "用索引存取第三列"
connection = connections[ airport_from_id = 'SFO' airport_to_id = 'SIN'] "用鍵存取出發地為SFO,抵達地為SIN的列"
雖然用鍵搜尋很方便,然而在搜尋速度上相較用索引慢上許多。為了改善這個問題,選擇適當的存取模式可以促進以鍵搜尋的速度。
存取模式決定了表格資料的儲存方式,以及系統如何檢索表格。每個internal table都具有三種存取模式中的其中一種:
" 標準表格,鍵非唯一識別 (簡短寫法)
DATA connections_1 TYPE TABLE OF st_connection.
" 標準表格,鍵非唯一識別 (詳細寫法)
DATA connections_2 TYPE STANDARD TABLE OF st_connection
WITH NON-UNIQUE DEFAULT KEY.
" 排序表格,鍵非唯一識別
DATA connections_3 TYPE SORTED TABLE OF st_connection
WITH NON-UNIQUE KEY airport_from_id
airport_to_id.
" 雜湊表格,鍵唯一識別
DATA connections_4 TYPE HASHED TABLE OF st_connection
WITH UNIQUE KEY carrier_id
標準表格(Standard Table):
表格內容並不以特定順序排列,在預設下,新的資料列將添加在最尾端。由於未有預設排序,當使用鍵存取資料時將依序存取每一行,若為資料量大的表格將花費巨大的檢索時間。
排序表格(Sorted Table):
在排序表格中,表格內容將按照鍵的值升序排列,當表格中被插入一筆新資料,系統會確保它放在正確的位置。由於表格資料經過排序,故在搜尋上相較標準表格更有效率(當遵照特定規則時)。
雜湊表格(Hashed Table):
雜湊表格使用特殊的演算法,可以使系統在即使表格很大時仍非常快的搜尋到資料,然而此種能效能提升的表格僅能在特定情境下運作。
每個 internal table 都有一個代表鍵(key)的欄位。相比標準表格,鍵對於排序表格非常重要,因其決定了排序表格的排序方式。
並且,只有在用鍵存取資料時,排序表格與雜湊表格才有搜尋更快的優勢。
另一個關於鍵的特色,在於其唯一性,而對於不同模式的表格,鍵的規則也有些不同:
註:Internal table也可能有有第二個鍵,透過不同欄位的聯合搜尋,可以幫助存取時的效能提升。
建議internal table在建立表格型別(TYPES)時就一起宣告表格的存取模式與鍵,而不是在表格實體(DATA)建立時才進行宣告。
"1. 建立structure"
TYPES: BEGIN OF st_connection,
carrier_id TYPE /dmo/carrier_id,
connection_id TYPE /dmo/connection_id,
airport_from_id TYPE /dmo/airport_from_id,
airport_to_id TYPE /dmo/airport_to_id,
carrier_name TYPE /dmo/carrier_name,
END OF st_connection.
"2. 建立internal table型別"
TYPES tt_connections TYPE SORTED TABLE OF st_connection
WITH UNIQUE KEY carrier_id
connection_id.
"3. 建立internal table"
DATA connections_5 TYPE tt_connections.
如上例的三步驟,首先定義 structure st_connection
,接著根據該structure
建立internal table型別並宣告存取模式與鍵,最後使用前述型別建立internal table實體。
如果建立了gobal 的 internal table type,就可在系統全域都使用這個型別。ADT有為這類的資料庫物件提供專屬GUI編輯器,簡單介紹如下:
左上:定義internal table參照的structure
右上:定義internal table的存取模式
右中:定義鍵是否具唯一性
右下:從structure的欄位元件中指定鍵
明天來了解如何使用internal table吧~