oracle 复合类型-record、数组、%type、%rowtype、plsql table类型

知识点:
1,ORACLE 在 PL/SQL 中除了提供象前面介绍的各种类型外,还提供一种称为复合类型的类型---
[color=red]记录和表.[/color]
记录类型类似于C语言中的结构数据类型,它把逻辑相关的、分离的、基本数据类型的变量组成一个整体存储起来,它必须包括至少一个标量型或RECORD 数据类型的成员,称作PL/SQL RECORD 的域(FIELD),其作用是存放[color=red]互不相同但逻辑相关[/color]的信息。在使用记录数据类型变量时,需要先在声明部分先定义记录的组成、记录的变量,然后在执行部分引用该记录变量本身或其中的成员。
定义记录类型语法如下:
TYPE record_name IS RECORD(
v1 data_type1 [NOT NULL] [:= default_value ],
v2 data_type2 [NOT NULL] [:= default_value ],
...... [color=red]//注意末尾不能带逗号[/color]
vn data_typen [NOT NULL] [:= default_value ] );

实例1:
declare
type test_rec is record(
name varchar2(30) not null := '胡勇',
info varchar2(100) --该处末尾不能添加逗号
);
rec_book test_rec;
begin
rec_book.name := '陈超阳';
rec_book.info := '中华人民共和国';
dbms_output.put_line(rec_book.name || ',' || rec_book.info);
end;


实例2:
declare
--定义与hr.employees表中的这几个列相同的记录数据类型
type record_type_emp is record(
v_ename emp.ename%type,
v_job emp.job%type,
v_sal emp.sal%type
);
--声明一个该记录数据类型的记录变量
v_emp_record record_type_emp;
begin
--注意查询的类型应该与复合变量成员的顺序一致
select ename,job,sal into v_emp_record from emp where empno = 7369;
dbms_output.put_line(v_emp_record.v_ename);
dbms_output.put_line(v_emp_record.v_job);
dbms_output.put_line(v_emp_record.v_sal);
end;

输出如下:
SMITH
CLERK
800

实例3:
declare
type type_mytype is record(
ename scott.emp.ename%type,
job scott.emp.job%type,
sal scott.emp.sal%type
);
v_mytype type_mytype;
begin
select e.ename,e.job,e.sal into v_mytype from scott.emp e where empno = '7499';
dbms_output.put_line(v_mytype.ename);
end;

[color=red]注意:一个记录类型的变量只能保存从数据库中查询出的一行记录,若查询出了多行记录,就会出现错误。否则会报错:[/color]
ORA-01422: 实际返回的行数超出请求的行数
ORA-06512: 在 line 11


第二种复合类型--数组
数据是具有相同数据类型的一组成员的集合。每个成员都有一个唯一的下标,它取决于成员在数组中的位置。在PL/SQL中,数组数据类型是VARRAY。

定义VARRY数据类型语法如下:
TYPE varray_name IS VARRAY(size) OF element_type [NOT NULL];

varray_name是VARRAY数据类型的名称,size是下整数,表示可容纳的成员的最大数量,每个成员的数据类型是element_type。默认成员可以取空值,否则需要使用NOT NULL加以限制。对于VARRAY数据类型来说,必须经过三个步骤,分别是[color=red]:定义、声明、初始化。[/color]
实例1:
--定义数组类型
declare
--定义一个最多保存5个varchar(25)数据类型成员的varray数据类型
type reg_varray_type is varray(5) of varchar(25);
--声明一个该varray数据类型的变量
v_reg_varray reg_varray_type;
begin
--用构造函数赋予初值(注意赋值方式--构造函数)
[color=red] --访问数组是从下标1开始的(不是0)[/color]
v_reg_varray := reg_varray_type('中国','美国','英国','日本','河南');
dbms_output.put_line(v_reg_varray(1));
dbms_output.put_line(v_reg_varray(2));
dbms_output.put_line(v_reg_varray(3));
dbms_output.put_line(v_reg_varray(4));
dbms_output.put_line(v_reg_varray(5));
end;


实例2:
--数组 varray实例
declare
type type_myVarray is varray(3) of Varchar2(30);
v_myvarrayType type_myVarray;
begin
--第一种赋值方法:构造函数赋值
v_myvarrayType := type_myVarray('男人','女人','不男不女');
dbms_output.put_line(v_myvarrayType(1));
dbms_output.put_line(v_myvarrayType(2));
dbms_output.put_line(v_myvarrayType(3));
--第二种赋值方法:一个一个的赋值
select e.ename,e.job,to_char(e.sal) into v_myvarrayType(1),v_myvarrayType(2),v_myvarrayType(3) from scott.emp e where empno = 7369;
[color=red]--这种方式不行:会报错:---PLS-00642: 在 SQL 语句中不允许使用本地收集类型(这种赋值方式只适应与record类型的变量)[/color]
--select e.ename,e.job,to_char(e.sal) into v_myvarrayType from scott.emp e where empno = 7369;
dbms_output.put_line(v_myvarrayType(1));
dbms_output.put_line(v_myvarrayType(2));
dbms_output.put_line(v_myvarrayType(3));
end;


第三种类型:%type
定义一个变量,其数据类型与已经定义的某个数据变量(尤其是表的某一列)的数据类型相一致,这时可以使用%TYPE。
使用%TYPE特性的优点在于: 
[color=red] 所引用的数据库列的数据类型可以不必知道; 
所引用的数据库列的数据类型可以实时改变,容易保持一致,也不用修改PL/SQL序。[/color]
实例:
DECLARE
-- 用%TYPE 类型定义与表相配的字段
TYPE T_Record IS RECORD(
T_no emp.empno%TYPE,
T_name emp.ename%TYPE,
T_sal emp.sal%TYPE );
-- 声明接收数据的变量
v_emp T_Record;
BEGIN
SELECT empno, ename, sal INTO v_emp FROM emp WHERE empno=7788;
DBMS_OUTPUT.PUT_LINE(TO_CHAR(v_emp.t_no)||' '||v_emp.t_name||' ' ||
TO_CHAR(v_emp.t_sal));
end;


第四种类型:%rowtype
PL/SQL 提供%ROWTYPE操作符, 返回[color=red]一个记录类型[/color], 其数据类型和数据库表的数据结构相一致。 使用%ROWTYPE特性的优点在于:
所引用的数据库中列的个数和数据类型可以不必知道;
所引用的数据库中列的个数和数据类型可以实时改变,容易保持一致,也不用修改PL/SQL程序。
实例:
declare
v_empno emp.empno%type := &no;
rec emp%rowtype;
begin
select * into rec from emp where empno = v_empno;
dbms_output.put_line(rec.ename);
dbms_output.put_line(rec.job);
dbms_output.put_line(rec.sal);
dbms_output.put_line(rec.deptno);
end;

待续**************************************************************

第五种:更高级的数据类型psql表类型;
在前面我们已经讲解了varray,record类型,可以看出他们都是一维的。下面我们要讲解的是综合上面两种类型的数据类型plsql 表,该表示二维的。可以囊括上面的两种类型。
定义记录表(或索引表)数据类型。它与记录类型相似,但它是对记录类型的扩展。它可以处理多行记录,类似于高级中的二维数组,使得可以在PL/SQL中模仿数据库中的表。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值