三種集合比較
元素下標
個數限制
初始化表資料列
索引表(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
元素下標可以負值,元素大小個數沒有限制
set serveroutput on;
declare
type ename_table_type is table of emp.ename%type index by binary_integer;
ename_table ename_table_type;
begin
select ename into ename_table(-1) from emp where empno = 7788;
dbms_output.put_line('雇員名:' || ename_table(-1));
end;
/
雇員名:scott
pl/sql procedure successfully completed
2.巢狀表
type type_name is table of element_type;
元素下標從1開始,元素個數沒有限制,陣列元素值可以稀疏
使用巢狀表元素時,必須首先使用其構造方法初始化巢狀表
set serveroutput on;
declare
type ename_table_type is table of emp.ename%type;
ename_table ename_table_type;
begin
ename_table:=ename_table_type('a','a');
select ename into ename_table(2) from emp where empno = 7788;
dbms_output.put_line('雇員名:' || ename_table(2));
end;
/雇員名:scott
pl/sql procedure successfully completed
巢狀表還可以作為表列的資料型別使用
create type phone_type is table of varchar2(20);
/create table employee(
id number(4),name varchar2(10),sal number(6,2) ,phone phone_type
)nested table phone store as phone_table;
/--insert
insert into employee
values
(1, 'scott', 800, phone_type('123456', '789012'));
commit;
--select
declare
phone_table phone_type;
begin
select phone into phone_table from employee where id=1;
for i in 1..phone_table.count loop
dbms_output.put_line('**號碼:'||phone_table(i));
end loop;
end;
/**號碼:123456
**號碼:789012
pl/sql procedure successfully completed
--update
declare
phone_table phone_type:=phone_type('11','22','33');
begin
update employee set phone=phone_table where id=1;
commit;
end;
/
3.變長陣列varray
type type_name is varray(size_limit) of element_type[not null];
size_limit 指定varray元素的最大個數
元素下標從1開始,最大元素有限制,可以當作表資料列
使用前,必須要使用構造方法初始化varray元素
declare
type ename_table_type is varray(10) of emp.ename%type;--元素最大個數定義後不可改變
ename_table ename_table_type := ename_table_type('a','b');--初始化兩個元素,可以通過ename_table.extend方法新增元素,預設為null,不能超過最大個數
begin
select ename into ename_table(1) from emp where empno=7788; --下標從1開始,沒有初始的不能直接使用,如ename_table(3)錯
dbms_output.put_line(ename_table(1));
end;
/scott
pl/sql procedure successfully completed
在表列中使用varray
create type phone_type is varray(10) of varchar2(20);
/create table employee(
id number(4),name varchar2(10),sal number(6,2),phone phone_type);/
--操作跟巢狀表列一樣,元素個數有限制
PL SQL入門系列 集合之 巢狀表
本文繼續向你介紹集合中的巢狀表,巢狀表類似平時所見的資料庫表,巢狀表可以儲存在資料庫中.一.定義語法為 type table name is table of table type not null 二.示例 sql 自定義型別testobject create orreplace type tes...
線性表結構 陣列 雜湊表與可變長度陣列
前言 陣列 array 是一種線性表資料結構,它用一組連續的記憶體空間,來儲存一組具有相同型別的資料。如果你學習過 c 語言,應該對這段定義很熟悉,但是在 php 這種動態語言中,因為陣列底層是通過雜湊表 後面我們會介紹這個資料結構 實現的,所以功能異常強大,這段常規的陣列定義在 php 中並不成立...
定義巢狀表
巢狀表是對索引表的擴充套件,與索引表最大的不同在於巢狀表可以儲存到oracle資料庫表中,而索引表僅僅是記憶體表。而且,巢狀表必須使用其構造方法對巢狀表進行初始化。巢狀表 沒有index by子句,這個與索引表直接最明顯的區別,因為巢狀表必須用有序的關鍵字建立,而且關鍵字不能為負數。索引表7369 ...