数据库.复合数据类型
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3 Sept. 2008 Confidential
含有记录的PL/SQL 表
可以使用%ROWTYPE定义一个TABLE变量 举例:声明一个PL/SQL变量保存部门信息。
DECLARE TYPE dept_table_type IS TABLE OF dept%ROWTYPE INDEX BY BINARY_INTEGER; dept_table dept_table_type; -- Each element of dept_table is a record
3 Sept. 2008 Confidential
3 Sept. 2008 Confidential
PL/SQL 记录(续)
为PL/SQL记录赋值可以使用点号引用记录中的字段。 语法: record_name.field_name 例: emp_record.Job:= ‘CLERK‘; SELECT INTO FROM WHERE
3 Sept. 2008 Confidential
3 Sept. 2008 Confidential
PL/SQL 表记录的举例
DECLARE TYPE e_table_type IS TABLE OF emp.Ename%Type INDEX BY BINARY_INTEGER; e_tab e_table_type; v_var number(2); BEGIN e_tab(1) := 'SMITH'; UPDATE emp SET sal = 1.1 * sal WHERE Ename = e_tab(1); v_var := e_tab.count; dbms_output.put_line(v_var); e_tab.delete(1); v_var := e_tab.count; dbms_output.put_line(v_var); END; /
•
3 Sept. 2008 Confidential
PL/SQL 记录(续)
记录具有以下特点:
• 每个记录内都可以有许多字段。 • 可以为记录赋初值,同时可用NOT NULL来限定记录 • 无初始值的字段定义为NULL • 在定义字段时也可以使用保留字DEFAULT • 可以在任意一个块、子程序或包的声明部分定义 RECORD类型并声明用户自定义的记录 • 可以声明并引用嵌套的记录,一个记录可以是其他记录 的组件
PL/SQL 表
• TABLE类型结构类似于其他语言中的数组类型,由两部分组
成: ¯ 主键:BINARY_INTEGER型 ¯ 列:标量或记录类型 • Table类型没有长度限制,可以动态增长。
3 Sept. 2008 Confidential
创建 PL/SQL 表
语法:
TYPE type_name IS TABLE OF {column_type | variable%TYPE | table.column%TYPE} [NOT NULL] [INDEX BY BINARY_INTEGER]; identifier type_name;
3 Sept. 2008 Confidential
PL/SQL 记录(续)
Field1 (datatype) Field2 (datatype) Field3 (datatype)
举例:
Field1 (datatype) empno number(4) Field2 (datatype) ename varchar2(10) Field3 (datatype) job varchar2(9)
第三章 复合数据类型
东软IT人才实训中心
7 Copyright 2008 By Neusoft Group. All rights reserved Mar. 2008 © Neusoft Confidential
目标:
本章旨在向学员介绍PL/SQL的复合数 据类型的应用,通过本课的学习,学 员应该掌握如下知识: 1) 掌握如何创建PL/SQL记录 2)掌握%rowtype属性的使用 3)了解PL/SQL表类型 学时:1.5学时 教学方法:讲授ppt +上机练习+点评
举例: 声明一个 PL/SQL表存储姓名
... TYPE ename_table_type IS TABLE OF emp.ename%TYPE INDEX BY BINARY_INTEGER; ename_table ename_table_type; ...
3 Sept. 2008 Confidential
引用语法:table(index).Field 例:dept_table(15).Location:=‘AT’;
3 Sept. 2008 Confidential
PL/SQL 表方法
方法 EXISTS(n) COUNT FIRST LAST DELETE 描述 用于判断PL/SQL表中指定的元素是否存在。 返回一个PL/SQL表当前包含的元素的数量。 在PL/SQL表中返回第一个和最后一个索引数字。 DELETE把所有的元素从PL/SQ表中移开。 DELETE(n)把第n 个元素从PL/SQ表中移开。 DELETE(m,n)从PL/SQ表中移开在范围(m,n)中的所有元素。
3 Sept. 2008 Confidential
%ROWTYPE 属性
• 声明的变量对应于数据库表或视图中列的集合 • 在%ROWTYPE 之前加上数据库表名 • 记录内字段的名字和数据类型参照表或视图中的列
声明一个变量来存放emp表中雇员的信息:
DECLARE emp_record emp%rowtype; …. emp_record.ename:=‘ljs’; emp_record.sal:=3000; SELECT * INTO FROM emp WHERE ……; emp_record
3 Sept. 2008 Confidential
复合数据类型
复合组合变量也叫做组合变量,在复合变量中包括 多个内部组件,每个组件都可以单独存放值,因此 一个复合变量可以存放多个值。 • 复合变量类型不是数据库中已经存在的数据类型, 因此复合变量在声明类型之前,首先要先创建复合 类型,复合类型创建后可以多次使用,以便定义多 个复合变量。
3 Sept. 2008 Confidential
%ROWTYPE 属性(续)
DECLARE emp_rec emp%rowtype; BEGIN SELECT * into emp_rec FROM emp WHERE empno=&p_empno; INSERT INTO test VALUES(emp_rec.EMPNO,emp_rec.ENAME,emp_rec.job, emp_rec.mgr,emp_rec.HIREDATE,emp_rec.sal ,emp_rec.comm,emp_rec.deptno); commit; END;
empno,ename,job emp_record emp ename= ‘SMITH‘;
PL/SQL 记录(续)
创建一个记录类型emp_record_type,它包含雇员的名字、薪水、工作岗位, 声明一个该类型的变量emp_record,查询雇员编号是7788雇员的上述信息, 并显示. DECLARE TYPE emp_record_type IS RECORD (ename emp.ename%type, sal emp.sal%type, job varchar2(9)); emp_record emp_record_type ; BEGIN SELECT ename,sal,job INTO emp_record FROM emp WHERE empno= 7788; dbms_output.put_line('雇员名:='||emp_record.ename||' ; 薪水='||emp_record.sal); END;
• 声明一个该类型的记录作为标识符
recordtype
type_name;
3 Sept. 2008 Confidential
PL/SQL 记录(续)
TYPE emp_record_type IS RECORD (empno emp.empno%type, ename emp.ename%type, job varchar2(9)); emp_record emp_record_type ;
•
3 Sept. 2008 Confidential
复合数据类型
• 复合数据类型包括: – 记录 – 表 – 嵌套表 – 数组
3 Sept. 2008 Confidential
PL/SQL 记录
记录是存储在多个字段中的一组相关的数据项,每个字段 都有自己的名字和数据类型。 • 把字段的集合当作一个整体的逻辑单元 • 主要用于从表中取出查询到的行数据
3 Sept. 2008 Confidential
%ROWTYPE 属性(续)
%ROWTYPE的优点:
• 可以不必知道数据库中列的数量和类型。 • 在运行期间,数据库中列的数量和类型可能发生变化。 • 在SELECT语句中使用该属性可以有效地检索表中的行。
3 Sept. 2008 Confidential
PL/SQLeabharlann Baidu 表结构
主键 ... 列 ...
1 2 3 ...
Jones Smith Maduro ...
BINARY_INTEGER型
标量型或记录类型 标量型
3 Sept. 2008 Confidential
创建 PL/SQL 表
DECLARE TYPE ename_table_type IS TABLE OF emp.ename%TYPE INDEX BY BINARY_INTEGER; TYPE hiredate_table_type IS TABLE OF DATE INDEX BY BINARY_INTEGER; ename_table ename_table_type; hiredate_table hiredate_table_type; BEGIN ename_table(1) := 'CAMERON'; hiredate_table(8) := SYSDATE + 7; IF ename_table.EXISTS(1) THEN INSERT INTO ... ... END;
3 Sept. 2008 Confidential
PL/SQL 记录(续)
• 定义记录类型的语法
TYPE type_name IS RECORD (field_declaration[, field_declaration]…);
其中 field_declaration
field_name {field_type | variable%TYPE | table.column%TYPE | table%ROWTYPE} [[NOT NULL] {:= | DEFAULT} expr]