码迷,mamicode.com
首页 > 数据库 > 详细

PLSQL集合笔记

时间:2017-08-04 10:59:42      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:emp_table   emp_table_type   嵌套表   

针对多行单列的数据处理,用之前的标量变量肯定不行,这里引入一个新的数据类型复合数据类型。

这个复合类型类似于语言的数组struct[i],包括索引表,嵌套表,边长数组三种类型,

一、索引表称为PLSQL的表,下标与数组比较可以为负数,下标个数没有限制,这个只能用在数据类型,不能定义完之后用在表中承当列类型,不需要初始化。

TYPE type_name IS TABLE OF element_type

[not null] index by key_type;

identifier type_name;

以上为语法

element_type 为索引表元素的数据类型

key_type 为索引表元素下标的数据类型(binary_integer,pls_integer varchar2);

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 =&no;--此处为什么会用-1 既然是处理多行单列如何把数据都取出来。

dbms_output.put_line(‘ename_table(-1));

end;

用varchar2类型作为下标类型,此处应该有疑问,下标是字符类型

set serveroutput on;

declare

type area_table_type is table of number

index by varchar2(10);

area_table area_table_type;

begin

area_table(‘北京‘):=1;

area_table(‘天津‘):=2;

area_table(‘天上人间‘):=3;

dbms_output.put_line(area_table.first);

dbms_output.put_line(area_table(‘天津‘))

dbms_output.put_line(area_table.last);

二、嵌套表与数组比较下标从1开始,元素没有限制,这个比较浪费数组,他的元素值不是顺序的,嵌套表可以作为表的数据类型使用,使用的时候需要用构造方法初始化嵌套表。

语法

type type_name is table of element_type:

identifier type_name;


declare

type ename_table_type is table of emp.ename%TYPE;

ename_table ename_table_type:=ename_table_type(‘a‘,‘a‘);



下面展示嵌套表的使用方法

啊)

declare

    type ENAME_TABLE_TYPE is table of emp.ename%TYPE;

ename_table ename_table_type:=ename_table_type(‘a‘,‘a‘,‘a‘,‘a‘,‘a‘);

begin

select ename into ename_table(2) from emp  #使用的时需要用构造方法ename_table_type()初始化

where empno=&no;

dbms_output.put_line(ename_table(2));

end;

吧)作为类型的时候需要用create type先创建类型,然后必须指定存储的表

create type phone_type is table of varchar2(20);

create table employee(

id number(4),name varchar2(20),sal number(6,2),

phone phone_type)nested table phone store as phone_table;


insert into employee values(1,‘scott‘,800,phone_type(‘0473-343434‘,‘128381298‘));


的)取数据这个案例提示了一个集合类型所拥有的方法

set serveroutput on;

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;


三、变长数组 VARRAY 可以作为表类型使用,下标1开始最大为7,使用构造房初始化

TYPE TYPE_NAME IS VARRAY(SIZE_LIMIT) OF TABLE ELEMENT_TYPE [NOT NULL];

IDENTIFIER TYPE_NAME;

SIZE_LIMIT用来指定元素的最大个数,个人理解是元素的个数,不是指下标。

declare

TYPE ENAME_TABLE_TYPE IS VARRAY(30) OF EMP.ENAME%TYPE;

ENAME_TABLE ENAME_TABLE_TYPE:=ENAME_TABLE_TYPE(‘A‘,‘A‘,‘A‘);



四、记录表是记录跟表的结合 PLSQL变量处理单行单列 PLSQL记录用于处理单行多列,PLSQL集合用户处理多行单列,记录表是结合了PLSQL记录跟PLSQL表的有点组成的

五、多级集合类型,类似于多维数组,嵌套了集合类型的集合类型,此时的元素类型不能是集合类型,可以是标量,plsql记录以及对象类型这个对象类型好像没见过,


六、集合的方法,

exists判断集合元素是否存在,在就是true,不在就是false

if ename_table.exists(1) then

ename_table(1):=‘scott‘;

else

dbms_output.put_line(‘a‘);

end if;

count返回当前集合变量中的元素个数,

for i in 1..ename_table.count loop

dbms_output.put_line(ename_table(i).ename);

end loop;

limit 用于返回集合元素的最大个数,这个一直没有明白,就像varray表可以定义的时候用varray(20)来定义元素的个数,但是下标却只能到7,有可能是这么理解,一个下标对应的元素个数之和最大不能超过20,这个还是有疑问。

declare
type ename_table_type is varray(20) of emp.ename%type;
ename_table1 ename_table_type:=ename_table_type(‘a‘);
ename_table2 ename_table_type:=ename_table_type(‘aaaa‘);
ename_table3 ename_table_type:=ename_table_type(‘aaaaaaaaaa‘);
ename_table4 ename_table_type:=ename_table_type(‘aaaa‘,‘3333333333‘);
begin
dbms_output.put_line(ename_table1.limit);
dbms_output.put_line(ename_table2.limit);
dbms_output.put_line(ename_table3.limit);
dbms_output.put_line(ename_table4.limit);
end;

四个值输出均为20,也就是他计算的时候是你定义的值,


first跟last,返回集合变量第一个元素的下标,跟最后一个元素的下标

dbms_output.put_line(ename_table.first);

dbms_output.put_line(ename_table.last);这个在遍历循环的时候用的上,for i in 1..ename_table.last loop

prior返回当前元素下标的前一个下标值,next返回当前元素下标的后面一个下标值,

extend扩展集合变量的大小,只是用与嵌套表跟varray表,这里还是有疑问,

trim从集合尾部删除元素,trim(n)如果不写n就是从尾部删除一个,如果写就是从尾部删除n个

delete用于删除指定的第n个元素,三种调用格式,delete(m,n)你懂得


集合赋值 两个集合进行赋值,不知道有什么意义(:=)或者sql语句将源集合中的数据赋值给目标集合时会自动清除原有的数据,给集合赋空值,集合不初始化即可

另外一个赋值为集合操作符,set multiset union,multiset intersect,multiset except

ename_table1 :=set(ename_table2);

multiset union取两个集合的并集

result=nt1 multiset union nt2;

multiset union distinct 取两个集合的并集并去除重复的值








































本文出自 “运维邦” 博客,谢绝转载!

PLSQL集合笔记

标签:emp_table   emp_table_type   嵌套表   

原文地址:http://aklaus.blog.51cto.com/9724632/1953493

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!