集合 索引表,巢狀表,變長陣列

2021-08-27 06:57:47 字數 3335 閱讀 6557

三種集合比較

元素下標

個數限制

初始化表資料列

索引表(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 ...