当前位置:网站首页>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范围,并且下标超出此范围,则可能会发生此异常。
边栏推荐
- TCP和UDP
- 解决idea在debug模式下变得非常慢的问题
- SkiaSharp 之 WPF 自绘 弹动小球(案例版)
- 深入理解C# 可空类型
- How to start writing helm charts for your kubernetes application
- 解决 Chrome 浏览器被毒霸篡改问题
- CSDN TOP1“一个处女座的程序猿“如何通过写作成为百万粉丝博主
- 什么是 Kubernetes 自定义资源定义 (CRD)?
- 【图像检测】基于灰度图像的积累加权边缘检测方法研究附matlab代码
- How to use "copy – link" to accelerate docker to build and optimize cache
猜你喜欢

幸运抽奖系统带后台源码

The interviewer training courseware (very practical in-house training courseware)

使用Tenserboard可视化深度学习训练过程

Watch the open source summit first | quick view of the sub Forum & Activity agenda on July 29

MarkDown高阶语法手册

如何在匹配行之前使用 grep 显示文件名和行号

暑假集训week1

宝塔快速搭建自适应咖啡网站模板与管理系统源码实测

Alibaba architects spent a year sorting out the "Lucene advanced document", and you are also a big factory employee!

【图像处理】基于中轴变换实现图像骨架提取附matlab代码
随机推荐
QML(一):自定义圆角按钮的处理
一次node文件操作过多排查过程总结
幸运抽奖系统带后台源码
WeChat red envelope test case
Design and implementation of gbase8s Informix dodker high availability cluster self recovery cluster startup command oninitdb
面试官培训课件(非常实用的企业内训课件)
Flink UDF 函数汇总
mysql single-line, multi-line subquery
微信怎么知道别人删除了你?批量检测方法(建群)
Proficient in audio and video development can really do whatever you want
迁徙数据平台简单介绍
Qt 之自定义界面(实现无边框、可移动)
[image detection] Research on cumulative weighted edge detection method based on gray image, with matlab code
【Unity3D】场景切换、退出全屏、退出游戏
"Knowledge Collection" article to understand mysql index!!(recommended collection)
std::vector 拷贝、追加、嵌套访问
微信发红包测试用例
为什么应该在开发环境中使用 Kubernetes
Xiaoxiao authorization system V5.0 happy version
fastjson使用方法