2008-06-04

使用 Oracle Object Types 實作中介暫存 (Keep Temporary Data via Object Types)

阿布洛格 Oracle簡單來說,Oracle Object Types 就是 Oracle 以 TYPE 的方式來實現物件(Objects)的方法,宣告/定義的方法,類似於 Package。Object Type 的宣告/定義中包含了它的 Attributes/Properties 與 Methods,也就是 Member Functions/Procedures。

本篇來介紹利用 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 嚕~

張貼留言

讓阿布知道你對這篇文章的想法吧!