一、pl/sql集合
為了處理單列多行,可以使用pl/sql集合進行處理。pl/sql集合類似於高階語言陣列的一種復合資料型別、集合型別包括索引表(pl/sql表)、巢狀表(netsed table)、變長陣列(varray)等三種型別。
1、索引表
索引表也成為pl/sql表,它是oracle早期用來處理pl/sql陣列的資料型別,注意,高階語言陣列的元素個數是有限制的,並且下標不能為負數,而索引表的元素個數沒有限制,並且下標可以為負數,注意索引表只能作為pl/sql復合資料型別使用,而不能作為表列的資料型別使用,定義索引表的語法如下:
type type_name is table of element_name
[not null]index by key_type;
identifier type_name;
如圖所示:type_name用於指定自定義資料型別的名稱(is table..index表示索引表),element_type用於指定索引表元素的資料型別,not null表示不允許應用null元素,key_type用於指定索引表元素下標的資料型別(binary_integer、pls_integer或varchar2);identifier用於定義索引表變數,注意oracle9i之前,索引表下標只允許用的資料型別binary_integer和pls_integer;而從oracle9i開始不僅可以為binary_integer和pls_integer,而且還可以為varchar2型別,
示例
一、在索引表中使用binary_integer和pls_integer
declaretype temp_table_type is table of cip_temps.name%type
index by binary_integer;
temp_table temp_table_type;
begin
select name into temp_table(-1) from cip_temps where id=6;
dbms_output.put_line(temp_table(-1));
end;
示例
二、在索引中使用varchar2
declaretype temp_table_type is table of number
index by varchar2(10);
temp_table temp_table_type;
begin
temp_table('北京'):=1;
temp_table('上海'):=2;
temp_table('河北'):=3;
dbms_output.put_line(temp_table.first);
dbms_output.put_line(temp_table.last);
end;
2、巢狀表
巢狀表也是一種用來處理pl/sql陣列的資料型別,高階語言陣列元素下標是用0或1開始,並且元素個數有界限,而巢狀表下標是從1開始的,並且元素個數沒有界限,另外高階語言陣列元素值是順序的,而巢狀表的陣列元素值是可以稀疏的,注意索引表型別不能做為表列的資料型別使用,但巢狀表型別可以做為表列的資料型別使用, 語法如下:
type type_name is table of element_type;
identifier type_name;如上所示,type_name用於指定巢狀表名稱,element_type用於指定巢狀表元素的資料型別,identifier用於定義巢狀表變數,注意:當使用巢狀表時,必須首先使用構造方法初始化巢狀表,示例如下:
delcare
type temp_table_type is table of emp.name%type;
temp_table temp_table_type:=temp_table_type('a','a');
使用巢狀表的說明方法
(1)在pl/sql快中使用巢狀表
必須要初始化巢狀表變數,然後才能在pl/sql塊中引用巢狀表,示例如下:
declaretype temp_table_type is table of cip_temps.name%type;
temp_table temp_table_type;
begin
temp_table:=temp_table_type('mary','123','123');
select name into temp_table(3) from cip_temps where id=6;
dbms_output.put_line(temp_table(3));
end;
(2)、在表列中使用巢狀表
巢狀表型別不僅可以再pl/sql塊中直接引用,也可以作為表列的資料型別使用,但如果在表列中使用巢狀表型別,必須首先使用create type命令穿件型別,注意,當使用巢狀表型別做為表列的資料型別,必須要為巢狀表列指定專門的儲存表,示例如下:
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;
示例
一、在pl/sql塊中巢狀表列插入資料
當定義巢狀表型別時,oracle自動為該型別生成相應的構造方法,當為巢狀表列插入資料時,需要使用巢狀表的構造方法,示例如下:
declarebegin
insert into employee values(1,'1111',5,phone_type('aaaa','3333333'));
end;
示例
二、在pl/sql塊中檢索巢狀表列的資料
當在在pl/sql塊中檢索巢狀表列的資料時,需要定義巢狀表型別的變數接收其資料,示例如下:
declaretemp_phone phone_type;
begin
select phone into temp_phone from employee where id=1;
for i in 1..temp_phone.count loop
dbms_output.put_line(temp_phone(i));
end loop;
end;
示例
三、在pl/sql塊中更新巢狀表列的資料
當在pl/sql塊中更新巢狀表列的資料時,首先需要定義巢狀表變數,並使用構造方法初始化該變數,然後才能執行部門使用update語句更新,示例如下:
declaretemp_phone phone_type:=phone_type('aa','bb');
begin
update employee set phone=temp_phone where id=1;
end;
3、變長陣列
其元素下標以1開始,並且元素下標最大是有限制的,定義array語法如下:
type type_name is vrray(limit_size) of element_type[not null];
identifier type_name;
如上所示:type_name型別名稱,limit_size用於指定下標最大值,element_type用於指定元素資料型別,identifer用於定義vrray變數,當使用vrray元素時,必須使用構造方法初始化array元素,示例如下:
declare
type temp_varray_type is vrray(20) of temp.name%type;
temp_varray temp_varray_type:=temp_varray_type('a');關於用法同巢狀表
二、pl/sql記錄表
pl/sql變數用於處理單行單列資料,pl/sql記錄用於處理單行多列資料,pl/sql集合用於處理多列單行資料,為了在pl/sql快中處理多行多列資料,開發人員可以使用pl/sql記錄表處理多行多列資料,示例如下:
declare
type temp_table_type is table of cip_temps%rowtype
index by binary_integer;
temp_table temp_table_type;
begin
select * into temp_table(1) from cip_temps where id=6;
for i in 1..temp_table.count loop
dbms_output.put_line(temp_table(i).name||':'||temp_table(i).address);
end loop;
end;
oracle復合資料型別
type用於定於不確定的資料型別 declare v fd change left ekp change.fd change left type v id是表name的id的資料型別 v fd change total ekp change.fd change total type begin se...
復合資料型別
復合資料型別 作用 封裝資料 多種不同型別資料存放在一起 應存放在全域性,在訪問結構體中的變數時,應用stu.id stu.name 初始化的方式 在對陣列進行初始化時 strcpy stu.name,zhangsan 在對指標進行初始化時 char name 對name進行初始化 stu.name...
復合資料型別
一 struct結構體 封裝資料 存放多種不同的資料型別 struct的宣告放在全域性區 1.宣告和定義 宣告 struct student struct student stu array 3 int i for i 0 i 3 i for i 0 i 3 i include struct stu...