本篇來介紹利用 Oracle Object Types 來做中介暫存的實作。
建立 Oracle Object:
定義這個 Object 的內容,可以把它想像為所希望的 Row Columns 的定義。
CREATE TYPE type_obj AS OBJECT ( col1 INTEGER, col2 VARCHAR2(60) ); /
建立 Object Collection:
建立一個 Table Type,這個 Table 裝的資料列內容(欄位)就是之前所建立的 Object。
CREATE OR REPLACE TYPE type_tab IS TABLE OF type_obj; /
在 PL/SQL 中的應用:
定義好前面兩個 Type,就可以拿它來在程式中實作了。
DECLARE -- 宣告與初始化 obj_type_tab type_tab := type_tab(); BEGIN -- 多筆給值 obj_type_tab := type_tab ( type_obj ( 37, 'col2_val1'), type_obj ( 3, 'col2_val2'), type_obj (254, 'col2_val3')); -- 逐筆給值 obj_type_tab.EXTEND; obj_type_tab(obj_type_tab.LAST) := type_obj( 12, 'col_2_val'); /** 要逐筆給或一次給多筆就純粹看使用時機與方便性. 舉例來說, 已經有確切可知的數筆資料時, 就可以用多筆給的方式來定義使用. 但是, 如果資料來源是取自其他媒介, 比方說 Cursor, 可能就需要跑 Loop 去逐筆取值與給值了. */ /** 再來, 可以把已經存放好資料的 obj_type_tab, 像下面這種應用方式去取回資料. 當然, 舉一反三, 它可以用這樣子的 SELECT 方式轉化成 Reference Cursor 及其他相關應用. */ FOR rec IN (SELECT col1, col2 FROM TABLE(CAST(obj_type_tab AS TYPE_TAB))) LOOP DBMS_OUTPUT.put_line(' rec.col1 = ' || rec.col1 || '; rec.col2 = ' || rec.col2); END LOOP; /** 輸出結果: rec.col1 = 37; rec.col2 = col2_val1 rec.col1 = 3; rec.col2 = col2_val2 rec.col1 = 254; rec.col2 = col2_val3 rec.col1 = 12; rec.col2 = col_2_val */ END; /
Oracle Oject 這樣簡單好用的實作,在我日常的 PL/SQL 程式設計中,是蠻大量被我所採用的。
尤其是拿來做資料中介的時候,資料來源可能好幾種好幾個,但是統一用一個物件(規格)來裝乘後,在後面再統一對資料加工處理,十分便利!
2 回應 :
請問在 obj_type_tab type_tab := type_tab();的時候,不已經宣告為type_tab了?
那為什麼在CAST(obj_type_tab AS TYPE_TAB);還需要轉換?
Hi Hao,
想把 obj_type_tab 的物件/Array 當成一般 table 的概念拿來 SELECT FROM 的話,TABLE(CAST(ARRAY)) 是連著使用的,也得這麼用才 work,詳情再麻煩參閱Google 或 Oracle Document 嚕~
張貼留言
讓阿布知道你對這篇文章的想法吧!