使用%TYPE在定義變量時,對象如果是變量,那麼被定義的變量可以繼承對象變量的約束;而對象是表的列時,就不能繼承。 例子1: DECLARE credit PLS_INTEGER RANGE 1000..25000; -- 指定變量credit的數值範圍 debit credit%TYPE; -- debit變量繼承了credit變量的約束 1000..25000 v_name VARCHAR2(20); name VARCHAR2(20) NOT NULL := 'JoHn SmItH'; -- 指定變量name非空 upper_name name%TYPE := UPPER(name); -- 繼承變量name的約束NOT NULL和長度 lower_name name%TYPE := LOWER(name); init_name name%TYPE := INITCAP(name); BEGIN DBMS_OUTPUT.PUT_LINE('name: ' || name || ' upper_name: ' || upper_name || ' lower_name: ' || lower_name || ' init_name: ' || init_name); -- lower_name := 'jonathan henry smithson'; 非法,超過長度20的限制 -- lower_name := NULL; 非法,違反NOT NULL的約束 -- debit := 50000; 非法,超出範圍1000.25000 END; 例子2: CREATE TABLE employees_temp (empid NUMBER(6) NOT NULL PRIMARY KEY, deptid NUMBER(6) CONSTRAINT check_departmentid CHECK (deptid BETWEEN 100 AND 200), deptname VARCHAR2(30) DEFAULT 'Sales'); DECLARE v_empid employees_temp.empid%TYPE; v_deptid employees_temp.deptid%TYPE; v_deptname employees_temp.deptname%TYPE; BEGIN v_empid := NULL; -- 合法,沒有繼承NOT NULL -- v_empid := 10000002; -- 非法,超出長度6 v_deptid := 50; -- 合法,沒有繼承約束deptid在100與200之間 -- 沒有繼承默認值 DBMS_OUTPUT.PUT_LINE('v_deptname: ' || v_deptname); END;