变量声明中的 %TYPE 属性 (PL/SQL)

数据服务器支持在 PL/SQL 变量声明和参数声明中使用的 %TYPE 属性。使用此属性将确保维持表列与 PL/SQL 变量之间的类型兼容性。

必须指定点分表示法中的限定列名或者先前声明的变量的名称作为 %TYPE 属性的前缀。此列或变量的数据类型将被指定给所声明的变量。即使此列或变量的数据类型发生更改,也不需要修改声明代码。

%TYPE 属性也可以与形参声明配合使用。

语法

阅读语法图跳过直观语法图nametableview.columnvariable%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