Oracle異常[ORA-22908:NULL表值的參考]問題的解析及解決方案

來源:互聯網
上載者:User

情境如下:

--建立類型(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 對象。

完畢!

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.