segunda-feira, 27 de fevereiro de 2012

List and describe various data types using the %TYPE attribute


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); 


Nenhum comentário:

Postar um comentário