1.索引表
索引表是将数据保存在内存中,元素个数没有限制,并且下标可以是负值。
1.1.定义索引表
--定义索引表类型
type type_name is table of element_type [not null] index by key_type;
--定义索引表对象的实例
identifier type_name;
1.2.将条目插入到索引表中
索引表中的每个元素都由一个唯一的整型值(索引)标识。引用表中的值时,必须提供该值的索引。索引的范围:1 ----2147483647,索引值可以不连续,同时PL/SQL并不为没有使用的条目预留空间。
例如:
create or replace procedure IndexTable is
CURSOR all_emps IS
SELECT * FROM EMP p ORDER BY p.empno;
TYPE EMP_TABLE IS TABLE OF EMP%ROWTYPE INDEX BY BINARY_INTEGER;
emps EMP_TABLE;
emps_max BINARY_INTEGER;
begin
emps_max := 0;
FOR employee IN all_emps LOOP
emps_max := emps_max + 1;
emps(emps_max).empno := employee.empno;
emps(emps_max).ename := employee.ename;
emps(emps_max).job := employee.job;
emps(emps_max).mgr := employee.mgr;
emps(emps_max).hiredate := employee.hiredate;
emps(emps_max).sal := employee.sal;
emps(emps_max).comm := employee.comm;
emps(emps_max).deptno := employee.deptno;
END LOOP;
end IndexTable;
1.3.对索引表中进行操作
1)引用:
IF emps.EXISTS(10) THEN
DBMS_OUTPUT.put_line('存在第10条记录!');
END IF;
2)修改:
--修改emps表的第10个条目
IF emps.EXISTS(10) THEN
emps(10).ename := 'cdq;
DBMS_OUTPUT.put_line(emps(10).ename);
END IF;
3)删除:
--删除emps表的第10个条目
emps.DELETE(10);
--删除emps 表中的从1到10的条目
emps.DELETE(1,10);
--删除emps 表中的的所有条目
emps.DELETE;
1.4.索引表中的函数
1) count:返回表的条目数量:
num_rows := emps.COUNT;
2) EXISTS:如果指定的条目存在,则返回为真;否则为假。
IF emps.EXIST(10) THEN
DBMS_OUTPUT.PUT_LINE('存在第10条记录。');
END IF;
3) LIMIT:该方法返回集合可以包含的最大元素数目。只有变长数组才有上限。将LIMIT 用于嵌套表和索引
表时,其返回为NULL。
4) FRIST:该方法返回集合中使用的最小的索引值。
5) LAST:该方法返回集合中使用的最大的索引值。
6) NEXT:该方法返回集合中当前使用的下一个索引值。
7) PRIOR:该方法返回集合中当前使用的上一个索引值。
8) DELETE:删除集合中的条目,见前例。
完整例子:
create or replace procedure IndexTable is
CURSOR all_emps IS
SELECT * FROM EMP p ORDER BY p.empno;
TYPE EMP_TABLE IS TABLE OF EMP%ROWTYPE INDEX BY BINARY_INTEGER;
emps EMP_TABLE;
emps_max BINARY_INTEGER;
begin
emps_max := 0;
FOR employee IN all_emps LOOP
emps_max := emps_max + 1;
emps(emps_max).empno := employee.empno;
emps(emps_max).ename := employee.ename;
emps(emps_max).job := employee.job;
emps(emps_max).mgr := employee.mgr;
emps(emps_max).hiredate := employee.hiredate;
emps(emps_max).sal := employee.sal;
emps(emps_max).comm := employee.comm;
emps(emps_max).deptno := employee.deptno;
END LOOP;
DBMS_OUTPUT.put_line('emps表中的数量是:'||emps.COUNT);
DBMS_OUTPUT.put_line('emps表中的LIMIT是:'||emps.LIMIT);
DBMS_OUTPUT.put_line('emps表中的FRIST是:'||emps.FIRST);
DBMS_OUTPUT.put_line('emps表中的LAST是:'||emps.LAST);
DBMS_OUTPUT.put_line('emps表中的NEXT是:'||emps.NEXT(1));
DBMS_OUTPUT.put_line('emps表中的PRIOR是:'||emps.PRIOR(6));
IF emps.EXISTS(10) THEN
DBMS_OUTPUT.put_line('存在第10条记录!');
END IF;
IF emps.EXISTS(10) THEN
emps(10).ename := 'cdq';
DBMS_OUTPUT.put_line(emps(10).ename);
END IF;
emps.DELETE(100);
emps.DELETE(1,100);
emps.DELETE;
end IndexTable;
2 嵌套表
将数据保存在内存中!!!
嵌套表是一个无序记录集合。
检索数据库中的嵌套表时,条目的索引是连续的,不能象索引表那样随意跳过索引值。
需要使用构造函数初始化嵌套表。
嵌套表不能是以下数据类型:
BOOLEAN, NCHAR, NCLOB, NVARCHAR2, REF CURSOR, TABLE, VARRAY, NOT NULL。
嵌套表的定义和索引表类似,但不能使用INDEX BY 子句。
2.1 初始化嵌套表
必须使用构造函数初始化嵌套表后,才能给它添加条目!
-- 定义索引表类型
TYPE emp_tab IS TABLE OF emp%ROWTYPE;
-- 定义索引表对象的实例
emps emp_tab;
-- 初始化嵌套表
emps := emp_tab();
2.2扩展嵌套表
利用 EXTEND 来扩展嵌套表的数据于内存。
create or replace procedure NestTable is
CURSOR all_emps IS SELECT * FROM EMP p ORDER BY p.empno;
TYPE emp_table IS TABLE OF emp%ROWTYPE;
emps emp_table;
i PLS_INTEGER;
l_count PLS_INTEGER;
begin
l_count :=0;
emps := emp_table();
FOR c1 IN all_emps LOOP
l_count := l_count + 1;
emps.EXTEND;
emps(l_count).empno := c1.empno;
emps(l_count).ename := c1.ename;
emps(l_count).job := c1.job;
emps(l_count).mgr := c1.mgr;
emps(l_count).hiredate := c1.hiredate;
emps(l_count).sal := c1.sal;
emps(l_count).comm := c1.comm;
emps(l_count).deptno := c1.deptno;
END LOOP;
-- clone the first entry five times
emps.EXTEND(5,1);
FOR i IN 1..l_count+5 LOOP
DBMS_OUTPUT.PUT_LINE(TO_CHAR(emps(i).empno) || ' ' || emps(i).ename);
END LOOP;
end NestTable;
2.3删除嵌套表中的条目
1) DELETE 方法:
emps.DELETE(10); -- 删除嵌套表中的第10个条目。
注意:在删除嵌套表中的条目后,嵌套表中的条目并没有重新编号,还可以继续使用。
2) TRIM 方法:
TRIM方法是在表的末尾删除指定数目的条目。
TRIM方法只能用于嵌套表和变长数组。
create or replace procedure NestTable is
CURSOR all_emps IS
SELECT * FROM EMP p ORDER BY p.empno;
TYPE emp_table IS TABLE OF emp%ROWTYPE;
emps emp_table;
i PLS_INTEGER;
l_count PLS_INTEGER;
begin
l_count := 0;
emps := emp_table();
FOR c1 IN all_emps LOOP
l_count := l_count + 1;
emps.EXTEND;
emps(l_count).empno := c1.empno;
emps(l_count).ename := c1.ename;
emps(l_count).job := c1.job;
emps(l_count).mgr := c1.mgr;
emps(l_count).hiredate := c1.hiredate;
emps(l_count).sal := c1.sal;
emps(l_count).comm := c1.comm;
emps(l_count).deptno := c1.deptno;
END LOOP;
-- clone the first entry five times
emps.EXTEND(5, 1);
FOR i IN 1..emps.LAST LOOP
DBMS_OUTPUT.PUT_LINE(TO_CHAR(emps(i).empno) || ' ' || emps(i).ename);
END LOOP;
DBMS_OUTPUT.PUT_LINE('================================');
-- Trim off the five clones of entry #1
emps.TRIM(5);
-- Delete the first entry
emps.DELETE(1);
FOR i IN 1..l_count + 5 LOOP
IF emps.EXISTS(i) THEN --不判断可能会出现没有数据的错误
DBMS_OUTPUT.PUT_LINE(TO_CHAR(emps(i).empno) || ' ' || emps(i).ename);
END IF;
END LOOP;
end NestTable;
3.变长数组
变长数组与嵌套表类似,但变长数组的最大长度是固定的。
变长数组与嵌套表一样需要初始化。
3.1定义变长数组
-- 定义最大长度为100 的变长数组
TYPE type_name IS VARRAY(100) OF VARCHAR2(20);
3.2扩展变长数组
create or replace procedure ArrayTable is
CURSOR all_emp IS SELECT p.ename FROM EMP p ORDER BY p.empno;
TYPE emp_name IS ARRAY(14) OF emp.ename%TYPE;
names emp_name;
i PLS_INTEGER;
begin
names := emp_name();
i :=0;
FOR c1 IN all_emp LOOP
i := i+1;
names.EXTEND;
names(i) := c1.ename;
END LOOP;
FOR i IN names.FIRST..names.LAST LOOP
DBMS_OUTPUT.PUT_LINE(names(i));
END LOOP;
end ArrayTable;
类似于嵌套表,但不能超过最大长度。
4.批绑定
PL/SQL 批绑定是Oracle8i中的新功能。
1) 使用 BULK COLLECT
2) 使用 FORALL
create or replace procedure BULKTest is
CURSOR c1 IS
SELECT empno, ename FROM emp;
TYPE eno_tab IS TABLE OF emp.empno%TYPE;
TYPE ename_tab IS TABLE OF emp.ename%TYPE;
l_enos eno_tab;
l_enames ename_tab;
begin
OPEN c1;
FETCH c1 BULK COLLECT
INTO l_enos, l_enames;
CLOSE C1;
FOR i IN 1 .. l_enos.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(TO_CHAR(l_enos(i)) || ' ' || l_enames(i));
END LOOP;
FORALL i IN l_enos.FIRST .. l_enos.LAST
UPDATE emp SET ename = l_enames(i) WHERE empno = l_enos(i);
end BULKTest;
5.集合的异常处理
- 大小: 42 KB
分享到:
相关推荐
第一章集合的学习通常会涵盖以下知识点: 1. 集合的定义:集合是由若干个确定的、互不相同的元素组成的整体,这些元素被称为集合的成员或元素。集合可以用大括号{}来表示,例如,{1, 2, 3}表示包含三个元素1、2和3...
《人大附中高一数学随堂笔记—第一章 集合》 集合是数学的基础概念之一,也是高中数学学习的起点。本章主要探讨了集合的相关性质和操作,包括子集、全集、补集、交集、并集以及不等式的解法,这些都是高中数学中的...
**高中数学必修一第一章集合总结** 集合是数学的基础概念之一,主要包含了以下几个知识点: 1. **集合的含义与表示** - **确定性**:集合中的元素是确定的,不存在模棱两可的情况。 - **互异性**:集合内的元素...
在本章“必修一第一章集合”中,我们详细探讨了集合的含义、表示方式、子集、全集、补集、交集和并集等基本概念。 1. **集合的含义**: 集合是由一些确定的、不同的对象组成的整体,这些对象被称为集合的元素。...
《数学基础模块(上册)第一章集合》的内容主要围绕集合这一数学基本概念展开,旨在帮助学生理解和掌握集合的定义、性质以及表示方法。本章的教学目标主要包括以下几点: 1. **理解集合与元素**:首先,学生需要理解...
总结来说,本篇内容涵盖了集合的基本概念,包括集合的定义、元素与集合的关系、集合的性质、集合的表示和集合的相等,这些都是学习高中数学第一章集合与函数概念的基础。通过习题的解答,我们可以更深入地理解和应用...
总的来说,高一数学必修1第一章集合的知识点包括:集合的概念、元素的特性、空集的定义、集合的表示方法以及集合的运算。通过解决此类试题,学生可以巩固对集合的理解,提升逻辑思维能力,并为后续的数学学习打下...
集合C不能构成集合,因为它描述的是“接近0的数”,这是一个模糊的概念,没有明确界限。集合D则是不等于0的偶数集合。此外,空集是不含任何元素的集合,例如标签中给出的选项。 2. 集合的运算: 集合之间可以进行...
《第一章集合与简单逻辑提高测试题二》的文档包含了多个关于集合论和简单逻辑的数学题目,主要涉及集合的性质、运算以及逻辑推理。以下是这些题目的解析和知识点概述: 1. 第一题是一个不等式的解题,涉及到集合的...
以下是关于"高一数学必修1第一章集合与函数概念"的重要知识点详解: 首先,我们要理解**集合**的基本概念。集合是一些特定对象的总体,这些对象称为集合的元素。集合具有三个基本特性: 1. **元素的确定性**:集合...
以上是高一数学必修一第一章集合与函数概念的相关知识点,涵盖集合、函数定义域、值域、单调性、奇偶函数、函数的运算、图像对称性、集合运算、函数的周期性等多个方面。这些问题旨在帮助学生理解和掌握这些基础概念...
第一章集合与命题.pdf
在"高中数学第一章集合与函数概念1.1集合1.1.1集合的含义与表示"这一部分,我们将深入理解集合的定义、元素特性以及集合的表示方法。 1. 集合的含义:集合是由一定规则确定的一组对象,这些对象称为集合的元素。...
2021届高考数学一轮复习第一部分考点通关练第一章集合与常用逻辑用语单元质量测试一课件新人教B版
《2020年高考数学按章节分类汇编——第一章集合与函数的概念》 本资料主要针对新人教A版必修一的高考数学复习,聚焦于集合与函数的基础概念,通过一系列选择题的形式,帮助考生巩固和理解相关知识点。下面我们将...
在安徽省淮北市第五中学的高中数学课程中,第一章“集合的含义与表示”作为北师大版必修1的开篇,具有承前启后的重要作用。集合的概念不仅仅在数学领域内占据着基础性地位,它同样为学生的逻辑思维能力、抽象概括...
以上是对高一数学必修一第一章集合与函数概念的部分内容的详细解析,这些知识点包括集合的性质、函数的定义域与值、函数的单调性、奇偶性、集合的运算、函数图像的分析以及函数的对称性等,这些都是高中数学学习的...
以上是对“必修一第一章 集合与函数概念作业题及答案解析17份20精选.doc”中涉及的集合论知识的详细解释。这部分内容主要围绕集合的概念、子集、真子集、相等关系、空集以及它们之间的性质展开,通过一系列题目展示...
【知识点详解】 1. **函数的概念** 函数是一种数学对象,它将一个集合(称为定义域)中的每个...以上就是关于"必修一第一章 集合与函数概念"的知识点详解,涵盖了函数的概念、区间、函数的表示以及相关的练习题解答。
这些知识点是高中数学第一章集合的基础内容,理解和掌握这些概念对于后续学习函数、关系、运算等数学概念至关重要。在实际应用中,这些知识可以帮助我们分析和解决问题,特别是在数学建模和逻辑推理方面。