您的位置:首页 > 数据库

PL/SQL之复合类型详解

2016-02-25 23:15 429 查看
PL/SQL中,除了基本类型外,还有一种类型叫做复合类型。

1.记录类型

记录类型把逻辑相关的,分离的,基本数据类型的变量组成一个整体存储起来,必须包括至少一个标量型或RECORD类型成员。

作用是存放互不相同但逻辑相关的信息。在使用记录类型时,需要现在声明部分定义好记录的组成,记录的变量,然后在执行部分

引用记录的变量或成员。

记录类型定义的语法:

TYPE record_name IS RECORD(
v1 data_type1 [not null] [:= default_value],
v2 data_type2 [not null] [:= default_value],
......
vn data_typen [not null] [:= default_value]
);


实例体会一切:

DECLARE
--声明部分
--定义记录类型
TYPE test_record IS RECORD(
name VARCHAR2(50) NOT NULL := 'my test',--:=是pl/sql中赋值语句
detail VARCHAR2(300)
);
--声明一个变量,为记录类型
record_book test_record;
BEGIN
--执行部分
record_book.name := '调用记录类型中的成员';
record_book.detail := '调用另外一个成员';
--输出
DBMS_OUTPUT.PUT_LINE(record_book.name);
DBMS_OUTPUT.PUT_LINE(record_book.detail);
END;--结束


使用SELECT对记录类型赋值,只需保证记录字段与查询字段相匹配:

第一步,建表,插入数据:

create table mytest(
id number(3),
name varchar2(20),
age number(3)
);
insert into mytest values(1,'one',18);
insert into mytest values(2,'two',20);
insert into mytest values(3,'three',24);
commit;
第二步,使用SELECT赋值实际操作:

DECLARE
--声明部分
TYPE ts_record IS RECORD(
name mytest.name%TYPE,--%TYPE表示name的类型与mytest.name的类型一致
age mytest.age%TYPE
);
record_book ts_record;
BEGIN
--执行部分
SELECT name,age INTO record_book
FROM mytest WHERE id = 1;
DBMS_OUTPUT.PUT_LINE(record_book.name);
DBMS_OUTPUT.PUT_LINE(record_book.age);
END;--结束


输出结果:

one

1

注意:一个记录类型变量只能保存从数据库中查询出的一条记录,如果查询出多条记录就会报错。

2.数组类型

数组是具有相同类型的一组成员集合。每一个成员都有一个唯一的下标。PL/SQL中的数组类型为VARRAY。

VARRAY数据类型定义的语法:

TYPE varray_name IS VARRAY(size) OF element_type [NOT NULL];
varray_name为数组名称,size为数组大小,element_type为数组成员类型,默认为null,可以通过增加not null限制。

数组使用步骤:定义,声明,初始化

DECLARE
--定义一个名为my_array,大小为5,成员为字符串的数组
TYPE my_array IS VARRAY(5) OF VARCHAR2(50);
--声明数组
v_my_array my_array;
BEGIN
--初始化数组
v_my_array := my_array('one','two','three','four','five');
--数组下标从1开始
DBMS_OUTPUT.PUT_LINE(v_my_array(1));
--从新给数组某个元素赋值
v_my_array(1) := '从新给one赋值';
DBMS_OUTPUT.PUT_LINE(v_my_array(1));
END;<span style="color:#FF0000;">
</span>
3.使用%TYPE

定义一个变量,其数据类型,与已经存在的某个数据类型一致,可以使用%TYPE保持数据类型一致。

优点:

(1)引用的数据类型可以不知道;

(2)就算引用的类型发生改变时,也能保持改变后的类型,动态保持数据类型的一致性;

DECLARE
--声明部分
TYPE ts_record IS RECORD(
name mytest.name%TYPE,--%TYPE表示name的类型与mytest.name的类型一致
age mytest.age%TYPE
);
record_book ts_record;
BEGIN
--执行部分
SELECT name,age INTO record_book
FROM mytest WHERE id = 1;
DBMS_OUTPUT.PUT_LINE(record_book.name);
DBMS_OUTPUT.PUT_LINE(record_book.age);
END;--结束
这个语句块中%TYPE就是定义变量的数据类型为数据库表字段类型,当数据库表字段类型发生改变时,动态同步。同时,引用者无须知道类型。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: