Oracle 集合類型
集合類型
1. 使用條件:
a. 單行單列的數據,使用標量變量 。
b. 單行多列數據,使用記錄 [ 詳細講解請見: 點擊打開鏈接 ]
c. 單列多行數據,使用集合
*集合:類似於編程語言中數組也就是。pl/sql集合類型包括關聯數組Associative array(索引表 pl/sql table)、嵌套表(Nested Table)、變長數組(VARRAY)。
2. 三種集合類型區別:
Nested table與VARRY既可以被用於PL/SQL,也可以被直接用於數據庫中,但是Associative array不行,也就是說,Associative array是不能通過CREATE TYPE語句進行單獨創建,只能在PL/SQL塊(或Package)中進行定義並使用(即適用範圍是PL/SQL Block級別),而Nested table與VARRAY則可以使用CREATE TYPE進行創建(即適用範圍是Schema級別),它們還可以直接作為數據庫表中列的類型。
3. 集合的方法:
exists(index) 索引處的元素是否存在
count 當前集合中的元素總個數
limit 集合元素索引的最大值
索引表和嵌套表是不限個數的,所以返回null,變長數組返回定義時的最大索引
first 返回集合第一個元素索引
last 返回集合最後一個元素索引
prior 當前元素的前一個
next 當前元素的後一個
extend 擴展集合的容量,增加元素 只是用於嵌套表和varry類型
x.extend 增加一個null元素
x.extend(n) 增加n個null元素
x.extend(n,i) 增加n個元素,元素值與第i個元素相同
trim 從集合的尾部刪除元素 只用於NEST TABLE和VARRY類型
trim 從集合尾部刪除一個元素
trim(n) 從集合尾部刪除n個元素
delete 按索引刪除集合元素
delete 刪除所有
delete(index) 刪除第index個
delete(a,b) 刪除a--b之間的所有元素
4. 集合類型的聲明與初始化:
1)關聯數組:
a. 下標無限制,可以為負數
b. 元素個數無限制
c. 定義
TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY key_type;
type_name:用戶自定義數據類型的名字
element_type:索引表中元素類型
key_type:索引表元素下標的數據類型(BINARY_INTEGER,PLS_INTEGER,VARCHAR2)
d. 例1:
[sql] view plain copy
- declare
- type index_tab_type is table of varchar2(30) index by BINARY_INTEGER;
- v_table index_tab_type;
- begin
- v_table(-1) :=‘hello‘;--設定下標為-1的元素的值
- v_table(1) :=‘,‘;
- dbms_output.put_line(v_table(-1)||‘-‘||v_table(1));
- dbms_output.put_line(‘元素個數:‘||v_table.count);
- v_table(5) :=‘world‘;
- dbms_output.put_line(‘元素個數:‘||v_table.count);
- dbms_output.put_line(‘第一個元素‘||v_table.first);
- dbms_output.put_line(‘最後一個元素‘||v_table.last);
- end;
- /
[sql] view plain copy
- hello-,
- 元素個數:2
- 元素個數:3
- 第一個元素-1
- 最後一個元素5
- PL/SQL 過程已成功完成。
e.例2:使用varchar2作為索引元素類型 ,其實也就和java中的map一樣了 key-value(鍵值對)形式存儲
[sql] view plain copy
- declare
- type index_tab_type is table of varchar2(30) index by varchar2(30);
- v_table index_tab_type;
- v_record emp%rowtype;
- begin
- --emp表中查詢3條記錄,以name-job的形式存儲到索引表中
- select * into v_record from emp where emp.empno=7788;
- v_table(v_record.ename):= v_record.job;
- select * into v_record from emp where emp.empno=7844;
- v_table(v_record.ename):= v_record.job;
- select * into v_record from emp where emp.empno=7900;
- v_table(v_record.ename):= v_record.job;
- dbms_output.put_line(v_table.count);--3
- dbms_output.put_line(v_table(v_record.ename));--CLERK
- end;
- /
[sql] view plain copy
- 3
- CLERK
- PL/SQL 過程已成功完成。
2)嵌套表 Nested Table
a. 下標從1開始,元素個數滅有限制(*使用時必須先初始化,用extend屬性可以擴展元素個數)
b. 可以作為表定義數據類型,但是前提是要先create 創造嵌套表類型,這就可以實現1對多了定義
TYPE type_name IS TABLE OF element_type;
c. 和索引表的區別也就是看看有無index by語句,嵌套表的索引固定是int型的 .
d.例1:
[sql] view plain copy
- declare
- type nest_table_type is table of emp.ename%type;
- v_nest_tab nest_table_type;
- begin
- v_nest_tab :=nest_table_type(‘x‘);--初始化 必須! 語句 type_name(...)
- select ename into v_nest_tab(1) from emp where empno=7788;
- dbms_output.put_line(v_nest_tab(1));
- end;
- SCOTT
- PL/SQL 過程已成功完成。
e.例2:在表列中使用嵌套表 嵌套表類型的列是單獨一個表存儲,先創建一個這樣的類型才能使用
[sql] view plain copy
- create type nest_tab_type is table of varchar2(30);
- create table test_nest_tab(
- id int,
- vals nest_tab_type --使用
- ) nested table vals store as nest_tab;--vals字段用嵌套表存儲,表明nest_tab
- --上面語句執行完之後,在生成TEST_NEST_TAB的同時會生出一個關聯表NEST_TAB用來存儲關聯表的數據
- --插入數據
- insert into test_nest_tab values(1,nest_tab_type(‘one‘,‘two‘,‘three‘,‘four‘));
- --查詢數據
- declare
- v_id int;
- v_tab nest_tab_type;
- begin
- select * into v_id,v_tab from test_nest_tab where id=1;
- dbms_output.put_line(v_id);
- for i in 1..v_tab.count loop
- dbms_output.put_line(v_tab(i));
- end loop;
- end;
- 1
- one
- two
- three
- four
- PL/SQL 過程已成功完成。
3)Varry 可變數組
a. 定義
TYPE type_name IS VARRAY(size_limit) OF element_type[NOT NULL];
b. 這個就和java中的數組差不多了,下標from 1 ,定義時先指定最大元素個數,也和varchar2(size)這種一樣。
c. 使用時也必須先用構造方法初始化 ,可以作為表列類型
d. 例1:
- declare
- type varr is VARRAY(10) of int;
- v_varr varr :=varr();
- begin
- --dbms_output.put_line(varr.count);
- for i in 1..5 loop
- v_varr.extend;
- v_varr(i) :=i*i;
- end loop;
- for i in 1..5 loop
- dbms_output.put_line(v_varr(i));
- end loop;
- end;
- /
- 1
- 4
- 9
- 16
- 25
- PL/SQL 過程已成功完成。
e.例2:可變數組作為表列類型 可變數組是存儲在表內部的,不同於嵌套表
[sql] view plain copy
- create type varr_type is varray(10) of varchar2(30);--先創建類型
- create table test_varray(
- id int,
- name varchar2(30),
- params varr_type --param是使用可變數組類型
- );
- --插入數據
- insert into test_varray values(1,‘bird‘,varr_type(‘a‘,‘b‘,‘c‘));
- --查詢數據
- declare
- v_varr varr_type;
- v_name test_varray.name%type;
- begin
- select name,params into v_name,v_varr from test_varray where id=1;
- for i in 1..v_varr.count loop
- dbms_output.put_line(v_varr(i));
- end loop;
- end;
[sql] view plain copy
- a
- b
- c
- PL/SQL 過程已成功完成。
5. 如何選擇適用的集合類型:
通常來說,對集合類型的第一選擇應該是Associative array,因為它不需要初始化或者EXTEND操作,並且是迄今為止最高效的集合類型。唯一不足的一點是它只能用於PL/SQL而不能直接用於數據庫。
如果你需要允許使用負數索引,應該選擇Associative array;
如果你需要使用10g,11g中的那些集合操作,應該選擇Nested table;
如果你需要限制集合元素的個數,應該選擇VARRAY。
Oracle 集合類型