当前位置:网站首页>pl/sql之集合
pl/sql之集合
2022-07-26 08:38:00 【赟文武】
集合
用户暂时可将表简单理解为此处我们所说的集合,拿以前的记录与集合对比,记录可以理解为一行数据(一行多列),集合可以理解为一列的多个值(一列多行)。
举个狸子吧,假如有一张教师表信息如下:
在该表中t001------刘阳即可称为一条记录,如下图:
刘阳----谌燕----胡明星即可称为一个集合,如下图:
集合的属性与方法
集合的属性与方法用户可参考java中对象的属性和方法进行简单理解,简单区分属性和方法可看其是否传递了参数,若产生参数传递即为方法,反之,则为属性
属性:
- first——取集合第一个元素的下标
- last——取集合最后一个元素的下标
- count——集合中元素个数
- limit——集合的最大容量(索引表、嵌套表最大值未知返回的是null,可变数组返回的是在变长数组声明时规定的长度)
方法:
- delete——删除集合中元素
(1)delete——清空集合中所有元素
(2)delete(n)——删除集合中下标为n的元素,可变数组中不可使用
(3)delete(m,n)——删除集合中下标在n-m之间的所有元素(m<=n),可变数组中不可使用 - extend——扩展集合元素
(1)extend——在集合末端添加一个空元素
(2)extend(n)——在集合末端添加n个空元素
(3)extend(n,m)——把第m个元素拷贝n份添加到集合末端 - tirm/trim(i)——从集合末尾删除一个或n个元素(删除后不保留占位符),不能用于索引表
- next(i)——取集合中下标为i的元素的下一个元素的下标
- prior(i)——取集合中下标为i的元素的上一个元素的下标
调用:
集合变量名.[属性名|方法名];
索引表(关联数组)——“稀疏数组”
索引表只能在pl/sql中使用不能存储在数据库中
一、语法格式
declare
--声明索引表类型
type 索引表名 is table of 集合中元素数据类型 index by 下标数据类型;
--声明索引表类型变量
索引表变量名 索引表名;
begin
null;
/*相关操作*/
end;
- 可通过索引表变量名(下标):=…的格式给集合中元素赋值,亦可通过索引表变量名(下标)的样式来访问其中元素
- 在声明索引表类型时候,集合中元素数据类型无限制,但必须进一步确定精度,例如不能写varchar2但可以写varchar2(211) ;by后下标数据类型用户只能使用pls_integer,binary_integer,varchar2(…)。
- 下标可以不连续可以为负必须为整数,下标会进行一个由小到大的自动排序,例如用户赋值分别给赋值给下标为2,1,-2的元素赋值,在使用循环输出打印时还是会以-2,1,2的顺序打印,first与last同理
二、使用下标赋值与访问索引表中元素示例
declare
type a is table of varchar2(21) index by pls_integer;
b a;
begin
b(-1):='赵';
b(2):='钱';
b(3):='孙';
--删除索引表中下标为3的元素
b.delete(3);
dbms_output.put_line(b(-1)||','||b(2)||','||b(3));
end;
输出效果如下图:
三、索引表中集合属性与方法的使用示例
--属性
declare
type a is table of varchar2(21) index by pls_integer;
b a;
begin
b(-1):='赵';
b(2):='钱';
b(3):='孙';
dbms_output.put_line('b索引表中第一个元素下标为'||b.first);
dbms_output.put_line('b索引表中最后一个元素下标为'||b.last);
dbms_output.put_line('b索引表最多能容纳'||b.limit);
dbms_output.put_line('b索引表中元素个数为'||b.count);
end;
/
--方法
declare
type a is table of varchar2(21) index by pls_integer;
b a;
begin
b(-1):='赵';
b(2):='钱';
b(3):='孙';
--打印下标为2的元素上一个元素的下标
dbms_output.put_line('下标为2的元素上一个元素的下标:'||b.prior(2));
--打印下标为2的元素下一个元素的下标
dbms_output.put_line('下标为2的元素下一个元素的下标:'||b.next(2));
--删除下标为-1的元素
b.delete(-1);
--打印检测下标为-1的元素是否存在结果
/*exists(i)检测下标为i的元素是否存在,存在返回true,否则返回false */
if b.exists(-1) then
dbms_output.put_line('存在');
else
dbms_output.put_line('不存在');
end if;
end;
运行效果如下:
四、循环与索引表示例
- while
declare
type a is table of varchar2(21) index by pls_integer;
b a;
i NUMBER;
begin
b(-1):='赵';
b(2):='钱';
b(3):='孙';
i:=b.first;
WHILE b.exists(i) LOOP
dbms_output.put_line(b(i));
i:=b.next(i);
END LOOP;
end;
- for
for循环只适用于数字连续的情况下例如1,2,3等不适用于索引表
- loop
declare
type a is table of varchar2(21) index by pls_integer;
b a;
i NUMBER;
begin
b(-1):='赵';
b(2):='钱';
b(3):='孙';
i:=b.first;
LOOP
dbms_output.put_line(b(i));
EXIT WHEN i=b.last;
i:=b.next(i);
END LOOP;
end;
五、索引表与记录(多行多列)
DECLARE
--声明记录型
TYPE t_record is RECORD(
ENAME VARCHAR2(100),
AGE NUMBER
);
--声明索引表数据类型
TYPE xx is TABLE OF t_record index BY PLS_INTEGER;
--声明承载索引表数据类型的变量
b xx;
BEGIN
b(1).ENAME:='张三';
b(1).AGE:=18;
b(2).ENAME:='李四';
b(2).AGE:=20;
dbms_output.put_line(b(1).ENAME||', '||b(1).AGE||', '||b(2).ENAME||', '||b(2).AGE);
END;
嵌套表——“表中表”
嵌套表既可存储在数据库中,也可在pl/sql中使用
一、语法格式
declare
--声明嵌套表数据类型
type 嵌套表名 is table of 嵌套表中元素数据类型;
--声明承载变量
嵌套表变量名 嵌套表名;
begin
--初始化
嵌套表变量名 :=嵌套表名();
/*用户自定义操作*/
...;
end;
- 使用整数(只能为正)作为下标,下标是连续的,元素个数无限制的
- 必须进行初始化才能进行下一步相关操作
二、嵌套表中集合的属性与方法应用
declare
type a is table of varchar2(21);
b a;
begin
b:=a('赵','钱','孙');
dbms_output.put_line('b中元素个数:'||b.count);
b.extend(3);
dbms_output.put_line('扩充后b中元素个数:'||b.count);
end;
三、循环与嵌套表
- while
declare
type a is table of varchar2(21);
b a;
i NUMBER;
begin
b:=a('赵','钱','孙');
i:=b.first;
WHILE b.exists(i) LOOP
dbms_output.put_line(b(i));
i:=b.next(i);
END LOOP;
end;
- loop
declare
type a is table of varchar2(21);
b a;
i NUMBER;
begin
b:=a('赵','钱','孙');
i:=b.first;
LOOP
dbms_output.put_line(b(i));
EXIT WHEN i=b.last;
i:=b.next(i);
END LOOP;
end;
- for
declare
type a is table of varchar2(21);
b a;
begin
b:=a('赵','钱','孙');
FOR i in b.first..b.last LOOP
dbms_output.put_line(b(i));
END LOOP;
end;
三条代码运行效果均如下所示:
四、在数据库中使用
(1)创建嵌套表类型
create type 类型名 is table of 集合中元素数据类型;
示例如下:
--创建一个名为xxx其中元素类型为varchar2(20)的嵌套表类型
create type xxx is table of varchar2(20);
(2)在建表语句中使用
/* 语法格式如下 create table 主表名( 列名1 数据类型1, ..., 列名n 嵌套表类型名 )nested table 嵌套表类型列名 store as 表名(数据库不存在的表); */
- 如果创建的表中有多个嵌套表类型列则()后的nested的语句个数应与其中嵌套表类型列个数相同,且store as后表名不能重复,示例如下:
create table demo(
DEPTNO NUMBER,
x xxx,
m xxx
)nested table x store as b,nested table m store as c;
- select语句不能直接查询嵌套表数据,若要查询可使用如下语句:
select * from table(select 嵌套列名 from 主表名);
- insert语句也会产生细微差别,示例如下:
--insert into 主表名(嵌套表类型列名) values(嵌套表类型名(值1,值2,值3,...));
insert into demo(x) values(xxx('赵','钱','孙'));
- 删除嵌套表类型语句 如下:
drop type 嵌套表类型名;
- 删除主表时,嵌套表亦会随之消失(“覆巢之下,焉有完卵”),但嵌套表类型不会被删除
drop table 主表名;
(2-1)在pl/sql中使用(可以直接使用xxx类型)
--简单示例如下
declare
a xxx;
begin
a:=xxx('赵','钱','孙');
dbms_output.put_line(a(1)||', '||a(2)||', '||a(3));
end;
可变数组——“茂密数组”
可变数组既可存储在数据库中,也可在pl/sql中使用
一、语法格式
declare
--声明可变数组类型
type 可变数组类型名 is varray(元素个数上限) of 数组中元素数据类型;
--声明承载可变数组类型的变量
变量名 可变数组类型名;
begin
--初始化
变量名:=可变数组类型名(值1,值2,值n);
/*相关操作*/
...;
end;
- 使用整数(只能为正)(pls_integer,binary_integer)作为下标,下标是连续的;元素个数有限制
- 可变数组有上限,limit属性返回声明时给定的元素个数
- 必须进行初始化才能进行下一步相关操作
二、可变数组中集合的属性与方法应用
declare
type a is varray(7) of varchar2(100);
b a;
begin
b:=a('赵','钱','孙','李');
dbms_output.put_line('扩充前元素个数:'||b.count);
dbms_output.put_line('b集合最大容纳元素个数:'||b.limit);
b.extend(3);
dbms_output.put_line('扩充后元素个数:'||b.count);
dbms_output.put_line('b集合最大容纳元素个数:'||b.limit);
b.trim;
dbms_output.put_line('删除最后一个元素后元素个数:'||b.count);
end;
三、循环与可变数组
- while
declare
type a is varray(4) of varchar2(100);
b a;
i NUMBER;
begin
b:=a('赵','钱','孙','李');
i:=b.first;
WHILE b.exists(i) LOOP
dbms_output.put_line(b(i));
i:=b.next(i);
END LOOP;
end;
- loop
declare
type a is varray(4) of varchar2(100);
b a;
i NUMBER;
begin
b:=a('赵','钱','孙','李');
i:=b.first;
LOOP
dbms_output.put_line(b(i));
EXIT WHEN i=b.last;
i:=b.next(i);
END LOOP;
end;
- for
declare
type a is varray(4) of varchar2(100);
b a;
begin
b:=a('赵','钱','孙','李');
FOR i IN b.first..b.last LOOP
dbms_output.put_line(b(i));
END LOOP;
end;
运行效果如下:
四、在数据库中使用
可变数组类型的使用就如同使用一种数据类型,但插入该列数据时还应特别注意其集合身份
(1)创建可变数组类型
create type 可变数组类型名 is varray(可容量元素个数) of 数组中元素数据类型;
示例如下:
create TYPE n is VARRAY(4) OF VARCHAR2(100);
(2)在建表语句中使用
/* 语法格式如下: create table 表名( 列名1 数据类型1, ..., 列名n 可变数组类型名 ) */
示例如下:
--建表
create TABLE demo(
no NUMBER,
x n
);
--插入数据
INSERT INTO demo VALUES(10,n('赵','钱','孙','李'));
--查询数据
SELECT * FROM table(SELECT x FROM demo);
- 删除与嵌套表类型相同,故不在此赘述
(2-1)在pl/sql中使用(可以直接使用n类型)
DECLARE
b n;
BEGIN
b:=n('赵','钱','孙','李');
FOR i in b.first..b.last LOOP
dbms_output.put_line(b(i));
END LOOP;
END;
边栏推荐
- 22-07-12 personal training match 1 competition experience
- 内存管理-动态分区分配方式模拟
- Number of briquettes & Birthday Candles & building blocks
- Excel delete blank lines
- 23.10 Admin features
- [abstract base class inheritance, DOM, event - learning summary]
- Excel find duplicate lines
- 12306 ticket system crawling - 1. Saving and reading of city code data
- 2022年全国职业院校技能大赛“网络安全”竞赛试题文件上传渗透测试答案Flag
- Kotlin operator
猜你喜欢
NLP (natural language processing) natural language processing learning
Cadence(十)走线技巧与注意事项
基于Raft共识协议的KV数据库
内存管理-动态分区分配方式模拟
Spark persistence strategy_ Cache optimization
IC's first global hacking bonus is up to US $6million, helping developers venture into web 3!
[C language] programmer's basic skill method - "creation and destruction of function stack frames"
Excel find duplicate lines
Why reserve a capacitor station on the clock output?
shell编程
随机推荐
Redis advanced
2022-7-6 personal qualifying 3 competition experience
Sub Chocolate & paint area
OA项目之我的会议(查询)
Super potential public chain dfinity -- the best time for DFI developers to enter
Data validation typeerror: qiao Validate is not a function
What are the contents of Oracle OCP and MySQL OCP certification exams?
2022 national vocational college skills competition "network security" competition question file upload penetration test answer flag
Flitter imitates wechat long press pop-up copy recall paste collection and other custom customization
Oracle 19C OCP 1z0-082 certification examination question bank (19-23)
Oracle 19C OCP 1z0-082 certification examination question bank (30-35)
In the first year of L2, the upgrade of arbitrum nitro brought a more compatible and efficient development experience
[time complexity, space complexity]
Memory management - dynamic partition allocation simulation
The full name of flitter IDFA is identity for advertisers, that is, advertising identifiers. It is used to mark users. At present, it is most widely used for advertising, personalized recommendation,
flink oracle cdc 读取数据一直为null,有大佬知道么
Write common API tools swagger and redoc
Foundry教程:使用多种方式编写可升级的智能合约(上)
Neo eco technology monthly | help developers play smart contracts
Alphabetic string