一、记录类型
1.显示定义
declare
type t_record is record(
id test.id%type,
mc test.mc%type
);
var_record t_record;
counter number default 0;
begin
for row_test in (select id,mc from test) loop
counter :=counter+1;
var_record.id := row_test.id;
var_record.mc := row_test.mc;
dbms_output.put_line('var_record:'|| var_record.id || '----' || var_record.mc);
dbms_output.put_line('row_test: '|| row_test.id || '----' ||row_test.mc);
dbms_output.put_line('=======loop' || counter ||'times.');
end loop;
exception when others then
dbms_output.put_line(sqlcode ||sqlerrm);
end;
/
执行结果
var_record:111----11111
row_test: 111----11111
=======loop1times.
var_record:222----22222
row_test: 222----22222
=======loop2times.
var_record:333----33333
row_test: 333----33333
=======loop3times.
var_record:444----44444
row_test: 444----44444
=======loop4times.
var_record:555----55555
row_test: 555----55555
=======loop5times.
var_record:666----66666
row_test: 666----66666
=======loop6times.
2.隐示定义
隐式定义记录中,我们不用描述记录的每一个域,在声明记录变量时使用%ROWTYPE命令定义与数据库表,视图,游标有相同结构的记录。
declare
t_record1 test%rowtype;
cursor cur_test(v_id in varchar2) is
select id,mc from test
where id <= v_id;
t_record2 cur_test%rowtype;
begin
for row_test in cur_test('333') loop
t_record1.id := row_test.id;
t_record1.mc := row_test.id;
t_record2.id := row_test.id;
t_record2.mc := row_test.id;
dbms_output.put_line('row_test:' || row_test.id || '----' || row_test.mc);
dbms_output.put_line('t_record1:' || t_record1.id || '----' || t_record1.mc);
dbms_output.put_line('t_record2:' || t_record2.id || '----' || t_record2.mc);
dbms_output.put_line('=======loop' || cur_test%rowcount || 'times.');
end loop;
exception when others then
dbms_output.put_line(sqlcode || sqlerrm);
end;
执行结果
row_test:111----11111
t_record1:111----111
t_record2:111----111
=======loop1times.
row_test:222----22222
t_record1:222----222
t_record2:222----222
=======loop2times.
row_test:333----33333
t_record1:333----333
t_record2:333----333
=======loop3times.
二、集合
类似C语言中的数组,在ORACLE7.3及以前的版本中只有一种集合称为PL/SQL表,这种类型的集合依然保留,就是索引(INDEX_BY)表。PL/SQL有三种类型的集合:
三种类型的集合之间的差异,包括数据绑定、稀疏性(sparsity)、数据库中的存储能力都有不相同。
- 数据绑定:绑定涉及到集合中元素数量的限制,VARRAY集合中的元素的数量是有限,Index_by和嵌套表则是没有限制的。
- 稀疏性(sparsity):稀疏性描述了集合的下标是否有间隔,Index_by表和嵌套表可以是稀疏的,VARRAY类型的集合则是紧密的,它的下标之间没有间隔。
- 存储:Index_by表不能存储在数据库中,但嵌套表和VARRAY可以被存储在数据库中。
Index_by表定义语法如下:
TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY BINARY_INTEGER;
关键字是INDEX BY BINARY_INTEGER,没有这个关键字,那么集合将是一个嵌套表。由于不存储在数据库中
element_type可以是任何合法的PL/SQL数据类型,包括:PLS/INTEGER、SIGNTYPE、和BOOLEAN。
嵌套表定义语法如下:
TYPE type_name IS TABLE OF element_type [NOT NULL];
存储在一个数据库中的嵌套表并不与表中的其它数据存放在同一个数据块中,它们实际上被存放在第二个表中。
从数据库中取回的嵌套表也不保证元素的顺序。集合数据是离线存储的,所以嵌套表适合大型集合。
VARRAY定义语法如下:
TYPE type_name IS [VARRAY|VARYING ARRAY] (max_size) OF element_type [NOT NULL];
max_size是一个整数,用于标示VARRAY集合拥有的最多元素数目。VARRAY集合的元素数量可以低于max_size,但不能超过max_size。
element_type是一维元素的数据类型,如果element_type是记录,那么这个记录只能使用标量数据字段(与嵌套标相似)。
VARRAY存储在数据库中时与表中的其他数据存放在同一个数据块中,元素的顺序保存在VARRAY中。
集合是线存储的,VARRAY很适合于小型集合。
嵌套表和VARRAY都能作为列存储在数据库表中,所以集合自身可以为NULL,当集合为NULL时,用户也不能引用集合中的元素。
declare
cursor cur_test is select id,mc from test;
type t_test1 is table of varchar2(60) index by binary_integer;
type t_test2 is table of test%rowtype index by binary_integer;
var_test1 t_test1;
var_test2 t_test2;
var_new t_test2;
begin
select id,mc into var_test2(0) from test where id='111';
dbms_output.put_line('var_test2(0):' || var_test2(0).id || '----' || var_test2(0).mc);
select id,mc into var_test2(8) from test where id='333';
dbms_output.put_line('var_test2(8):' || var_test2(8).id || '----' || var_test2(8).mc);
var_new :=var_test2;
dbms_output.put_line('===== copy var_test2 to var_new =====');
dbms_output.put_line('var_new(0):'||var_new(0).id||'---'||var_new(0).mc);
dbms_output.put_line('var_new(8):'||var_new(8).id||'---'||var_new(8).mc);
end;
执行结果
var_test2(0):111----11111
var_test2(8):333----33333
===== copy var_test2 to var_new =====
var_new(0):111---11111
var_new(8):333---33333
DECLARE
TYPE t_test1 IS TABLE OF test.id%TYPE;
TYPE t_test2 IS VARRAY (10) OF test.id%TYPE;
var_test1 t_test1;
var_test2 t_test2;
begin
var_test1 := t_test1('test1.1','test1.2','test1.3');
dbms_output.put_line('var_test1: '||var_test1(1)||','||var_test1(2)||','||var_test1(3));
var_test2 := t_test2('test2.1','test2.2','test2.3');
dbms_output.put_line('var_test2: '||var_test2(1)||','||var_test2(2)||','||var_test2(3));
var_test1(2) := 'test1.2_update';
dbms_output.put_line('==== modify var_test1(2) ====');
dbms_output.put_line('var_test1: '||var_test1(1)||','||var_test1(2)||','||var_test1(3));
dbms_output.put_line(var_test1.next(3));
dbms_output.put_line('the length of var_test2''s element: '||var_test2.limit());
end;
/
执行结果
var_test1: test1.1,test1.2,test1.3
var_test2: test2.1,test2.2,test2.3
==== modify var_test1(2) ====
var_test1: test1.1,test1.2_update,test1.3
the length of var_test2's element: 10
除了构造函数外,集合还有很多内建函数,按照面向对象编成的叫法称之为方法。
方法 描述 使用限制
COUNT 返回集合中元素的个数
DELETE 删除集合中所有元素
DELETE(x) 删除元素下标为x的元素 对VARRAY非法
DELETE(x,y) 删除元素下标从X到Y的元素 对VARRAY非法
EXIST(x) 如果集合元素x已经初始化,则返回TRUE, 否则返回FALSE
EXTEND 在集合末尾添加一个元素 对Index_by非法
EXTEND(x) 在集合末尾添加x个元素 对Index_by非法
EXTEND(x,n) 在集合末尾添加元素n的x个副本 对Index_by非法
FIRST 返回集合中的第一个元素的下标号,对于VARRAY集合始终返回1。
LAST 返回集合中最后一个元素的下标号, 对于VARRAY返回值始终等于COUNT.
LIMIT 返回VARRY集合的最大的元素个数 Index_by集合和嵌套表无用
NEXT(x) 返回在第x个元素之后及紧挨着它的元素的值,如果x是最后一个元素,返回null.
PRIOR(x) 返回在第x个元素之前紧挨着它的元素的值,如果x是第一个元素,则返回null。
TRIM 从集合末端开始删除一个元素 对于index_by不合法
TRIM(x) 从集合末端开始删除x个元素 对index_by不合法
综合练习:
set serverout on
DECLARE
TYPE t_record IS RECORD (
id number(18,0),
mc varchar2(50)
);
var_record t_record;
type t_test is table of t_record;
var_test t_test := t_test();
cursor cur_test is select id,mc from test;
begin
open cur_test;
fetch cur_test BULK COLLECT INTO var_test;
for i in 1..var_test.count() loop
dbms_output.put_line(var_test(i).id||'---'||var_test(i).mc);
end loop;
end;
/
分享到:
相关推荐
在处理复合函数的定义域问题时,有三种基本类型: 1. 当已知f的定义域D和g的定义域,求f[g(x)]的定义域。例如,如果f的定义域为D=[0,1],我们需要找到所有使得g(x)在D内的x值,这通常涉及到解不等式以找到x的范围。...
Python 组合数据类型 Python 中的组合数据类型主要包括集合、列表、元组和字典四种。这些数据类型都是 Python 中的内置类型,广泛应用于数据处理和存储。 集合类型 集合类型是无序、唯一性元素的组合,可以是数字...
在“导数--复合函数的导数练习题.pdf”中,可能包含了各种类型的复合函数求导题目,如指数函数、对数函数、三角函数等的复合,以及涉及隐函数和参数方程的导数问题。这些题目旨在帮助学生巩固链式法则的运用,提升...
【复合句练习】是英语语法学习中的一个重要环节,主要涉及到了定语从句、状语从句、名词性从句等多个语法概念。以下是对题目中出现的一些知识点的详细解释: 1. 题目1中,“Betty, ____has never been abroad, is ...
英语简单句、并列句、复合句及练习 英语简单句是英语语法的基础,理解简单句的结构和类型是英语学习的关键。简单句是只有一个主语和一个谓语动词的句子。例如:“I am a student.”、“She likes English very much...
首先,我们可以从“Oracle习题”这个文件名推测,这些文档可能包含了各种类型的题目,如选择题、填空题、简答题和案例分析题等,涵盖了Oracle的基础知识和实际操作。以下是可能涉及的一些关键知识点: 1. **Oracle...
复合函数单调性讲解与练习 在函数单调性中,复合函数的单调性是一个重要的知识点。本文将详细讲解复合函数单调性的定义、性质和应用,并提供了多种不同类型的复合函数的单调性证明和解题方法。 复合函数的定义:设...
导数是微积分中的核心概念,它描述了函数在某一点处...通过解决各种类型的练习题,可以提高对这一概念的理解和应用能力。在解决复合函数的导数问题时,关键在于正确识别函数的层次结构,并灵活运用导数公式和链式法则。
结构体与共用体是C语言中用于处理复合数据类型的概念。结构体允许将不同类型的数据组合成一个单一的数据结构,方便管理和操作相关数据。共用体则是多个不同数据类型共享同一段内存空间的数据类型,它的大小等于其...
7. **结构体**:结构体允许我们将不同类型的数据组合成一个复合类型,方便处理复杂的数据结构。例如,你可以创建一个表示学生的结构体,包含姓名、年龄等字段。 通过这个代码集,初学者不仅可以阅读和理解代码,还...
7. **结构体**:结构体允许你将不同类型的数据组合在一起,形成复合数据类型。通过练习,你可以掌握如何定义、声明和操作结构体,以及如何使用指针访问结构体成员。 8. **文件操作**:C语言提供了丰富的文件操作...
6. **结构体与联合**:结构体允许将不同类型的数据组合成一个复合类型,而联合则是一种共享内存的机制。练习会涉及结构体的声明、初始化、结构体数组以及结构体指针的使用。 7. **预处理器**:预处理器在编译前进行...
5. 结构体与联合:结构体和联合是C语言中的复合数据类型,用于组合不同类型的数据。学习如何定义、初始化和操作结构体,以及理解结构体与指针的结合使用。 6. 文件操作:通过练习,你可以掌握打开、读取、写入和...
以下是一些可能包含在文档中的常见SQL查询类型: 1. **选择查询(SELECT)**:这是最基础的查询,用于从表中选取数据。可以指定列名、条件、排序顺序和分组方式。 2. **联接查询(JOIN)**:包括内连接(INNER ...
在解决复合函数相关的问题时,我们通常会遇到以下几种类型的题目: - 求复合函数的定义域,这通常涉及到解不等式来确定x的取值范围。 - 求复合函数的解析式,可能需要使用配凑法或换元法来简化表达式。 - 分析复合...
### JS基础练习题知识点解析 #### 一、选择题知识点详解 ...通过这些练习题,可以加深对JavaScript基础知识的理解,包括但不限于变量作用域、数据类型转换、数组操作、字符串处理以及函数调用等。
5. **结构体与联合**:结构体允许我们将不同类型的数据组合成一个复合类型,而联合则是在同一内存位置上存储不同数据类型的机制。练习题可能涉及如何定义、声明、初始化结构体或联合,以及如何处理它们的成员。 6. ...
学习如何使用`INDEX`关键字创建唯一索引、普通索引、主键索引以及复合索引,能帮助你优化数据库性能。 4. **约束** 约束是确保数据完整性的一种方式,包括非空约束(NOT NULL)、唯一约束(UNIQUE)、主键约束...
"结构体的例子"展示了C++中复合数据类型——结构体的使用。通过结构体,学习者可以理解如何自定义数据类型并组合不同类型的变量,这对于创建更复杂的对象模型至关重要。 "二进制八进制转换"练习则涵盖了数字系统...
结构体和联合体是C语言中复合数据类型的一部分,它们允许我们将不同类型的数据组合成一个单一的实体。在这些练习题中,你可能会遇到创建结构体或联合体,以及如何访问和修改其成员的问题。 此外,文件操作是C语言的...