1. 程式人生 > >Oracle複合型別 ORACLE 集合 變長陣列(可變陣列 varray) 關聯陣列 聯合陣列(索引表)巢狀表 記錄型別的巢狀表

Oracle複合型別 ORACLE 集合 變長陣列(可變陣列 varray) 關聯陣列 聯合陣列(索引表)巢狀表 記錄型別的巢狀表

ORACLE 集合(關聯陣列,巢狀表,VARRAY)

2014年10月25日 19:27:22 vampireslove 閱讀數:835 標籤: plsql 更多

個人分類: ORACLE

三種集合比較
  元素下標 個數限制 初始化 表資料列
索引表 (binary_integer、pls_integer、varchar2) 無限制 不需要 不可以
巢狀表 從1開始 無限制 需要 可以
陣列 從1開始 有最大個數 需要 可以

 

   

1.索引表

type type_name is table of element_type[not null] index by key_type;

type_name 自定義資料型別的名稱

is table .. index  表示索引表

element_type 索引表元素的資料型別

not null 表示不請允許引用null元素

key_type(binary_integer、pls_integer、varchar2) 索引表元素下標的資料型別,注意9i前只能用binary_integer、pls_integer

元素下標可以負值,元素大小個數沒有限制

  1. set serveroutput on;  
  2. declare  
  3.   type ename_table_type is table of emp.ename%type index by binary_integer;  
  4.   ename_table ename_table_type;  
  5. begin  
  6.   select ename into ename_table(-1) from emp where empno = 7788;  
  7.   dbms_output.put_line('僱員名:' || ename_table(-1));  
  8. end;  
  9. /  
  1. 僱員名:SCOTT  
  2.    
  3. PL/SQL procedure successfully completed  

 2.巢狀表

type type_name is table of element_type;

元素下標從1開始,元素個數沒有限制,陣列元素值可以稀疏

使用巢狀表元素時,必須首先使用其構造方法初始化巢狀表

  1. set serveroutput on;  
  2. declare  
  3.   type ename_table_type is table of emp.ename%type;  
  4.   ename_table ename_table_type;  
  5. begin  
  6.   ename_table:=ename_table_type('A','A');  
  7.   select ename into ename_table(2) from emp where empno = 7788;  
  8.   dbms_output.put_line('僱員名:' || ename_table(2));  
  9. end;  
  10. /  
  11. 僱員名:SCOTT  
  12.    
  13. PL/SQL procedure successfully completed  

巢狀表還可以作為表列的資料型別使用

  1. create type phone_type is table of varchar2(20);  
  2. /  
  3. create table employee(  
  4. id number(4),name varchar2(10),sal number(6,2) ,phone phone_type  
  5. )nested table phone store as phone_table;  
  6. /  
  7. --insert  
  8. insert into employee  
  9. values  
  10.   (1, 'scott', 800, phone_type('123456', '789012'));  
  11. commit;  
  12. --select  
  13. declare  
  14.   phone_table phone_type;  
  15. begin  
  16.   select phone into phone_table from employee where id=1;  
  17.   for i in 1..phone_table.count loop  
  18.     dbms_output.put_line('電話號碼:'||phone_table(i));  
  19.   end loop;  
  20. end;  
  21. /  
  22. 電話號碼:123456  
  23. 電話號碼:789012  
  24.    
  25. PL/SQL procedure successfully completed  
  26. --update  
  27. declare  
  28.   phone_table phone_type:=phone_type('11','22','33');  
  29. begin  
  30.   update employee set phone=phone_table where id=1;  
  31.   commit;  
  32. end;  
  33. /  


3.變長陣列varray

type type_name is varray(size_limit) of element_type[not null];

size_limit 指定varray元素的最大個數

元素下標從1開始,最大元素有限制,可以當作表資料列

使用前,必須要使用構造方法初始化varray元素

  1. declare  
  2.   type ename_table_type is varray(10) of emp.ename%type;--元素最大個數定義後不可改變  
  3.   ename_table ename_table_type := ename_table_type('A','B');--初始化兩個元素,可以通過ename_table.extend方法新增元素,預設為null,不能超過最大個數  
  4. begin  
  5.   select ename into ename_table(1) from emp where empno=7788; --下標從1開始,沒有初始的不能直接使用,如ename_table(3)錯  
  6.   dbms_output.put_line(ename_table(1));  
  7. end;  
  8. /  
  9. SCOTT  
  10. PL/SQL procedure successfully completed  


在表列中使用varray

  1. create type phone_type is varray(10) of varchar2(20);  
  2. /  
  3. create table employee(  
  4. id number(4),name varchar2(10),sal number(6,2),phone phone_type  
  5. );  
  6. /  
  7. --操作跟巢狀表列一樣,元素個數有限制  
  8.  

 

https://blog.csdn.net/VampiresLove/article/details/40455505

 

 

 

 


Oracle複合型別:巢狀表、可變陣列與索引表

2017年02月24日 11:04:13  閱讀數:567

一、 在pl/sql中使用巢狀表和可變陣列

1、在pl/sql中使用巢狀表

在PL/SQL中使用巢狀表,此時巢狀表就相當於其他語言中的陣列。

①、示例:

<span style="color:#000000"><code><span style="color:#000088 !important">set</span> SERVEROUTPUT <span style="color:#000088 !important">ON</span>
<span style="color:#000088 !important">DECLARE</span>
      --下面這句是巢狀表宣告的
TYPE ename_array_type <span style="color:#000088 !important">is</span> <span style="color:#000088 !important">table</span> <span style="color:#000088 !important">of</span> emp.ename%TYPE ;
<span style="color:#880000 !important"><em>--定義一個遊標</em></span>
CURSOR ename_cursor is <span style="color:#000088 !important">select</span> ename <span style="color:#000088 !important">from</span> emp <span style="color:#000088 !important">where</span> job=<span style="color:#009900 !important">'CLERK'</span>;
<span style="color:#880000 !important"><em>--初始化巢狀表,此時巢狀表為空</em></span>
ename_arrayename_array_type:=ename_array_type();
i number:=0;
<span style="color:#000088 !important">BEGIN</span>
forename <span style="color:#000088 !important">in</span> ename_cursor
loop
i:=i+<span style="color:#006666 !important">1</span>;
<span style="color:#880000 !important"><em>--執行extend函式,為陣列增加一個null元素</em></span>
ename_array.EXTEND;
ename_array(i):=ename.ename;
    DBMS_OUTPUT.PUT_LINE(ename.ename);    
<span style="color:#000088 !important">end</span> loop;
<span style="color:#880000 !important"><em>--巢狀表下標是從1開始的,而不是0</em></span>
DBMS_OUTPUT.PUT_LINE('巢狀表:'||ename_array(1)||'  '|| ename_array(2));
<span style="color:#000088 !important">END</span>;
/</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

②、巢狀表宣告:

TYPE type_name is table of 表元素型別。例如:

<span style="color:#000000"><code><span style="color:#000088 !important">TYPE</span> ename_array_type <span style="color:#000088 !important">is</span> table <span style="color:#000088 !important">of</span> emp.ename%<span style="color:#000088 !important">TYPE</span> ;</code></span>
  • 1

③、巢狀表初始化:

巢狀表必須初始化後才能使用,初始化方式有兩種, 
一種是初始化為空,例如上面例子中

<span style="color:#000000"><code>ename_arrayename_array_<span style="color:#4f4f4f !important">type</span>:=ename_array_<span style="color:#4f4f4f !important">type</span>();</code></span>
  • 1

由於ename_array被初始化為空,所以如果需要往裡面放資料,就 
需要為其增加一個元素,否則將會報錯。EXTEND就是用來為陣列增加元素的,例如上面例子中: 
ename_array.EXTEND;

另一種是初始化時直接為陣列分配元素, 
如:ename_array:=ename_array_type(‘草泥馬’,’草泥馬’); 
此時ename_array(1)和ename_array(2)的值為草泥馬。這時候也可以直接為ename_array(1)和ename_array(2)賦值,如

<span style="color:#000000"><code>ename_array(<span style="color:#006666 !important">1</span>):=<span style="color:#009900 !important">'羊駝'</span>;
ename_array(<span style="color:#006666 !important">2</span>):=<span style="color:#009900 !important">'紅色羊駝'</span>;</code></span>
  • 1
  • 2

但是如果想為第三個元素賦值,需要先執行:ename_array.EXTEND。 
因為在初始化的時候,只為陣列分配了兩個元素,所以想給第三 
個元素賦值就必須先為陣列分配一個元素。

2、在pl/sql中使用可變陣列

①、示例:

<span style="color:#000000"><code><span style="color:#000088 !important">set</span> SERVEROUTPUT <span style="color:#000088 !important">ON</span>
<span style="color:#000088 !important">DECLARE</span>
--這個例子跟上面基本一樣,只是下面這句原本<span style="color:#000088 !important">is</span> <span style="color:#000088 !important">table</span>變成<span style="color:#000088 !important">is</span> varray(<span style="color:#006666 !important">5</span>)
TYPE ename_array_type <span style="color:#000088 !important">is</span> VARRAY(<span style="color:#006666 !important">4</span>) <span style="color:#000088 !important">of</span> emp.ename%TYPE ;
CURSOR ename_cursor is <span style="color:#000088 !important">select</span> ename <span style="color:#000088 !important">from</span> emp <span style="color:#000088 !important">where</span> job=<span style="color:#009900 !important">'CLERK'</span>;
ename_arrayename_array_type:=ename_array_type();
i number:=0;
<span style="color:#000088 !important">BEGIN</span>
forename <span style="color:#000088 !important">in</span> ename_cursor
loop
i:=i+<span style="color:#006666 !important">1</span>;
ename_array.EXTEND;
ename_array(i):=ename.ename;
DBMS_OUTPUT.PUT_LINE(ename.ename);    
<span style="color:#000088 !important">end</span> loop;
<span style="color:#880000 !important"><em>--下標也是從1開始的,而不是0</em></span>
DBMS_OUTPUT.PUT_LINE('巢狀表:'||ename_array(1)||'  '|| ename_array(2));
<span style="color:#000088 !important">END</span>;
/</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

②、可變陣列宣告

TYPE type_name is varray(陣列元素個數) of 表元素型別。例如:

<span style="color:#000000"><code><span style="color:#000088 !important">TYPE</span> ename_array_type <span style="color:#000088 !important">is</span> VARRAY(<span style="color:#006666 !important">4</span>) <span style="color:#000088 !important">of</span> emp.ename%<span style="color:#000088 !important">TYPE</span> ;</code></span>
  • 1

由於ename_array_type被宣告為VARRAY(4),這說明ename_array_type類 
型的陣列,最多隻能放4個元素。如果想為第5個元素賦值,將會報錯,即 
ename_array(5):=’hello’,此時將會報錯,即使在賦值前呼叫EXTEND: 
ename_array.EXTEND也依然會報錯。

3、在pl/sql中使用巢狀表和可用陣列的區別

在PL/SQL中使用巢狀表和可變陣列,基本是一樣的,唯一的不同是,可變數 
組的元素個數是有限制的,而巢狀表沒有元素個數的限制

二、 在表列中使用巢狀表和可變陣列(面向物件的SQL)

1、在表列中使用巢狀表

示例:

①、建立物件

<span style="color:#000000"><code><span style="color:#000088 !important">create</span> <span style="color:#000088 !important">or</span> <span style="color:#000088 !important">replace</span> TYPE comm_info <span style="color:#000088 !important">AS</span> OBJECT ( /*此型別為通訊方式的集合*/
<span style="color:#000088 !important">no</span> <span style="color:#000088 !important">number</span>(<span style="color:#006666 !important">3</span>), /*通訊型別號*/
comm_type varchar2(<span style="color:#006666 !important">20</span>), /*通訊型別*/
comm_no varchar2(<span style="color:#006666 !important">30</span>)/*號碼*/
);</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5

②、建立巢狀表

<span style="color:#000000"><code><span style="color:#000088 !important">create</span> <span style="color:#000088 !important">or</span> <span style="color:#000088 !important">replace</span> TYPE comm_info_list <span style="color:#000088 !important">AS</span> <span style="color:#000088 !important">table</span> <span style="color:#000088 !important">OF</span> comm_info;</code></span>
  • 1

③、建立表

<span style="color:#000000"><code><span style="color:#000088 !important">create</span> <span style="color:#000088 !important">table</span> user_info(
user_id <span style="color:#000088 !important">number</span>(<span style="color:#006666 !important">6</span>), /*使用者ID號*/
user_name varchar2(<span style="color:#006666 !important">20</span>), /*使用者名稱稱*/
user_comm  comm_info_list /*與使用者聯絡的通訊方式*/
)--下面這句的意思是把user_comm的資料放到user_comm_table表中儲存
nested <span style="color:#000088 !important">table</span> user_comm store <span style="color:#000088 !important">as</span> user_comm_table;</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

執行命令後,你會發現你建立了兩張表,一張是user_info,一張是巢狀表 
user_comm_table

④、插入資料

<span style="color:#000000"><code><span style="color:#000088 !important">insert</span> <span style="color:#000088 !important">into</span> user_info
<span style="color:#000088 !important">values</span>(<span style="color:#006666 !important">1</span>,<span style="color:#009900 !important">'mary'</span>,comm_info_list(
    comm_info(<span style="color:#006666 !important">1</span>,<span style="color:#009900 !important">'手機'</span>,<span style="color:#009900 !important">'13651401919'</span>),
    comm_info(<span style="color:#006666 !important">2</span>,<span style="color:#009900 !important">'呼機'</span>,<span style="color:#009900 !important">'1281234567'</span>)
  )
);

<span style="color:#000088 !important">insert</span> <span style="color:#000088 !important">into</span> user_info
<span style="color:#000088 !important">values</span>(<span style="color:#006666 !important">2</span>,<span style="color:#009900 !important">'carl'</span>,comm_info_list(
    comm_info(<span style="color:#006666 !important">1</span>,<span style="color:#009900 !important">'手機'</span>,<span style="color:#009900 !important">'13901018888'</span>),
    comm_info(<span style="color:#006666 !important">2</span>,<span style="color:#009900 !important">'呼機'</span>,<span style="color:#009900 !important">'1281234567'</span>)
  )
);</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

⑤、查詢巢狀表

通過user_info查詢其巢狀表資訊,此時注意括號內的查詢,只能查詢一列,即可以select user_comm而不能select user_comm,user_name,並且只能返回一條記錄,否則會報錯

<span style="color:#000000"><code>selectcomm_type,comm_nofrom table(
<span style="color:#000088 !important">select</span> user_comm <span style="color:#000088 !important">from</span> user_info <span style="color:#000088 !important">where</span> user_id=<span style="color:#006666 !important">1</span>
);
執行結果如下:
COMM_TYPE            COMM_NO                      
<span style="color:#880000 !important"><em>-------------------- ------------------------------</em></span>
手機                 13651401919                   
呼機                 1281234567   </code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

如果不查詢具體的巢狀表資訊,則沒有隻能查詢一列並且只能返回一條記錄的限制,但是好像獲取的資訊不那麼有用:

<span style="color:#000000"><code><span style="color:#000088 !important">select</span> user_comm <span style="color:#000088 !important">from</span> user_info;
執行如下:

-------------------------------------------------------------------------------------------------------
SCOTT.COMM_INFO_LIST(
    SCOTT.COMM_INFO(<span style="color:#006666 !important">1</span>,<span style="color:#009900 !important">'手機'</span>,<span style="color:#009900 !important">'13651401919'</span>),
    SCOTT.COMM_INFO(<span style="color:#006666 !important">2</span>,<span style="color:#009900 !important">'呼機'</span>,<span style="color:#009900 !important">'1281234567'</span>)
) 
SCOTT.COMM_INFO_LIST(
    SCOTT.COMM_INFO(<span style="color:#006666 !important">1</span>,<span style="color:#009900 !important">'手機'</span>,<span style="color:#009900 !important">'13901018888'</span>),
    SCOTT.COMM_INFO(<span style="color:#006666 !important">2</span>,<span style="color:#009900 !important">'呼機'</span>,<span style="color:#009900 !important">'1281234567'</span>)
)    </code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2、在表列中使用可變陣列

示例:

①、建立物件

<span style="color:#000000"><code><span style="color:#000088 !important">create</span> <span style="color:#000088 !important">or</span> <span style="color:#000088 !important">replace</span> TYPE comm_info <span style="color:#000088 !important">AS</span> OBJECT ( /*此型別為通訊方式的集合*/
    <span style="color:#000088 !important">no</span> <span style="color:#000088 !important">number</span>(<span style="color:#006666 !important">3</span>), /*通訊型別號*/
    comm_type varchar2(<span style="color:#006666 !important">20</span>), /*通訊型別*/
    comm_no varchar2(<span style="color:#006666 !important">30</span>)/*號碼*/
);</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5

②、建立可變陣列

<span style="color:#000000"><code><span style="color:#000088 !important">create</span> <span style="color:#000088 !important">or</span> <span style="color:#000088 !important">replace</span> TYPE comm_info_list <span style="color:#000088 !important">AS</span> varray(<span style="color:#006666 !important">50</span>) <span style="color:#000088 !important">OF</span> comm_info;</code></span>
  • 1

③、建立表

<span style="color:#000000"><code><span style="color:#4f4f4f !important">create</span> table user_info(
    user_id <span style="color:#4f4f4f !important">number</span>(<span style="color:#006666 !important">6</span>), <span style="color:#880000 !important"><em>/*使用者ID號*/</em></span>
    user_name varchar2(<span style="color:#006666 !important">20</span>), <span style="color:#880000 !important"><em>/*使用者名稱稱*/</em></span>
    user_comm comm_info_list <span style="color:#880000 !important"><em>/*與使用者聯絡的通訊方式*/</em></span>
)</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5

至於資料插入,和查詢,就跟巢狀表的是一模一樣。

3、在表列中使用巢狀表和可變陣列的區別

第一個區別是:建立表的時候不一樣,巢狀表建立時需要加這句 
nested table user_comm store as user_comm_table,並且執行建立表語句後, 
會產生兩張表,其中一張是巢狀表,巢狀表型別的資訊就放在巢狀表裡。而 
可變陣列不需要加這句話,所以建立表的語句顯得比較簡單,而且執行建立 
後,只會建立一張表。

第二個區別: 
可變陣列是有元素個數的限制的,比如 
create or replace TYPE comm_info_list AS varray(50) OF comm_info; 
則comm_info_list型別的陣列最多隻能放50個元素,即插入的時候,

<span style="color:#000000"><code><span style="color:#000088 !important">insert</span> <span style="color:#000088 !important">into</span> user_info
    <span style="color:#000088 !important">values</span>(<span style="color:#006666 !important">1</span>,<span style="color:#009900 !important">'mary'</span>,comm_info_list(
    comm_info(<span style="color:#006666 !important">1</span>,<span style="color:#009900 !important">'手機'</span>,<span style="color:#009900 !important">'13651401919'</span>),
    comm_info(<span style="color:#006666 !important">2</span>,<span style="color:#009900 !important">'呼機'</span>,<span style="color:#009900 !important">'1281234567'</span>)
  )
);</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

括號內的comm_info最多隻能放50個,上面放了兩個,分別是 
comm_info(1,’手機’,’13651401919’)和 comm_info(2,’呼機’,’1281234567’) 
而巢狀表沒有這個限制。

三、 索引表(index by)

索引表只能用於PL/SQL中。在前面PL/SQL中使用巢狀表,其宣告是: 
TYPE ename_array_type is table of emp.ename%TYPE ; 
而把這個宣告改為index by就成了索引表,即: 
TYPE ename_array_type is table of emp.ename%TYPE index by binary_integer ; 
binary_integer後面也可以跟其他PL/SQL支援的型別,比如index by varchar2 
雖然索引表跟巢狀表很像,但是巢狀表像陣列,而索引表更像key-value對映的map 
而index by後面的就是key的資料型別。

1、索引表使用示例:

<span style="color:#000000"><code><span style="color:#000088 !important">set</span> SERVEROUTPUT <span style="color:#000088 !important">ON</span>
<span style="color:#000088 !important">DECLARE</span>
    TYPE ename_array_type <span style="color:#000088 !important">is</span> <span style="color:#000088 !important">table</span> <span style="color:#000088 !important">of</span> emp.ename%TYPE index <span style="color:#000088 !important">by</span> BINARY_INTEGER;
    CURSOR ename_cursor is <span style="color:#000088 !important">select</span> ename <span style="color:#000088 !important">from</span> emp <span style="color:#000088 !important">where</span> job=<span style="color:#009900 !important">'CLERK'</span>;
    ename_array ename_array_type;<span style="color:#880000 !important"><em>--這裡直接定義就行,初始化都不用了</em></span>
    i BINARY_INTEGER:=0;
<span style="color:#000088 !important">BEGIN</span>
   <span style="color:#000088 !important">for</span> ename <span style="color:#000088 !important">in</span> ename_cursor
    loop
       -- ename_array.EXTEND;這句被註釋起來了
        ename_array(i):=ename.ename;
        DBMS_OUTPUT.PUT_LINE(ename.ename);    
        i:=i+1;
    <span style="color:#000088 !important">end</span> loop;
<span style="color:#880000 !important"><em>--下標從0開始</em></span>
    DBMS_OUTPUT.PUT_LINE('巢狀表:'||ename_array(0)||'  '|| ename_array(1));
<span style="color:#000088 !important">end</span>;
/</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

可以看到使用在PL/SQL中使用索引表會比使用巢狀表和可變陣列簡單很多。

2、索引表作為map的使用示例

前面說索引表更像是map,為什麼這麼說,可以看下面的例子:

<span style="color:#000000"><code><span style="color:#000088 !important">set</span> SERVEROUTPUT <span style="color:#000088 !important">ON</span>
declare
    <span style="color:#000088 !important">type</span> map_type <span style="color:#000088 !important">is</span> table <span style="color:#000088 !important">of</span> number(<span style="color:#006666 !important">3</span>) <span style="color:#000088 !important">index</span> <span style="color:#000088 !important">by</span> varchar2(<span style="color:#006666 !important">3</span>);
    map_ map_type;  
    map_key varchar2(<span style="color:#006666 !important">3</span>);
<span style="color:#000088 !important">begin</span>
    map_ (<span style="color:#009900 !important">'a'</span>) := <span style="color:#006666 !important">10</span>;
    map_ (<span style="color:#009900 !important">'b'</span>) := <span style="color:#006666 !important">20</span>;  
    map_key :=map_ .first;
    <span style="color:#000088 !important">while</span>(map_key <span style="color:#000088 !important">is</span> <span style="color:#000088 !important">not</span> null) <span style="color:#000088 !important">loop</span>
        dbms_output.put_line(map_ (map_key));
        map_key:=map_ .next(map_key);
    <span style="color:#000088 !important">end</span> <span style="color:#000088 !important">loop</span>;
<span style="color:#000088 !important">end</span>;
/</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

四、 巢狀表,可變陣列與索引表的區別

巢狀表與可變陣列的區別是,巢狀表沒有元素個數的限制,而可變陣列有元素個數的限制。巢狀表和可變陣列與索引表的區別是,巢狀表和可變陣列可以用於非PL/SQL環境,而索引表只能用於PL/SQL中。

五、 相關函式

1、COUNT 返回集合中元素的個數

2、刪除集合元素DELETE,DELETE(x),DELETE(x,y),TRIM,TRIM(x) 
DELETE刪除集合中所有元素 
DELETE(x) 刪除元素下標為x的元素,如果x為null,則集合保持不變 對VARRAY 
非法 
DELETE(x,y) 刪除元素下標從X到Y的元素,如果X>Y集合保持不變 對VARRAY 
非法 
TRIM 從集合末端開始刪除一個元素 對index_by不合法 
TRIM(x) 從集合末端開始刪除x個元素 對index_by不合法

3、判斷元素是否存在EXIST(x) 
如果集合元素x已經初始化,則返回TRUE, 否則返回FALSE

4、為集合新增元素EXTEND,EXTEND(x),EXTEND(x,n) 
EXTEND 在集合末尾新增一個元素 對Index_by非法 
EXTEND(x) 在集合末尾新增x個元素 對Index_by非法 
EXTEND(x,n) 在集合末尾新增元素n的x個副本 對Index_by非法

5、返回集合元素下標FIRST、LAST、NEXT(x),PRIOR(x) 
FIRST 返回集合中的第一個元素的下標號,對於VARRAY集合始終返回1。 
LAST 返回集合中最後一個元素的下標號, 對於VARRAY返回值始終等於COUNT。 
NEXT(x) 返回在元素x之後及緊挨著它的元素的下標值,如果該元素是最後一 
個元素,則返回null。 
PRIOR(x) 返回集合中在元素x之前緊挨著它的元素的下標值,如果該元素是第 
一個元素,則返回null。

6、LIMIT 返回VARRY集合的最大的元素個數,對於巢狀表和Index_by集合無用。

 

https://blog.csdn.net/yu766588220/article/details/56834930

 

 

 

 

Oracle集合(聯合陣列(索引表),巢狀表,變長陣列,記錄型別的巢狀表)的初始化與賦值,以及它們的區別

2017年11月30日 22:17:01 eussi 閱讀數:444 標籤: oracle集合 更多

個人分類: ◆◇乀 ≡ oracle related

來源:https://www.2cto.com/database/201301/184529.html

Oracle集合(聯合陣列(索引表),巢狀表,變長陣列,記錄型別的巢狀表)的初始化與賦值,以及它們的區別



--其中巢狀表與變長陣列在賦值之前必須初始化,可以使用與集合型別同名的函式來進行初始化,
聯合陣列無需初始化  www.2cto.com  



--1.聯合陣列:

DECLARE  

  TYPE ind_tab_type IS TABLE OF VARCHAR2(2000)  

                    INDEX BY BINARY_INTEGER;  

  ind_tab           ind_tab_type;  

BEGIN  

  ind_tab(1) := 'lubinsu';--這裡的下標可以隨意指定,可以通過迴圈來獲取  

  ind_tab(2) := 'luzhou';  

  --dbms_output.put_line(ind_tab(0));  

  --dbms_output.put_line(ind_tab(1));  

  FOR i IN ind_tab.first..ind_tab.last LOOP  

    dbms_output.put_line('ind_tab(' || i || '):' || ind_tab(i));  

  END LOOP;  

END;  

/  



--2.巢狀表的初始化1

--巢狀表的下標預設為1開始,也可以自己指定任意值  www.2cto.com  

DECLARE  

  TYPE nest_tab_type IS TABLE OF VARCHAR2(2000) NOT NULL; --如果設定not null條件那麼在初始化的時候不可以設定null  

  nest_tab nest_tab_type := nest_tab_type('lubinsu', 'luzhou'); --初始化的時候只要在集合變數之後使用空的建構函式或者直接賦值即可  

BEGIN  

  FOR i IN nest_tab.first .. nest_tab.last LOOP  

    dbms_output.put_line('nest_tab(' || i || ') value is ' || nest_tab(i));  

  END LOOP;  

END;  

/  



--3.巢狀表和的初始化2

DECLARE  

  TYPE nest_tab_type IS TABLE OF VARCHAR2(2000) NOT NULL; --如果設定not null條件那麼在初始化的時候不可以設定null  

  nest_tab nest_tab_type := nest_tab_type(); --初始化的時候只要在集合變數之後使用空的建構函式或者直接賦值即可  

BEGIN  

  nest_tab.extend;  

  nest_tab(1) := 'lubinsu';  

  nest_tab.extend;  

  nest_tab(2) := 'luzhou';  

  FOR i IN nest_tab.first .. nest_tab.last LOOP  

    dbms_output.put_line('nest_tab(' || i || '):' || nest_tab(i));  

  END LOOP;  

END;  

/  

--如果設定not null條件那麼在初始化的時候不可以設定null,如:nest_tab(1) := null;否則出錯提示;  

ORA-06550: line 7, column 18:  

PLS-00382: expression is of wrong type  

ORA-06550: line 7, column 3:  

PL/SQL: Statement ignored  

--賦值的時候必須使用extend來擴充套件集合的容量否則會如下錯誤  

ERROR at line 1:    

ora-06533: subscript beyond count    

ora-06512: at line 6  

/  



--4.變長陣列類似於PL/SQL表,每個元素都被分配了一個連續的下標,從1開始

--4.變長陣列的初始化(與巢狀表的初始化方式一樣)

DECLARE  

  TYPE varray_tab_type IS VARRAY(10) OF VARCHAR2(2000);  

  varray_tab varray_tab_type :=  varray_tab_type('lubinsu', 'luzhou'); --初始化的時候只要在集合變數之後使用空的建構函式或者直接賦值即可  

BEGIN  

  varray_tab.extend;  

  varray_tab(3) := 'zengq';  

  varray_tab.extend;  

  varray_tab(4) := 'buwei';  

  FOR i IN varray_tab.first .. varray_tab.last LOOP  

    dbms_output.put_line('varray_tab(' || i || '):' || varray_tab(i));  

  END LOOP;  

END;  

/  



--5.集合與集合之間的賦值必須是相同的TYPE

DECLARE  

  TYPE type1 IS TABLE OF NUMBER(2);  

  TYPE type2 IS TABLE OF NUMBER(2);  

  type1_tab  type1 := type1(1, 2, 3);  

  type1_tab2 type1 := type1(4, 5, 6);  

  type2_tab  type2 := type2(3, 2, 1);  

BEGIN  

  type1_tab2 := type1_tab;  

  --type1_tab2 := type2_tab; 不可用  

  FOR i IN type1_tab2.first .. type1_tab2.last LOOP  

    dbms_output.put_line('type1_tab2(' || i || '):' || type1_tab2(i));  

  END LOOP;  

END;  

/  

--type1_tab2 := type2_tab;報錯  

ORA-06550: line 10, column 17:  

PLS-00382: expression is of wrong type  

ORA-06550: line 10, column 3:  

PL/SQL: Statement ignored  



RESULT:  

type1_tab2(1):1  

type1_tab2(2):2  

type1_tab2(3):3  

/  



--6.使用null值為集合賦值

DECLARE  

  TYPE type1 IS TABLE OF NUMBER(2);  

  type1_tab  type1 := type1();--已經初始化,不為空,雖然沒有賦值  

  type1_tab2 type1;--未初始化,為空  

BEGIN  

  IF type1_tab IS NOT NULL THEN  

    dbms_output.put_line('type1_tab is not null');  

  END IF;  



  --type1_tab := NULL;  

  --或者  

  type1_tab := type1_tab2;  



  IF type1_tab IS NULL THEN  

    dbms_output.put_line('type1_tab is null');  

  END IF;  

END;  

/  



--7.超出變長陣列長度的值將會被丟棄  www.2cto.com  

--8.記錄型別的巢狀表的初始化,賦值以及元素的引用

DECLARE  

  TYPE object_rec IS RECORD(  

    object_id   all_objects_loc.object_id%TYPE,  

    object_name all_objects_loc.object_name%TYPE,  

    object_type all_objects_loc.object_type%TYPE);  



  TYPE object_tab_type IS TABLE OF object_rec;  



  object_tab object_tab_type;  



  TYPE obj_cur_type IS REF CURSOR; --宣告遊標變數型別  

  obj_cur obj_cur_type;  

BEGIN  

  OPEN obj_cur FOR  

    SELECT a.object_id, a.object_name, a.object_type  

    FROM   all_objects_loc a  

    WHERE  rownum <= 10;  



  FETCH obj_cur BULK COLLECT  

    INTO object_tab;  

  CLOSE obj_cur;  

  FOR i IN 1 .. object_tab.count LOOP  

    dbms_output.put_line('object_tab(' || i || '):' || object_tab(i)  

                         .object_id || ',' || object_tab(i).object_name || ',' || object_tab(i)  

                         .object_type);  

  END LOOP;  

END;  

/  

https://blog.csdn.net/eussi/article/details/78681710