O %TYPE atributo permite que use o tipo de dados de um campo, registro, tabela aninhada, coluna banco de dados, ou variável em sua próprias declarações, ao invés de codificar os nomes de tipo. Você pode usar o%TYPE atributo como um especificador de tipo de dados ao declarar constantes, variáveis, campos e parâmetros. Se os tipos que você faz referência a mudança, suas declarações são atualizados automaticamente.Esta técnica evita que você fazer alterações no código, quando, por exemplo, o comprimento de um VARCHAR2 coluna é aumentada. Note-se que restrições de coluna, como o NOT NULL restrição e cheque, ou os valores padrão não são herdadas por itens declarados utilizando %TYPE .
DECLARE
SUBTYPE v_empid_subtype IS employees_temp.empid%TYPE;
SUBTYPE v_deptid_subtype IS employees_temp.deptid%TYPE;
SUBTYPE v_deptname_subtype IS employees_temp.deptname%TYPE;
SUBTYPE v_emprec_subtype IS employees_temp%ROWTYPE;
v_empid v_empid_subtype;
v_deptid v_deptid_subtype;
v_deptname v_deptname_subtype;
v_emprec v_emprec_subtype;
BEGIN
v_empid := NULL; -- this works, null constraint is not inherited
-- v_empid := 10000002; -- invalid, number precision too large
v_deptid := 50; -- this works, check constraint is not inherited
-- the default value is not inherited in the following
DBMS_OUTPUT.PUT_LINE('v_deptname: ' || v_deptname);
v_emprec.empid := NULL; -- this works, null constraint is not inherited
-- v_emprec.empid := 10000002; -- invalid, number precision too large
v_emprec.deptid := 50; -- this works, check constraint is not inherited
-- the default value is not inherited in the following
DBMS_OUTPUT.PUT_LINE('v_emprec.deptname: ' || v_emprec.deptname);
END;
employees_temp.empid é do tipo number(6). Sendo assim, quando dizemos SUBTYPE v_empid_subtype IS employees_temp.empid%TYPE;, estamos criando um subtipo chamado v_empid_subtype, que é do mesmo tipo da coluna employees_temp.empid, ou seja, number(6); portanto, ao declararmos a variável v_empid como sendo do subtipo v_empid_subtype, sabemos que ela será do tipo number(6);