Cuántas veces no has deseado cambiarle el nombre a las cosas por alguno más común para ti. Precisamente, esa es la posibilidad que nos ofrece PL/SQL con la utilización de los subtipos.
PL/SQL nos permite definir subtipos de tipos de datos para darles un nombre diferente y así aumentar la legibilidad de nuestros programas. Los tipos de operaciones aplicables a estos subtipos serán las mismas que los tipos de datos de los que proceden. La sintaxis será:
SUBTYPE subtipo IS tipo_base;
Donde subtipo será el nombre
que le demos a nuestro subtipo y tipo_base
será cualquier tipo de dato en PL/SQL.
A la hora de especificar el tipo base, podemos utilizar el modificador %TYPE
para indicar el tipo de dato de una variable o de una columna de la base de datos y %ROWTYPE
para especificar el tipo de un cursor o tabla de una base de datos.
SUBTYPE id_familia IS familias.identificador%TYPE; -- Permite nombrar a la columna identificador de la tabla famiias con el nombre id_familia.
SUBTYPE agente IS agentes%ROWTYPE; -- Permite nombrar a las filas de la tabla agentes con el nombre agente
Los subtipos no podemos restringirlos, pero podemos usar un truco para conseguir el mismo efecto y es por medio de una variable auxiliar:
SUBTYPE apodo IS varchar2(20); --ilegal
aux varchar2(20);
SUBTYPE apodo IS aux%TYPE; --legal
Los subtipos son intercambiables con su tipo base. También son intercambiables si tienen el mismo tipo base o si su tipo base pertenece a la misma familia:
DECLARE
SUBTYPE numero IS NUMBER;
numero_tres_digitos NUMBER(3);
mi_numero_de_la_suerte numero;
SUBTYPE encontrado IS BOOLEAN;
SUBTYPE resultado IS BOOLEAN;
lo_he_encontrado encontrado;
resultado_busqueda resultado;
SUBTYPE literal IS CHAR;
SUBTYPE sentencia IS VARCHAR2;
literal_nulo literal;
sentencia_vacia sentencia;
BEGIN
...
numero_tres_digitos := mi_numero_de_la_suerte; --legal
...
lo_he_encontrado := resultado_busqueda; --legal
...
sentencia_vacia := literal_nulo; --legal
...
END;
Los cursores permiten recorrer los registros que devuelve una consulta SQL almacenados en memoria.