当前位置:网站首页>PL/SQL 集合
PL/SQL 集合
2022-07-29 11:39:00 【一只特立独行的_小猫】
集合是具有相同数据类型的有序元素组。每个元素都有一个唯一的下标来表示它在集合中的位置。
PL/SQL提供了三种集合类型 :
- 索引表
- 嵌套表
- 数组
索引表
索引表(也称为关联数组)是一组键 - 值对。每个键都是唯一的,用来定位相应的值。键可以是整数或字符串。
1、创建索引表语法:
-- 定义索引表类型:指明值类型和键类型
TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY subscript_type;-- 使用索引表类型定义索引表变量
table_name type_name;
2、实例
以下示例显示了如何创建一个索引表来存储整数值以及名称,然后打印出索引表的名称和值。
DECLARE
TYPE salary IS TABLE OF NUMBER INDEX BY VARCHAR2(20);
salary_list salary;
name VARCHAR2(20);
BEGIN
-- adding elements to the table
salary_list('Rajnish') := 62000;
salary_list('Minakshi') := 75000;
salary_list('Martin') := 100000;
salary_list('James') := 78000;
-- printing the table
name := salary_list.FIRST;
WHILE name IS NOT NULL LOOP
dbms_output.put_line ('Salary of ' || name || ' is ' || TO_CHAR(salary_list(name)));
name := salary_list.NEXT(name);
END LOOP;
END;
/
索引表的元素也可以是任何数据库表的%ROWTYPE或任何数据库表字段的%TYPE。 如下所示:
DECLARE
CURSOR c_customers IS select name from customers;
TYPE c_list IS TABLE of customers.name%type INDEX BY binary_integer;
name_list c_list;
counter integer :=0;
BEGIN
FOR n IN c_customers LOOP
counter := counter +1;
name_list(counter) := n.name;
dbms_output.put_line('Customer('||counter||'):'||name_list(counter));
END LOOP;
END;
/
嵌套表
嵌套表就像一个具有任意数量元素的一维数组。但是,嵌套表与数组在以下几个方面不同:
- 数组是一个有声明数量的元素集合,但是一个嵌套的表没有。嵌套表的大小可以动态增加。
- 数组总是密集的,即它总是具有连续的下标。 嵌套数组最初是密集的,但是当从其中删除元素时,它可能变得稀疏。
1、创建嵌套表语法:
-- 声明嵌套表类型,指明元素的数据类型【不用指明大小!】
TYPE type_name IS TABLE OF element_type [NOT NULL]; -- 创建嵌套表变量 table_name type_name;
嵌套表可以存储在数据库列中。它可以进一步用于简化SQL操作,您可以使用更大的表来连接单列表。索引表不能存储在数据库中。
2、 实例
DECLARE
TYPE names_table IS TABLE OF VARCHAR2(10);
TYPE grades IS TABLE OF INTEGER;
names names_table;
marks grades;
total integer;
BEGIN
names := names_table('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz');
marks:= grades(98, 97, 78, 87, 92);
total := names.count;
dbms_output.put_line('Total '|| total || ' Students');
FOR i IN 1 .. total LOOP
dbms_output.put_line('Student:'||names(i)||', Marks:' || marks(i));
END LOOP;
END;
/
嵌套表的元素也可以是任何数据库表的%ROWTYPE或任何数据库表字段的%TYPE。如下所示:
DECLARE
CURSOR c_customers IS SELECT name FROM customers;
TYPE c_list IS TABLE of customers.name%type;
name_list c_list := c_list();
counter integer :=0;
BEGIN
FOR n IN c_customers LOOP
counter := counter +1;
name_list.extend;
name_list(counter) := n.name;
dbms_output.put_line('Customer('||counter||'):'||name_list(counter));
END LOOP;
END;
/
数组
参考PL/SQL 数组
集合方法
PL/SQL提供了内置的集合方法,使集合更易于使用。
COUNT:返回集合中的元素数目。
DELETE:从集合中除去所有元素。
DELETE (n):从索引表(关联数组)中除去元素 n。不能从 VARRAY 集合数组中除去各个元素。
DELETE(n1,n2):从索引表(关联数组)中除去所有从 n1 到 n2 的元素。不能从 VARRAY 集合数组中除去各个元素。
EXISTS (n):如果指定的元素存在,那么返回 TRUE。
EXTEND:对集合追加单一 NULL 元素。
EXTEND (n):对集合追加 n 个 NULL 元素。
EXTEND (n1, n2):对集合追加第 n2th 个元素的 n1 个副本。
FIRST:返回集合中的最小索引号。
LAST:返回集合中的最大索引号。
LIMIT:对于 VARRAY,返回最大元素数目;对于嵌套的表,返回 NULL。
NEXT (n):返回紧跟在指定索引后面的元素的索引编号。
PRIOR (n):返回紧跟在指定索引前面的元素的索引编号。
TRIM:从集合末尾除去单个元素。不能从关联数组集合类型中除去元素。
TRIM (n):从集合末尾除去 n 个元素。不能从关联数组集合类型中除去元素。
集合异常
下表提供了集合异常情况以及何时引发:
COLLECTION_IS_NULL:尝试在一个原子空集合上进行操作。
NO_DATA_FOUND:下标指定被删除的元素或关联数组中不存在的元素。
SUBSCRIPT_BEYOND_COUNT:下标超出了集合中元素的数量。
SUBSCRIPT_OUTSIDE_LIMIT:下标超出允许的范围。
VALUE_ERROR:下标为空或不能转换为键类型。如果键定义为PLS_INTEGER
范围,并且下标超出此范围,则可能会发生此异常。
边栏推荐
- LMO·3rd - 报名通知
- One click blog building: how to use WordPress plug-in to build a dedicated blog
- MarkDown高阶语法手册
- 什么是 Kubernetes 自定义资源定义 (CRD)?
- 8. Interleave - understand ThreadPoolExecutor thread pool from architecture design to practice
- 7月3日文: 表面上有危险,实属安全周期,大概率会快速上扬的个股
- [image detection] Research on cumulative weighted edge detection method based on gray image, with matlab code
- AI全流程开发难题破解之钥
- PHP basics uses arrays to save data
- 【表达式计算】表达式计算问题的通用解法(练习加强版,含总结)
猜你喜欢
【年中总结】创业3年,越来越穷,还是坚持架构平台
LED透明屏和LED玻璃显示屏区别
DNS协议、ICMP协议、NAT技术
The heavyweight foundation awarded platinum, gold and silver donors
【图像检测】基于灰度图像的积累加权边缘检测方法研究附matlab代码
即学即用的问题解决思维,给无意识的生活装上“后视镜”
How to use grep to display file names and line numbers before matching lines
北京大学公开课重磅来袭!欢迎走进「AI for Science」课堂
Watch the open source summit first | quick view of the sub Forum & Activity agenda on July 29
How to use "copy – link" to accelerate docker to build and optimize cache
随机推荐
[image processing] image skeleton extraction based on central axis transformation with matlab code
Insights into the development of the enterprise live broadcast industry in 2022
Gbase8s core data backup
ECCV 2022 | ssp: a new idea of small sample tasks with self-supporting matching
three.js 报错信息 RGBELoader.js:46 RGBELoader Bad File Format: bad initial token
MarkDown高阶语法手册
Great golang Road
golang 实现文件上传下载
Alluxio为Presto赋能跨云的自助服务能力
Lucky draw system with background source code
Basic. Blocking
谷歌“消灭” Cookie 计划延至 2024 年
『面试知识集锦100篇』1.面试技巧篇丨HR的小心思,你真的懂吗?
3.认识和操作一下mysql的基本命令
socket+websocket
"100 Interview Knowledge Collections" 1. Interview Skills丨Do you really understand HR's careful thinking?
Learning with Recoverable Forgetting readings
Similarities and differences of QWidget, qdialog and qmainwindow
After connect and SQL join in on conditions and where
HMS Core音频编辑服务音源分离与空间音频渲染,助力快速进入3D音频的世界