基础概念:
%TYPE概念:
为了使一个变量的数据类型与另一个已经定义了的变量(尤其是表的某一列)的数据类型相一致,Oracle提供了%TYPE定义方式。当被参照的那个变量的数据类型改变了之后,这个新定义的变量的数据类型会自动跟随其改变,容易保持一致,也不用修改PL/SQL程序了。当不能确切地知道被参照的那个变量的数据类型时,就只能采用这种方法定义变量的数据类型。
使用%TYPE特性的优点在于:
- 所引用的数据库列的数据类型可以不必知道。
- 所引用的数据库列的数据类型可以实时改变。
%ROWTYPE概念:
如果一个表有较多的列,使用%ROWTYPE来定义一个表示表中一行记录的变量,比分别使用%TYPE来定义表示表中各个列的变量要简洁得多,并且不容易遗漏、出错。这样会增加程序的可维护性。
为了使一个变量的数据类型与一个表中记录的各个列的数据类型相对应、一致,Oracle提供%ROWTYPE定义方式。当表的某些列的数据类型改变了之后,这个新定义的变量的数据类型会自动跟随其改变,容易保持一致,也不用修改PL/SQL程序了。当不能确切地知道被参照的那个表的结构及其数据类型时,就只能采用这种方法定义变量的数据类型。
一行记录可以保存从一个表或游标中查询到的整个数据行的各列数据。一行记录的各个列与表中一行的各个列有相同的名称和数据类型。
使用%ROWTYPE特性的优点在于:
- 所引用的数据库中列的个数和数据类型可以不必知道。
- 所引用的数据库中列的个数和数据类型可以实时改变。
简单实例
--学生结构表
CREATE TABLE STUDENT
(
ID INT NOT NULL, --学生主键ID
NAME VARCHAR2(50),--学生名称
SEX INT --学生性别 0='男' 1='女'
);
--学生信息
INSERT INTO STUDENT(ID, NAME, sex) VALUES(1, 'mike',0);
INSERT INTO STUDENT(ID, NAME, sex) VALUES(2, 'vancy',1);
--%TYPE实例1,简单写法
DECLARE
V_NAME STUDENT.NAME%TYPE; --与NAME类型相同
V_SEX STUDENT.SEX%TYPE; --与SEX类型相同
BEGIN
SELECT t.name,t.sex INTO V_NAME,V_SEX
FROM STUDENT t
WHERE t.id = &ID;
DBMS_OUTPUT.put_line('学生姓名:' || V_NAME);
DBMS_OUTPUT.put_line('学生性别:' || V_SEX);
END;
--%TYPE实例2,结合type自定义类型使用
DECLARE
--定义一个记录类型
TYPE STUINFO_RECORD IS RECORD(
V_NAME STUDENT.NAME%TYPE, --与NAME类型相同
V_SEX STUDENT.SEX%TYPE --与SEX类型相同
);
--声明自定义记录类型变量
V_STUINFO_RECORD STUINFO_RECORD;
BEGIN
SELECT t.name,t.sex INTO V_STUINFO_RECORD
FROM STUDENT t
WHERE t.id = &ID;
DBMS_OUTPUT.put_line('学生姓名:' || V_STUINFO_RECORD.V_NAME);
DBMS_OUTPUT.put_line('学生性别:' || V_STUINFO_RECORD.V_SEX);
END;
--%ROWTYPE实例
DECLARE
V_STUDENT STUDENT%ROWTYPE; --与STUDENT表中的各个列相同
BEGIN
SELECT * INTO V_STUDENT
FROM STUDENT t
WHERE t.id=&ID;
DBMS_OUTPUT.PUT_LINE('学生ID:' || V_STUDENT.ID);
DBMS_OUTPUT.put_line('学生姓名:' || V_STUDENT.NAME);
DBMS_OUTPUT.put_line('学生性别:' || V_STUDENT.SEX);
END;