情境如下:
--建立類型(type)create or replace type list_obj is table of number;--建立表結構create table test( name varchar2(30) primary key check(regexp_like(name,'^([a-z]|[0-9]|_)+$')), id number not null, version_list list_obj) nested table version_list store as version_list;
情境說明:類型 list_obj 相當一個元素為數位列表。表 test 有三個欄位,欄位 name 為主鍵限制只能使用小寫字母、數字、底線組成的字串;欄位 id 是數字,限制為非空;欄位 version_list 是類型為 list_obj 的巢狀表格。
操作1:
--插入一條記錄insert into test(name, id) values('mophee', 1);
查詢結果如下:
目前 version_list 為空白(注意,是 null),現在我們需要開始維護該欄位:往 name='mophee' 的記錄插入一個版本號碼20130403112459。語句如下:
--插入一個版本號碼insert into table(select version_list from test where name='mophee') values(20130403112459);
執行以上 insert 語句就報錯了!
原因是什嗎?version_list 欄位目前是 NULL,以上insert語句試圖做這個動作:table(NULL),也就是要將NULL對象化成一個表。這事有違常理,ORACLE幹不了!
那麼怎麼解決呢?version_list 欄位之所以為NULL,是因為我們根本沒對它進行初始化。那麼,在insert之前先對其初始化不久能解決問題了嗎?
方法一:在往 test 表 insert 的時候使用如下語句
--插入一條記錄insert into test(name, id, version_list) values('mophee', 1, list_obj());
方法二:在往 version_list 插入版本號碼之前先對其進行初始化
--將 version_list 欄位初始化為 list_obj 對象update test set version_list=list_obj() where name='mophee';
看:
這是在 pl/sql developer下的查詢輸出,注意 version_list 列資料儲存格的背景色(與上方圖片對比一下)已經不是淡黃色(此時欄位值為null)!雖然查看 version_list 欄位的內部內容依舊是沒有一條記錄,但是意義上是不一樣的——初始化之前是 null,初始化之後才是 list_obj 對象。
完畢!