PL/SQL集合

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

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

  • 索引表或关联数组

  • 嵌套表

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

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

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

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

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

索引表

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

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

  1. TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY subscript_type;
  2.  
  3. table_name type_name;

例子:

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

  1. DECLARE
  2. TYPE salary IS TABLE OF NUMBER INDEX BY VARCHAR2(20);
  3. salary_list salary;
  4. name VARCHAR2(20);
  5. BEGIN
  6. -- adding elements to the table
  7. salary_list('Rajnish') := 62000;
  8. salary_list('Minakshi') := 75000;
  9. salary_list('Martin') := 100000;
  10. salary_list('James') := 78000;
  11.  
  12. -- printing the table
  13. name := salary_list.FIRST;
  14. WHILE name IS NOT null LOOP
  15. dbms_output.put_line
  16. ('Salary of ' || name || ' is ' || TO_CHAR(salary_list(name)));
  17. name := salary_list.NEXT(name);
  18. END LOOP;
  19. END;
  20. /

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

  1. Salary of Rajnish is 62000
  2. Salary of Minakshi is 75000
  3. Salary of Martin is 100000
  4. Salary of James is 78000
  5.  
  6. PL/SQL procedure successfully completed.

例子:

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

  1. Select * from customers;
  2.  
  3. +----+----------+-----+-----------+----------+
  4. | ID | NAME | AGE | ADDRESS | SALARY |
  5. +----+----------+-----+-----------+----------+
  6. | 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
  7. | 2 | Khilan | 25 | Delhi | 1500.00 |
  8. | 3 | kaushik | 23 | Kota | 2000.00 |
  9. | 4 | Chaitali | 25 | Mumbai | 6500.00 |
  10. | 5 | Hardik | 27 | Bhopal | 8500.00 |
  11. | 6 | Komal | 22 | MP | 4500.00 |
  12. +----+----------+-----+-----------+----------+
  1. DECLARE
  2. CURSOR c_customers is
  3. select name from customers;
  4.  
  5. TYPE c_list IS TABLE of customers.name%type INDEX BY binary_integer;
  6. name_list c_list;
  7. counter integer :=0;
  8. BEGIN
  9. FOR n IN c_customers LOOP
  10. counter := counter +1;
  11. name_list(counter) := n.name;
  12. dbms_output.put_line('Customer('||counter|| '):'||name_list(counter));
  13. END LOOP;
  14. END;
  15. /

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

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

嵌套表

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

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

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

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

  1. TYPE type_name IS TABLE OF element_type [NOT NULL];
  2.  
  3. table_name type_name;

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

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

例子:

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

  1. DECLARE
  2. TYPE names_table IS TABLE OF VARCHAR2(10);
  3. TYPE grades IS TABLE OF INTEGER;
  4.  
  5. names names_table;
  6. marks grades;
  7. total integer;
  8. BEGIN
  9. names := names_table('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz');
  10. marks:= grades(98, 97, 78, 87, 92);
  11. total := names.count;
  12. dbms_output.put_line('Total '|| total || ' Students');
  13. FOR i IN 1 .. total LOOP
  14. dbms_output.put_line('Student:'||names(i)||', Marks:' || marks(i));
  15. end loop;
  16. END;
  17. /

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

  1. Total 5 Students
  2. Student:Kavita, Marks:98
  3. Student:Pritam, Marks:97
  4. Student:Ayan, Marks:78
  5. Student:Rishav, Marks:87
  6. Student:Aziz, Marks:92
  7.  
  8. PL/SQL procedure successfully completed.

例子:

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

  1. Select * from customers;
  2.  
  3. +----+----------+-----+-----------+----------+
  4. | ID | NAME | AGE | ADDRESS | SALARY |
  5. +----+----------+-----+-----------+----------+
  6. | 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
  7. | 2 | Khilan | 25 | Delhi | 1500.00 |
  8. | 3 | kaushik | 23 | Kota | 2000.00 |
  9. | 4 | Chaitali | 25 | Mumbai | 6500.00 |
  10. | 5 | Hardik | 27 | Bhopal | 8500.00 |
  11. | 6 | Komal | 22 | MP | 4500.00 |
  12. +----+----------+-----+-----------+----------+
  1. DECLARE
  2. CURSOR c_customers is
  3. SELECT name FROM customers;
  4.  
  5. TYPE c_list IS TABLE of customers.name%type;
  6. name_list c_list := c_list();
  7. counter integer :=0;
  8. BEGIN
  9. FOR n IN c_customers LOOP
  10. counter := counter +1;
  11. name_list.extend;
  12. name_list(counter) := n.name;
  13. dbms_output.put_line('Customer('||counter||'):'||name_list(counter));
  14. END LOOP;
  15. END;
  16. /

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

  1. Customer(1): Ramesh
  2. Customer(2): Khilan
  3. Customer(3): kaushik
  4. Customer(4): Chaitali
  5. Customer(5): Hardik
  6. Customer(6): Komal
  7.  
  8. 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. stl源码剖析 详细学习笔记deque(3)

    protected: typedef simple_alloc<value_type,Alloc> data_allocator; //用来配置元素的alloc typedef simpl ...

  2. 关于java线程池的一丢丢

    线程池应用达到的目的 1.降低资源消耗:可以重复利用已创建的线程从而降低线程创建和销毁所带来的消耗. 2.提高响应速度:当任务到达时,不需要等线程创建就可以立即执行. 3.提高线程的可管理性:使用线程 ...

  3. beta版本“足够好”/测试矩阵

    能通过地图鱼相应的地点信息实时交互,便于用户操作. 测试矩阵

  4. 关于增强的for循环

    增强的for循环例子:public static<AnyType> void print(Collection<AnyType> coll){ for(AnyType item ...

  5. WPF使用路径(URI)引用资源文件

    Uri uri = new Uri("pack://application:,,,/程序集名称;component/Resources/bj.png", UriKind.Absol ...

  6. PAT 1043 输出PATest

    https://pintia.cn/problem-sets/994805260223102976/problems/994805280074743808 给定一个长度不超过10000的.仅由英文字母 ...

  7. offices 激活

    http://www.xitongcheng.com/jiaocheng/dnrj_article_44577.html  破解工具见cnblos文件中 : https://blog.csdn.net ...

  8. spring动态数据源+事务

    今天在尝试配置spring的动态数据源和事务管理的时候,遇到了几处配置上的问题,在此记录下: 1.使用了spring的aop思想,实现了动态数据源的切换. 2.spring的事务管理,是基于数据源的, ...

  9. String js删除字符串的最后一个字符三种方法

    字符串 var basic = "abc,def,ghi,"; 第一种 basic = basic.substr(0, basic.length - 1); 第二种 basic = ...

  10. Angular中通过$location获取地址栏的参数详解

    Angular中通过$location获取url中的参数 最近,项目开发正在进行时,心有点燥,许多东西没来得及去研究,今天正想问题呢,同事问到如何获取url中的参数,我一时半会还真没想起来,刚刚特意研 ...