变量声明中的 %TYPE 属性 (PL/SQL)
数据服务器支持在 PL/SQL 变量声明和参数声明中使用的 %TYPE 属性。使用此属性将确保维持表列与 PL/SQL 变量之间的类型兼容性。
必须指定点分表示法中的限定列名或者先前声明的变量的名称作为 %TYPE 属性的前缀。此列或变量的数据类型将被指定给所声明的变量。即使此列或变量的数据类型发生更改,也不需要修改声明代码。
%TYPE 属性也可以与形参声明配合使用。
语法
描述
- name
- 指定所声明的变量或形参的标识。
- table
- 指定表的标识,将引用该表中的列。
- view
- 指定视图的标识,将引用该视图中的列。
- column
- 指定要引用的表列或视图列的标识。
- variable
- 指定先前声明的变量的标识,将引用此变量。此变量不会继承任何其他列属性(例如可空属性)。
示例
在以下示例中,一个过程使用职员编号来查询 EMP 表、显示该职员的数据并查找该职员所属部门中所有职员的平均薪水,然后将所选职员的薪水与部门平均薪水进行比较。
CREATE OR REPLACE PROCEDURE emp_sal_query (
p_empno IN CHAR(6)
)
IS
v_lastname VARCHAR2(15);
v_job VARCHAR2(8);
v_hiredate DATE;
v_salary NUMBER(9,2);
v_workdept CHAR(3);
v_avgsal NUMBER(9,2);
BEGIN
SELECT lastname, job, hiredate, salary, workdept
INTO v_lastname, v_job, v_hiredate, v_salary, v_workdept
FROM emp WHERE empno = p_empno;
DBMS_OUTPUT.PUT_LINE('Employee # : ' || p_empno);
DBMS_OUTPUT.PUT_LINE('Name : ' || v_lastname);
DBMS_OUTPUT.PUT_LINE('Job : ' || v_job);
DBMS_OUTPUT.PUT_LINE('Hire Date : ' || v_hiredate);
DBMS_OUTPUT.PUT_LINE('Salary : ' || v_salary);
DBMS_OUTPUT.PUT_LINE('Dept # : ' || v_workdept);
SELECT AVG(salary) INTO v_avgsal
FROM emp WHERE workdept = v_workdept;
IF v_salary > 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@
您可以重新编写此过程,以便不在声明节中明确编码 EMP 表数据类型。
CREATE OR REPLACE PROCEDURE emp_sal_query (
p_empno IN emp.empno%TYPE
)
IS
v_lastname emp.lastname%TYPE;
v_job emp.job%TYPE;
v_hiredate emp.hiredate%TYPE;
v_salary emp.salary%TYPE;
v_workdept emp.workdept%TYPE;
v_avgsal v_salary%TYPE;
BEGIN
SELECT lastname, job, hiredate, salary, workdept
INTO v_lastname, v_job, v_hiredate, v_salary, v_workdept
FROM emp WHERE empno = p_empno;
DBMS_OUTPUT.PUT_LINE('Employee # : ' || p_empno);
DBMS_OUTPUT.PUT_LINE('Name : ' || v_lastname);
DBMS_OUTPUT.PUT_LINE('Job : ' || v_job);
DBMS_OUTPUT.PUT_LINE('Hire Date : ' || v_hiredate);
DBMS_OUTPUT.PUT_LINE('Salary : ' || v_salary);
DBMS_OUTPUT.PUT_LINE('Dept # : ' || v_workdept);
SELECT AVG(salary) INTO v_avgsal
FROM emp WHERE workdept = v_workdept;
IF v_salary > 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@p_empno 参数是使用 %TYPE 属性定义的形参的示例。v_avgsal 变量是引用了另一个变量(而不是引用表列)的 %TYPE 属性的示例。
调用 EMP_SAL_QUERY 过程将生成以下样本输出:
SET SERVEROUTPUT ON@
CALL emp_sal_query('200340')@
Employee # : 200340
Name : ALONZO
Job : FIELDREP
Hire Date : 1997-07-05-00.00.00
Salary : 31840
Dept # : E21
Employee's salary does not exceed the department average of 47086.67