Saltar la navegación

3.1.- Registros.

El uso de los registros es algo muy común en los lenguajes de programación. PL/SQL también nos ofrece este tipo de datos. En este apartado veremos qué son y cómo definirlos y utilizarlos.

Un registro es un grupo de elementos relacionados, referenciados por un único nombre, almacenados en campos, cada uno de los cuales tiene su propio nombre y tipo de dato.

Por ejemplo, una dirección podría ser un registro con campos como calle, número, piso, puerta, código postal, ciudad, provincia y país. Los registros hacen que la información sea más fácil de organizar y representar. Para declarar un registro seguiremos la siguiente sintaxis:

TYPE nombre_tipo IS RECORD (decl_campo[, decl_campo] ...);
 

donde:

decl_campo := nombre tipo [[NOT NULL] {:=|DEFAULT} expresion]

El tipo del campo será cualquier tipo de dato válido en PL/SQL excepto REF CURSOR. La expresión será cualquier expresión que evalúe al tipo de dato del campo.

TYPE direccion IS RECORD
(
calle          VARCHAR2(50),
numero          INTEGER(4),
piso          INTEGER(4),
puerta          VARCHAR2(2),
codigo_postal     INTEGER(5),
ciudad          VARCHAR2(30),
provincia     VARCHAR2(20),
pais          VARCHAR2(20) := ‘España’
);
mi_direccion direccion;
 

Para acceder a los campos usaremos el operador punto.

...
mi_direccion.calle := ‘Ramirez Arellano’;

mi_direccion.numero := 15;

...

Para asignar un registro a otro, éstos deben ser del mismo tipo, no basta que tengan el mismo número de campos y éstos emparejen uno a uno. Tampoco podemos comparar registros aunque sean del mismo tipo, ni tampoco comprobar si éstos son nulos. Podemos hacer SELECT en registros, pero no podemos hacer INSERT desde registros.

DECLARE
TYPE familia IS RECORD
(
     identificador     NUMBER,
     nombre          VARCHAR2(40),
     padre          NUMBER,
     oficina          NUMBER
);
TYPE familia_aux IS RECORD
(
     identificador     NUMBER,
     nombre          VARCHAR2(40),
     padre          NUMBER,
     oficina          NUMBER
     );
     SUBTYPE familia_fila IS familias%ROWTYPE; -- tendrá los mismos campos que tenga la tabla familias
     mi_fam familia;
     mi_fam_aux familia_aux;
     mi_fam_fila familia_fila;
BEGIN
...
mi_fam := mi_fam_aux;                         --ilegal
mi_fam := mi_fam_fila;                         --legal
IF mi_fam IS NULL THEN ...                    --ilegal
IF mi_fam = mi_fam_fila THEN ...               --ilegal
SELECT * INTO mi_fam FROM familias ...          --legal
INSERT INTO familias VALUES (mi_fam_fila);          --ilegal
...
END;
/