用户定义的记录类型和记录变量
可以使用 %ROWTYPE 属性基于表定义声明记录,如在记录声明中使用 %ROWTYPE所示。本节介绍如何定义不依赖于任何特定表定义的新记录结构。
TYPE IS RECORD 语句用于创建记录类型的定义。记录类型 是由一个或多个标识符及其相应数据类型组成的记录的定义。记录类型本身不能用于操作数据。
TYPE IS RECORD 语句的语法为:
TYPE rec_type IS RECORD ( fields )
其中 fields 是以下形式的一个或多个字段定义的逗号分隔列表:
field_name data_type [NOT NULL][{:= | DEFAULT} default_value]
其中:
参数 | 说明 |
---|---|
rec_type | rec_type 是分配给记录类型的标识符。 |
field_name | field_name 是分配给记录类型的字段的标识符。 |
data_type | data_type 指定 field_name 的数据类型。 |
DEFAULT default_value | DEFAULT 子句为对应字段分配默认数据值。默认表达式的数据类型必须与列的数据类型相匹配。如果没有指定默认值,则默认值为 NULL。 |
记录变量 或简单地说记录 是记录类型的实例。通过记录类型声明记录。记录的属性(如其字段名称和类型)继承自记录类型。
下面是记录声明的语法。
record rectype
record 是分配给记录变量的标识符。rectype 是以前定义的记录类型的标识符。声明后,记录可用于保存数据。
圆点表示法用于引用记录中的字段。
record.field
record 是以前声明的记录变量,field 是属于从其定义 record 的记录类型的字段的标识符。
再次修改 emp_sal_query – 这次使用用户定义的记录类型和记录变量。
CREATE OR REPLACE PROCEDURE emp_sal_query (
p_empno IN emp.empno%TYPE
)
IS
TYPE emp_typ IS RECORD (
ename emp.ename%TYPE,
job emp.job%TYPE,
hiredate emp.hiredate%TYPE,
sal emp.sal%TYPE,
deptno emp.deptno%TYPE
);
r_emp emp_typ;
v_avgsal emp.sal%TYPE;
BEGIN
SELECT ename, job, hiredate, sal, deptno
INTO r_emp.ename, r_emp.job, r_emp.hiredate, r_emp.sal, r_emp.deptno
FROM emp WHERE empno = p_empno;
DBMS_OUTPUT.PUT_LINE('Employee # : ' || p_empno);
DBMS_OUTPUT.PUT_LINE('Name : ' || r_emp.ename);
DBMS_OUTPUT.PUT_LINE('Job : ' || r_emp.job);
DBMS_OUTPUT.PUT_LINE('Hire Date : ' || r_emp.hiredate);
DBMS_OUTPUT.PUT_LINE('Salary : ' || r_emp.sal);
DBMS_OUTPUT.PUT_LINE('Dept # : ' || r_emp.deptno);
SELECT AVG(sal) INTO v_avgsal
FROM emp WHERE deptno = r_emp.deptno;
IF r_emp.sal > v_avgsal THEN
DBMS_OUTPUT.PUT_LINE('Employee''s salary is more than the '
|| 'department average of ' || v_avgsal);
ELSE
DBMS_OUTPUT.PUT_LINE('Employee''s salary does not exceed the '
|| 'department average of ' || v_avgsal);
END IF;
END;
请注意,无需指定数据类型名称,可以为记录类型定义中的字段数据类型使用 %TYPE 属性。
下面是执行此存储过程的输出。
EXEC emp_sal_query(7698);
Employee # : 7698
Name : BLAKE
Job : MANAGER
Hire Date : 01-MAY-81 00:00:00
Salary : 2850.00
Dept # : 30
Employee's salary is more than the department average of 1566.67
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。
评论