Oracle 原理: 集合数组,集合属性,is table of 用法,bulk collect into,IS RECORD用法
數(shù)組分為固定長(zhǎng)度數(shù)組和可變長(zhǎng)度數(shù)組,都是集合,且數(shù)組的起始下標(biāo)是從1開(kāi)始的,這和其他高級(jí)程序語(yǔ)言不太一樣。利用圓括號(hào)‘(下標(biāo))‘來(lái)獲取值或者進(jìn)行賦值。
一、固定長(zhǎng)度的數(shù)組
固定長(zhǎng)度的數(shù)組類型的聲明 為 TYPE?類名?IS VARRAY(元素個(gè)數(shù)) OF? 元素類型;
declare type arry3 is varray(3) of varchar2(4); ---固定數(shù)組類型聲明 sexsList arry3 :=arry3('男','女','人妖'); --固定數(shù)組變量定義 usr_input number; beginusr_input := &sexnum; --讀取用戶輸入sexsList(3) :='未知';if usr_input <=sexsList.count and usr_input >0 thendbms_output.put_line('你好'||sexsList(usr_input)); --用變量名(下標(biāo)) 的形式賦值 := 或者讀取end if; end ; /執(zhí)行后輸入:3 輸出得
二、數(shù)組集合 count ,first ,last ,next() ,exists()的區(qū)別
declaretype varr_num is table of number INDEX BY PLS_INTEGER;vnum varr_num;vn number ; beginvnum(2) := 2000;vnum(3) := 3000;vnum(10) := 10000;vnum(100) :=20000;dbms_output.put_line('count:' ||vnum.count); dbms_output.put_line('first:' ||vnum.first); dbms_output.put_line('last:' ||vnum.last); for i in 1..vnum.count loopif not vnum.exists(i) thendbms_output.put_line('不能找到vnum.count('||i||'):'); else dbms_output.put_line('vnum.count('||i||'):' ||vnum(i)); end if ;end loop;vn :=vnum.first;while vn is not null loopdbms_output.put_line('vnum('||vn||'):' ||vnum(vn)||'vnum.next('||vn||'):' ||vnum.next(vn));vn :=vnum.next(vn);end loop;dbms_output.put_line('vnum.next('||9||'):' ||vnum.next(9));end; /輸出結(jié)果
由此可以看出在集合屬性中,?
first : 第一個(gè)非空值的下標(biāo)
last : 最后一個(gè)非空值的下標(biāo)
count: 集合非零元素個(gè)數(shù)
next(i) :從i開(kāi)始的下一個(gè)非空元素的下標(biāo)
exists(i) :? 下標(biāo)i 是否有值? 因?yàn)槿≡貫榭諘r(shí)會(huì)報(bào)錯(cuò),所以??vnum(i) is not null 無(wú)意義。
-------------------------------------------------------
新建表DEPARTMENT_TBL如下:
存儲(chǔ)數(shù)據(jù)大致如下
----------------------------------------------------------------------
三、可變長(zhǎng)度數(shù)組?IS TABLE?OF??和? BULK COLLECT INTO??:
declaretype varr_vchar is table of varchar2(20); --varchar2(20)的可變長(zhǎng)度數(shù)組deplist varr_vchar ; beginselect department bulk collect into deplist from department_tbl;dbms_output.put('該公司擁有的部門(mén)有:');for i in 1 .. deplist.count loopdbms_output.put_line(deplist(i));end loop; end; /?
TYPE?類名?IS TABLE?OF? 元素類型? ?[INDEX?BY?BINARY_INTEGER];? ?指明了把結(jié)果集當(dāng)做表;?INDEX?BY?BINARY_INTEGER指明了當(dāng)為number 類型時(shí),下標(biāo)自增長(zhǎng)。如果沒(méi)有指定下標(biāo)自增長(zhǎng)那么就要手動(dòng)extend(i),來(lái)擴(kuò)容數(shù)組大小。
declaretype numbers is table of varchar2(10);m numbers := numbers(); beginm.extend(10);m(3) := '50';m.extend;m.extend;m.extend;m(6) := '60';for i in 1 .. m.count loopdbms_output.put_line(m(i));end loop;dbms_output.put_line('count:' ||m.count); dbms_output.put_line('first:' ||m.first); dbms_output.put_line('last:' ||m.last); end; /輸出結(jié)果:
SELECT? 表字段集? BULK COLLECT INTO 類名 from 表名 ;? ? ? ? ? ? ? 將數(shù)據(jù)集直接賦值給類變量,其效率比游標(biāo)塊,但是比游標(biāo)更消耗內(nèi)存。
declaretype varr_vchar is table of department_tbl%rowtype;deplist varr_vchar ; beginselect department,ALL_SALARY,LEADERS bulk collect into deplist from department_tbl;dbms_output.put('該公司擁有的部門(mén)有:');for i in 1 .. deplist.count loopdbms_output.put_line(deplist(i).department ||'的總薪資為'||deplist(i).ALL_SALARY ||'元');end loop; end; /輸出結(jié)果:
四、自定義結(jié)果集(對(duì)象數(shù)組):
結(jié)果集是可以自定義的,相當(dāng)于面向?qū)ο蟪绦蚶锏?長(zhǎng)度可變的對(duì)象數(shù)組。
TYPE?類名? ?IS RECORD (成員變量1? 類型 , 成員變量2? 類型 .......)?;?
declaretype rec_dep is record (department varchar2(10),proportion number);type varr_vchar is table of rec_dep;deplist varr_vchar ;sumsalary number ; ----公司總薪資 beginselect sum(ALL_SALARY) into sumsalary from department_tbl; ---強(qiáng)行轉(zhuǎn)換select department,cast(ALL_SALARY/sumsalary as number(10,9))bulk collect into deplist from department_tbl;for i in 1 .. deplist.count loopdbms_output.put_line(deplist(i).department ||'的部門(mén)總薪資占公司比為'||deplist(i).proportion ||'%');end loop; end; /?
總結(jié)
以上是生活随笔為你收集整理的Oracle 原理: 集合数组,集合属性,is table of 用法,bulk collect into,IS RECORD用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Oracle 原理:游标,显示游标、隐式
- 下一篇: Oracle 原理:临时表空间的操作方式