记录只是一个用来组织其他标量类型的容器,本身是没有值的,它里面的每一个变量拥有自己的值。为了定义记录类型,必须要定义一个记录所包含的标量类型变量的类型,然后声明这种类型的变量,声明记录类型比标量类型多了一个步骤。
TYPE type_name IS RECORD
(
field_declaration
);
声明记录类型并赋初始值
为记录赋值并读取记录内容
DECLARE
TYPE emp_rec IS RECORD(
empname VARCHAR2(12) := '李斯特',
empno NUMBER NOT NULL DEFAULT 7369,
hiredate DATE DEFAULT SYSDATE,
sal NUMBER(7,2)
);
--声明emp_rec类型的变量
empinfo emp_rec;
BEGIN
--下面的语句为empinfo记录赋值
empinfo.empname := '史密斯';
empinfo.empno := 7010;
empinfo.hiredate:=TO_DATE('1982-01-01','YYYY-MM-DD');
empinfo.sal :=5000;
--下面的语句输出empinfo记录值
DBMS_OUTPUT.put_line('员工名称:'||empinfo.empname);
DBMS_OUTPUT.put_line('员工编号:'||empinfo.empno);
END;
除了通过为单个记录逐个地赋值之外,还可以为整个记录进行一次性赋值,最常见的方式是将一个记录类型赋予
另一个记录类型的值,
DECLARE
--定义记录类型
TYPE emp_rec IS RECORD(
empno NUMBER,
ename VARCHAR2(20)
);
--定义与emp_rec具有相同成员的记录类型
TYPE emp_rec_dept IS RECORD(
empno NUMBER,
ename VARCHAR2(20)
);
--声明记录类型的变量
emp_info1 emp_rec;
emp_info2 emp_rec;
emp_info3 emp_rec_dept;
--定义一个内嵌过程用来输出记录信息
PROCEDURE printrec(empinfo emp_rec)
AS
BEGIN
DBMS_OUTPUT.PUT_LINE('员工编号:'||empinfo.empno);
DBMS_OUTPUT.PUT_LINE('员工名称:'||empinfo.ename);
END;
BEGIN
emp_info1.empno := 7890;
emp_info1.ename := '张大千';
DBMS_OUTPUT.PUT_LINE('emp_info1的信息如下:');
printrec(emp_info1);
emp_info2 := emp_info1;
DBMS_OUTPUT.PUT_LINE('emp_info2的信息如下:');
printrec(emp_info2);
END
%ROWTYPE定义的记录赋给标准记录类型
DECLARE
--定义一个与dept表具有相同的记录
TYPE dept_rec IS RECORD(
deptno NUMBER(10),
dname VARCHAR2(30),
loc VARCHAR2(30)
);
--定义基于dept表的记录类型
dep_rec_db dept%ROWTYPE;
dept_info dept_rec;
BEGIN
--使用SELECT语句为记录类型赋值
SELECT *
INTO dept_rec_db
FROM dept
WHERE deptno = 20;
--将%ROWTYPE定义的记录赋给标准记录变量
dept_info := dept_rec_db;
END;
使用SELECT语句为记录赋值
DECLARE
TYPE emp_rec IS RECORD(
empno NUMBER(10),
ename VARCHAR2(30),
job VARCHAR2(30)
);
--声明记录类型的变量
emp_info emp_rec;
BEGIN
--为记录类型赋值
SELECT empno,
ename,
job
INTO emp_info
FROM emp
WHERE empno = 7369;
--输出记录类型的值
DBMS_OUTPUT.PUT_LINE('员工编号:'
|| emp_info.empno
|| CHR(13)
|| '员工名称:'
|| emp_info.ename
)
END;