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