本文介紹如何在變量聲明中使用%TYPE。
簡介
SPL程序中聲明用于保存來自數據庫中的表的值的變量,為了確保表列與SPL變量之間的兼容性,二者的數據類型應相同。如果您修改了列的數據類型,則需要更改相應的SPL程序中的變量。此時您可以使用列屬性%TYPE,無需將特定列數據類型編碼為變量聲明。使用圓點表示法限定列名或以前聲明的變量的名稱必須指定為%TYPE的前綴。將作為%TYPE前綴的列或變量的數據類型分配給要聲明的變量。如果給定列或變量的數據類型發生更改,則新數據類型將與變量相關聯,而無需修改聲明代碼。
說明 %TYPE屬性還可以與形參聲明一起使用。
語法
name { { table | view }.column | variable }%TYPE;
參數
參數名稱 | 描述 |
---|---|
name | 分配給變量的標識符或需要聲明的形參。 |
column | table或view中列的名稱。 |
variable | 通過name標識變量之前聲明的變量的名稱。 |
說明 變量不繼承列的任何其他屬性。例如,可以使用NOT NULL子句、DEFAULT子句或分配運算符
:=
在列上指定屬性。
示例
以下示例中,使用員工編號查詢emp
表,查看該員工所在部門的平均工資,然后再將所選員工的工資與部門平均工資進行比較。
CREATE OR REPLACE PROCEDURE emp_sal_query (
p_empno IN NUMBER
)
IS
v_ename VARCHAR2(10);
v_job VARCHAR2(9);
v_hiredate DATE;
v_sal NUMBER(7,2);
v_deptno NUMBER(2);
v_avgsal NUMBER(7,2);
BEGIN
SELECT ename, job, hiredate, sal, deptno
INTO v_ename, v_job, v_hiredate, v_sal, v_deptno
FROM emp WHERE empno = p_empno;
DBMS_OUTPUT.PUT_LINE('Employee # : ' || p_empno);
DBMS_OUTPUT.PUT_LINE('Name : ' || v_ename);
DBMS_OUTPUT.PUT_LINE('Job : ' || v_job);
DBMS_OUTPUT.PUT_LINE('Hire Date : ' || v_hiredate);
DBMS_OUTPUT.PUT_LINE('Salary : ' || v_sal);
DBMS_OUTPUT.PUT_LINE('Dept # : ' || v_deptno);
SELECT AVG(sal) INTO v_avgsal
FROM emp WHERE deptno = v_deptno;
IF v_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;
您也可以將上述存儲過程改寫為以下模式,無需將emp
表數據類型顯式編碼到存儲過程的聲明部分中。
CREATE OR REPLACE PROCEDURE emp_sal_query (
p_empno IN emp.empno%TYPE
)
IS
v_ename emp.ename%TYPE;
v_job emp.job%TYPE;
v_hiredate emp.hiredate%TYPE;
v_sal emp.sal%TYPE;
v_deptno emp.deptno%TYPE;
v_avgsal v_sal%TYPE;
BEGIN
SELECT ename, job, hiredate, sal, deptno
INTO v_ename, v_job, v_hiredate, v_sal, v_deptno
FROM emp WHERE empno = p_empno;
DBMS_OUTPUT.PUT_LINE('Employee # : ' || p_empno);
DBMS_OUTPUT.PUT_LINE('Name : ' || v_ename);
DBMS_OUTPUT.PUT_LINE('Job : ' || v_job);
DBMS_OUTPUT.PUT_LINE('Hire Date : ' || v_hiredate);
DBMS_OUTPUT.PUT_LINE('Salary : ' || v_sal);
DBMS_OUTPUT.PUT_LINE('Dept # : ' || v_deptno);
SELECT AVG(sal) INTO v_avgsal
FROM emp WHERE deptno = v_deptno;
IF v_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;
說明
- p_empno顯式使用%TYPE定義的形參。
- v_avgsal引用另一個變量而非表列的%TYP的用法。
此存儲過程的輸出結果如下:
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