SQL记录-PLSQL集合
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集合的更多相关文章
- SQL记录-PLSQL变量与常量文字
PL/SQL变量 变量是只不过是一个给定的存储区域,程序可以操纵的名称.PL/SQL每个变量具有一个特定的数据类型,它决定了大小和变量的存储器的值,可以说存储器和设置操作可以施加到可变内被存储的范 ...
- SQL记录-PLSQL记录
PL/SQL记录 PL/SQL记录就是可以容纳不同类型的数据项的数据结构.记录由不同字段,类似于数据库表的行. 例如,要保留跟踪图书馆中的书籍.可能要跟踪有关每本书下面的属性类似:标题,作者,主题 ...
- SQL记录-PLSQL基本语法与数据类型
PL/SQL基本语法 PL/SQL是一种块结构的语言,这意味着PL/SQL程序被划分和编写代码的逻辑块.每块由三个子部分组成: S.N. 段和说明 1 声明 此部分开头使用关键字DECLARE.它是一 ...
- SQL记录-PLSQL游标
PL/SQL游标 Oracle会创建一个存储区域,被称为上下文区域,用于处理SQL语句,其中包含需要处理的语句,例如所有的信息,行数处理,等等. 游标是指向这一上下文的区域. PL/SQL通过控制光标 ...
- SQL记录-PLSQL数组
PL/SQL数组 PL/SQL程序设计语言提供叫一种叫做VARRAY的数据结构,其可存储相同类型元素的一个固定大小的连续集合.VARRAY用于存储数据的有序集合,但它往往是更加有用认为数组作为相同类型 ...
- SQL记录-PLSQL条件控制
PL/SQL条件控制 决策结构需要程序员指定一个或多个条件要计算,或由程序进行测试,如果条件被确定为真那么一条或多条语句被执行,如果要被执行的其它语句条件被确定为假,则选其它执行块. 以下是从在大 ...
- SQL记录-PLSQL运算符
PL/SQL运算符 运算符是一个符号,告诉编译器执行特定的数学或逻辑操作. PL/SQL语言有丰富的内置运算符,运算符提供的以下几种类型: 算术运算符 关系运算符 比较运算符 逻辑运算符 字符串运算符 ...
- SQL记录-PLSQL包
PL/SQL包 PL/SQL包是组逻辑相关的PL/SQL类型,变量和子程序模式对象. 程序包将有两个强制性的部分: 包装规范定义 包体或定义 包装规范定义 规范是接口到包.它只是声明的类型,变量,常量 ...
- SQL记录-PLSQL触发器
PL/SQL触发器 触发器是存储程序,它会自动执行或发射当一些事件发生.触发器,事实上,写入响应于以下任一事件将被执行: 数据库操作(DML)语句(DELETE,INSERT,UPDATE或) 数据库 ...
随机推荐
- stl源码剖析 详细学习笔记deque(3)
protected: typedef simple_alloc<value_type,Alloc> data_allocator; //用来配置元素的alloc typedef simpl ...
- 关于java线程池的一丢丢
线程池应用达到的目的 1.降低资源消耗:可以重复利用已创建的线程从而降低线程创建和销毁所带来的消耗. 2.提高响应速度:当任务到达时,不需要等线程创建就可以立即执行. 3.提高线程的可管理性:使用线程 ...
- beta版本“足够好”/测试矩阵
能通过地图鱼相应的地点信息实时交互,便于用户操作. 测试矩阵
- 关于增强的for循环
增强的for循环例子:public static<AnyType> void print(Collection<AnyType> coll){ for(AnyType item ...
- WPF使用路径(URI)引用资源文件
Uri uri = new Uri("pack://application:,,,/程序集名称;component/Resources/bj.png", UriKind.Absol ...
- PAT 1043 输出PATest
https://pintia.cn/problem-sets/994805260223102976/problems/994805280074743808 给定一个长度不超过10000的.仅由英文字母 ...
- offices 激活
http://www.xitongcheng.com/jiaocheng/dnrj_article_44577.html 破解工具见cnblos文件中 : https://blog.csdn.net ...
- spring动态数据源+事务
今天在尝试配置spring的动态数据源和事务管理的时候,遇到了几处配置上的问题,在此记录下: 1.使用了spring的aop思想,实现了动态数据源的切换. 2.spring的事务管理,是基于数据源的, ...
- String js删除字符串的最后一个字符三种方法
字符串 var basic = "abc,def,ghi,"; 第一种 basic = basic.substr(0, basic.length - 1); 第二种 basic = ...
- Angular中通过$location获取地址栏的参数详解
Angular中通过$location获取url中的参数 最近,项目开发正在进行时,心有点燥,许多东西没来得及去研究,今天正想问题呢,同事问到如何获取url中的参数,我一时半会还真没想起来,刚刚特意研 ...