熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Oracle 數組的學習 小知識也要積累,養成好的學習態度

2022-06-13   來源: Oracle 
提叻一個代碼段要人幫助解釋一下
代碼段如下

  復制代碼 代碼如下:

  declare
type t_indexby is table of number
index by binary_integer;
type t_nesteed is table of number;
type t_varray is varray() of number;
v_indexby t_indexby;
v_nested t_nested;
v_varray t_varray;
begin
v_indexby():=;
v_indexby():=;
v_nested:=t_nested();
v_varray:=t_varray();
end;


一段很簡單的有關Oracle裡數組的sample代碼看著這段由代表性的代碼不由想起自己以前獨自摸索Oracle裡數組類型的那種不弄明白決不姑息的激情
這段代碼也還不錯通過簡單的實例就把主要的數組類型都羅列出來叻好的素材 不由又激發其我回答寫寫的欲望叻所以也不吝指力總結叻一番也順便填補一下我以前忘記歸納總結的空缺
這段代碼收羅叻Oracle裡數組的使用方式
index by table
nested table
varray 可變數組
這裡是Oracle文檔裡對這三種數組類型的介紹
An indexby table is the most flexible and generally bestperforming collection type for use inside PL/SQL programs
A nested table is appropriate for large collections that an application stores and retrieves in portions
A VARRAY is appropriate for small collections that the application stores and retrieves in their entirety
這裡是對通過應用性上的對他們三者的概括好像沒有給我們太直接的影響還是讓我們先對其了解這裡的應用性上體現的東西也就好理解叻
sample code中以對三種不同的type定義的方式開始
type t_indexby is table of number index by binary_integer; indexed by table
type t_nesteed is table of number; nested table
type t_varray is varray() of number; varray
上兩句和後一句有明顯的不同沒有定義長度而varray定義叻長度varray有長度限制訪問是超過長度的話將提示越界的錯誤而indexed by table和nested table顯然沒有這個限制不過對於indexed by table和nested table他們兩個也是有區別的
上面sample的後部分就描述了兩者的區別對於index by table來說這裡已經指定了index的類型直接用index的類型的變量做索引來標識著每個元素而不需要擴展大小這個功能有些像java裡的map(有區別就是這裡key是有順序的)而nested table能則完全和list一樣
我們通過sample來看看
v_indexby():=;
v_indexby():=;
這裡分別在v_indexby裡加了兩個元素 注意這裡的()()和後面nested table已經varray裡的不一樣
這裡我把它理解為key而不是元素的序號所以index by這裡的下標不一定是連續的可以跳躍而另兩者就不同另外兩個是名符其實的數組對象了下標表示的就是元素的序號和java不同開始
v_nested:=t_nested();
v_varray:=t_varray();
這裡分別是定義了個和個元素的數組
v_nested:=t_nested(); 個元素值為
v_varray:=t_varray(); 個元素 值為
強調一下對於nested table來說需要使用extend來擴展數組添加元素的時候而varrray不需要(已經知道長度了定義的時候)
v_nestedextend; v_nested(unt) := ;
大家在這裡基本上已經可以看到他們的區別了index by table在結構上和nested table以及Varray有著本質的不同那麼勢必使用的時候肯定不同了由於index by table下標並不是序號所以我們只能通過key來訪問了這裡和java倒是一樣的
上面的例子裡沒有提供而且我在網上找了很多的介紹都沒有詳細給出過index by table的遍歷的方法的這裡我自己寫了一個sample供大家學習參考

  復制代碼 代碼如下:

  declare
type t_array is table of varchar() index by binary_integer;
v_array t_array;
v_idx number;
begin
v_array() := a;
v_array() := a;
v_array() := a; 是key所以可以為負數
v_idx := v_arrayfirst;
loop
exit when v_idx is null;
dbms_outputput_line(v_array(v_idx));
v_idx := v_arraynext(v_idx);
end loop;
end;
/


結果
a
a
a
注意這裡的方法first返回第一個keynext()返回下一個key
對於nested table來說下標是序號是不能為負數的

  復制代碼 代碼如下:

  declare
type t_array is table of varchar();
v_array t_array;
v_idx varchar();
begin
v_array := t_array(); 一定要先初始話
v_arrayextend; 擴展數組
v_array() := a;
v_arrayextend;
v_array() := a;
v_arrayextend;
v_array() := a; v_array() := a; 將出錯
v_idx := v_arrayfirst;
loop
dbms_outputput(v_idx|| );
exit when v_idx is null;
dbms_outputput_line(v_array(v_idx));
v_idx := v_arraynext(v_idx);
end loop;
end;
/


看看nested tabled的訪問也可以和上面一樣當然也可以用更簡單的方法來遍歷

  復制代碼 代碼如下:

  for i in unt loop
dbms_outputput(i|| );
dbms_outputput_line(v_array(i));
end loop;


其實可以看到和java裡的list的訪問很類似了
這個知識點很多人都寫過sample內容不是很多但是小知識也要積累勸學裡 不積跬步無以至千裡不積小流無以成江海學習固然如此而Oracle的學習更應如此 以前的庸惰我今天還是還叻 走江湖的遲早要還的
Oracle對Index by 數組的官方介紹

From:http://tw.wingwit.com/Article/program/Oracle/201404/30541.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.