PL/SQL集合

集合是一个有序组具有相同的数据类型的元素。每个元素进行标识的唯一标表示其在集合中的位置。

PL/SQL提供了三种集合类型:

  • 索引表或关联数组

  • 嵌套表

  • 可变大小的数组或变长数组

Oracle文档提供了每种类型的集合的以下特征:

集合类型 元素数量 下标类型 密集或稀疏 在哪里创建 可以是对象类型属性
关联数组(或索引表) 无界 字符串或整数 两种都可以 只有在PL/SQL块 No
嵌套表 无界 整数 开始密集,可以变得稀疏 无论是在PL/SQL块或模式级别 Yes
可变大小的数组(变长数组) 有界 整数 总是密集 无论是在PL/SQL块或模式级别 Yes

我们已经在前讨论变长数组参见'PL/SQL数组“。在本章中将讨论PL/SQL表。

这两种类型的PL/SQL表即,索引表和嵌套表,都具有相同的结构以及行使用下标符号访问。然而,这两种类型的表有不同一个方面:嵌套表可以存储在数据库中的列,但索引表不能。

索引表

一个索引表(也叫关联数组)是一组键 - 值对。每个键是唯一的,并且用于定位对应的值。键可以是整数或字符串。

使用以下语法创建一个索引表。在这里,我们正在创建一个索引表命名表名,它的键是subscript_type类型以及对应值为 element_type 类型

TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY subscript_type;

table_name type_name;

例子:

下面的示例演示如何创建一个表来存储整数值和键名称,它打印的名称相同的列表。

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;
/

当上述代码在SQL提示符执行时,它产生了以下结果:

Salary of Rajnish is 62000
Salary of Minakshi is 75000
Salary of Martin is 100000
Salary of James is 78000 PL/SQL procedure successfully completed.

例子:

一个索引表的元素也可以是任何数据库表字段%TYPE或任何数据库表%ROWTYPE。下面的例子说明了这个概念。我们将使用存储在数据库中CUSTOMERS表:

Select * from customers;

+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
+----+----------+-----+-----------+----------+
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;
/

当上述代码在SQL提示符执行时,它产生了以下结果:

Customer(1): Ramesh
Customer(2): Khilan
Customer(3): kaushik
Customer(4): Chaitali
Customer(5): Hardik
Customer(6): Komal PL/SQL procedure successfully completed

嵌套表

嵌套表是就像一个一维数组的元素的数量。然而,嵌套表不同于在以下几方面的数组:

  • 数组具有元素的声明的数量,但嵌套表不用声明大小。嵌套表的大小可以动态地增加。

  • 数组总是密集的,也就是说,它总是有连续的下标。嵌套数组初始是致密,但是删除它的元素时就会变成稀疏。

使用以下语法创建一个嵌套表:

TYPE type_name IS TABLE OF element_type [NOT NULL];

table_name type_name;

这个声明是类似声明的索引表中,但没有INDEX BY子句。

嵌套表可以被存储在数据库中的列,所以它可用于简化在那里加入一个较大的表中的单个列,使用SQL操作。关联数组不能存储在数据库中。

例子:

下面的例子说明使用嵌套表:

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;
/

当上述代码在SQL提示符执行时,它产生了以下结果:

Total 5 Students
Student:Kavita, Marks:98
Student:Pritam, Marks:97
Student:Ayan, Marks:78
Student:Rishav, Marks:87
Student:Aziz, Marks:92 PL/SQL procedure successfully completed.

例子:

嵌套表的元素也可以是任何数据库表字段%TYPE和任何数据库表或%ROWTYPE。下面的例子说明了这个概念。我们将使用存储在数据库中的CUSTOMERS表:

Select * from customers;

+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
+----+----------+-----+-----------+----------+
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;
/

当上述代码在SQL提示符执行时,它产生了以下结果:

Customer(1): Ramesh
Customer(2): Khilan
Customer(3): kaushik
Customer(4): Chaitali
Customer(5): Hardik
Customer(6): Komal PL/SQL procedure successfully completed.

集合方法

PL/SQL提供,使集合更容易使用内置集合方法。下表列出了这些方法和用途:

S.N. 方法名称及用途
1 EXISTS(n)
返回TRUE,如果一个集合中的第n个元素的存在;否则返回FALSE
2 COUNT
返回集合当前包含的元素数量
3 LIMIT
检查集合的最大尺寸
4 FIRST
返回在使用整数下标集合的第一个(最小的)索引号
5 LAST
返回在使用整数下标集合的最后一个(最大的)索引号
6 PRIOR(n)
返回集合中索引n前面的索引号
7 NEXT(n)
返回索引n的下一个索引号
8 EXTEND
追加1个空元素到集合
9 EXTEND(n)
追加n个空元素到集合
10 EXTEND(n,i)
追加的第i个元素的集合的n个拷贝
11 TRIM
移除集合的末尾一个元素
12 TRIM(n)
移除一个集合末尾的n个元素
13 DELETE
移除一个集合中的所有元素,设置计数为0
14 DELETE(n)
移除关联数组用数字键或嵌套表中的第n个元素。如果关联数组有一个字符串键,对应于该键的值的元素将被删除。如果n为空,DELETE(N)什么都不做
15 DELETE(m,n)
移除关联数组或嵌套表范围m..n所有元素。如果m大于n或如果m大于或n是零,DELETE(M,N)什么也不做

集合异常

下表提供了集合异常和引发,当它们:

集合异常 引发情况
COLLECTION_IS_NULL 尝试在一个原子空(null)的集合操作
NO_DATA_FOUND 下标指定被删除的元素,或关联数组的一个不存在的元素
SUBSCRIPT_BEYOND_COUNT 下标超过了一个集合的元素数
SUBSCRIPT_OUTSIDE_LIMIT 下标超出了允许的范围
VALUE_ERROR 下标为空(null)或不可转换的键类型。如果该键被定义为PLS_INTEGER范围,下标是在该范围之外可能会出现这样的异常

SQL记录-PLSQL集合的更多相关文章

  1. SQL记录-PLSQL变量与常量文字

    PL/SQL变量   变量是只不过是一个给定的存储区域,程序可以操纵的名称.PL/SQL每个变量具有一个特定的数据类型,它决定了大小和变量的存储器的值,可以说存储器和设置操作可以施加到可变内被存储的范 ...

  2. SQL记录-PLSQL记录

    PL/SQL记录   PL/SQL记录就是可以容纳不同类型的数据项的数据结构.记录由不同字段,类似于数据库表的行. 例如,要保留跟踪图书馆中的书籍.可能要跟踪有关每本书下面的属性类似:标题,作者,主题 ...

  3. SQL记录-PLSQL基本语法与数据类型

    PL/SQL基本语法 PL/SQL是一种块结构的语言,这意味着PL/SQL程序被划分和编写代码的逻辑块.每块由三个子部分组成: S.N. 段和说明 1 声明 此部分开头使用关键字DECLARE.它是一 ...

  4. SQL记录-PLSQL游标

    PL/SQL游标 Oracle会创建一个存储区域,被称为上下文区域,用于处理SQL语句,其中包含需要处理的语句,例如所有的信息,行数处理,等等. 游标是指向这一上下文的区域. PL/SQL通过控制光标 ...

  5. SQL记录-PLSQL数组

    PL/SQL数组 PL/SQL程序设计语言提供叫一种叫做VARRAY的数据结构,其可存储相同类型元素的一个固定大小的连续集合.VARRAY用于存储数据的有序集合,但它往往是更加有用认为数组作为相同类型 ...

  6. SQL记录-PLSQL条件控制

    PL/SQL条件控制   决策结构需要程序员指定一个或多个条件要计算,或由程序进行测试,如果条件被确定为真那么一条或多条语句被执行,如果要被执行的其它语句条件被确定为假,则选其它执行块. 以下是从在大 ...

  7. SQL记录-PLSQL运算符

    PL/SQL运算符 运算符是一个符号,告诉编译器执行特定的数学或逻辑操作. PL/SQL语言有丰富的内置运算符,运算符提供的以下几种类型: 算术运算符 关系运算符 比较运算符 逻辑运算符 字符串运算符 ...

  8. SQL记录-PLSQL包

    PL/SQL包 PL/SQL包是组逻辑相关的PL/SQL类型,变量和子程序模式对象. 程序包将有两个强制性的部分: 包装规范定义 包体或定义 包装规范定义 规范是接口到包.它只是声明的类型,变量,常量 ...

  9. SQL记录-PLSQL触发器

    PL/SQL触发器 触发器是存储程序,它会自动执行或发射当一些事件发生.触发器,事实上,写入响应于以下任一事件将被执行: 数据库操作(DML)语句(DELETE,INSERT,UPDATE或) 数据库 ...

随机推荐

  1. vuex实践之路——笔记本应用(二)

    上一篇我们简单介绍了vuex在此项目中的作用. 这次来理一下项目的整体思路. main.js上次看过了,首先看App.vue文件 我们引入了Toolbar.vue,NodeList.vue,Edito ...

  2. 一款基于Zigbee技术的智慧鱼塘系统研究与设计

    在现代鱼塘养鱼中,主要困扰渔农的就是养殖成本问题.而鱼塘养殖成本最高的就是养殖的人工费,喂养的饲料费和鱼塘中高达几千瓦增氧机的消耗的电费.实现鱼塘自动化养殖将会很好地解决上述问题,大大提高渔农的经济效 ...

  3. git常用命令学习总结

    英语真是我的硬伤啊,提示都要用百度翻译看一遍,费劲... 下面是我日常工作中遇到的各种问题汇总 1.远程服务器分支与本地代码合并 我第一次打出 git pull 显示下面的错误 就怪我英语太差,都懒得 ...

  4. 大厂面试官:Java工程师的“十项全能”

    想要成为合格的Java程序员或工程师到底需要具备哪些专业技能,在面试之前到底需要准备哪些东西呢?面试时面试官想了解你的什么专业技能,以下都是一个合格Java软件工程师所要具备的. 一.专业技能 熟练的 ...

  5. TypeError: web3.eth.Contract is not a constructor错误解决

    这是web3.js开发者在创建合约对象时很容易发生的错误,其实就是不同版本web3.js带来的API变化问题. 请检查你的web3.js版本: 如果version<1.0.0,使用: web3. ...

  6. 通过监控Nginx日志来实时屏蔽高频恶意访问的IP

    目前在我的VPS上主要通过两种方式来限制ip的访问次数. 通过Nginx的limit_req配置来限制同一ip在一分钟内的访问次数 通过Nginx deny封禁一天内超过指定次数的ip(需要一个监控脚 ...

  7. Hugepage介绍以及实践

    在Linux 64位系统里面,默认内存是以4K的页面(Page)来管理的,当系统有非常多的内存的时候,管理这些内存的消耗就比较大;而HugePage使用2M大小的页面来减小管理开销. Hugepage ...

  8. [Asp.net MVC]Asp.net MVC5系列——布局视图

    目录 系列文章 概述 布局视图 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 [Asp.net MVC]Asp.net MVC5系列——添加视图 [Asp.net M ...

  9. 统计nginx日志的状态码

    日志格式 61.159.140.123 - - [23/Aug/2014:00:01:42 +0800] "GET /favicon.ico HTTP/1.1" 404 \ &qu ...

  10. JAVA的垃圾回收机制(GC)

    1.什么是垃圾回收? 垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供的一种用于在空闲时间不定时回收无任何对象引用的对象占据的内存空间的一种机制. 2.什么时候 ...