Registros PL/SQL

    Cuando vimos los tipos de datos, omitimos intencionadamente ciertos tipos de datos.

    Estos son:

Declaración de un registro.

    Un registnslpwdro es una estructura de datos en PL/SQL, almacenados en campos, cada uno de los cuales tiene su propio nombre y tipo y que se tratan como una sola unidad lógica.

    Los campos de un registro pueden ser inicializados y pueden ser definidos como NOT NULL. Aquellos campos que no sean inicializados explícitamente, se inicializarán a NULL.

    La sintaxis general es la siguiente:


TYPE <nombre> IS RECORD
(
campo <tipo_datos> [NULL | NOT NULL]
[,<tipo_datos>...]
);

    El siguiente ejemplo crea un tipo PAIS, que tiene como campos el código, el nombre y el continente.


TYPE
PAIS IS RECORD
(
CO_PAIS NUMBER ,
DESCRIPCION VARCHAR2(50),
CONTINENTE VARCHAR2(20)

);

    Los registros son un tipo de datos, por lo que podremos declarar variables de dicho tipo de datos.


DECLARE

TYPE
PAIS IS RECORD
(
CO_PAIS NUMBER ,
DESCRIPCION VARCHAR2(50),
CONTINENTE VARCHAR2(20)
);
/* Declara una variable identificada por miPAIS de tipo PAIS 
Esto significa que la variable miPAIS tendrá los campos
ID, DESCRIPCION y CONTINENTE.

*/

miPAIS PAIS;
BEGIN
/* Asignamos valores a los campos de la variable.

*/
miPAIS.CO_PAIS := 27;
miPAIS.DESCRIPCION := 'ITALIA';
miPAIS.CONTINENTE := 'EUROPA';


END;

    Los registros pueden estar anidados. Es decir, un campo de un registro puede ser de un tipo de dato de otro registro.


DECLARE
 TYPE PAIS IS RECORD
 (CO_PAIS     NUMBER  ,
  DESCRIPCION VARCHAR2(50),
CONTINENTE  VARCHAR2(20)
 ); 
 TYPE MONEDA IS RECORD
 ( DESCRIPCION VARCHAR2(50),
   PAIS_MONEDA PAIS );
 
 miPAIS PAIS;
 miMONEDA MONEDA;
BEGIN
     /* Sentencias
*/

END;

    Pueden asignarse todos los campos de un registro utilizando una sentencia SELECT. En este caso hay que tener cuidado en especificar las columnas en el orden conveniente según la declaración de los campos del registro. Para este tipo de asignación es muy frecuente el uso del atributo %ROWTYPE que veremos más adelante.


SELECT
CO_PAIS, DESCRIPCION, CONTINENTE
INTO miPAIS
FROM PAISES
WHERE CO_PAIS = 27;

     Puede asignarse un registro a otro cuando sean del mismo tipo:


DECLARE

TYPE
PAIS IS RECORD ...
miPAIS PAIS;
otroPAIS PAIS;
BEGIN

miPAIS.CO_PAIS := 27;
miPAIS.DESCRIPCION := 'ITALIA';
miPAIS.CONTINENTE := 'EUROPA';
otroPAIS := miPAIS;



END;

 
Declaración de registros con el atributo %ROWTYPE


    Se puede declarar un registro basándose en una colección de columnas de una tabla, vista o cursor de la base de datos mediante el atributo %ROWTYPE.

    Por ejemplo, si tengo una tabla PAISES declarada como:


CREATE TABLE PAISES(
CO_PAIS          NUMBER,
DESCRIPCION      VARCHAR2(50),
CONTINENTE  VARCHAR2(20) );

    Puedo declarar una variable de tipo registro como PAISES%ROWTYPE;


DECLARE
miPAIS PAISES%ROWTYPE;
BEGIN
/* Sentencias ... */
END;

     Lo cual significa que el registro miPAIS tendrá la siguiente estructura: CO_PAIS NUMBER, DESCRIPCION VARCHAR2(50), CONTINENTE VARCHAR2(20).

    De esta forma se crea el registro de forma dinamic y se podrán asignar valores a los campos de un registro a través de un select sobre la tabla, vista o cursor a partir de la cual se creo el registro.

 

Pedro  Herrarte  Sánchez
Registros PL/SQL
Pedro Herrarte Sánchez

Pedro Herrarte, es consultor independiente, ofreciendo servicios de consultoría, análisis, desarrollo y formación. Posee mas de diez años de experiencia trabajando para las principales empresas de España. Es especialista en tecnologías .NET, entornos Web (ASP.NET, ASP.NET MVC,jQuery, HTML5), bases de datos (SQL Server y ORACLE) e integración de sistemas. Es experto en desarrollo (C#, VB.Net, T-SQL, PL/SQL, , ASP, CGI , C, Pro*C, Java, Essbase, Vignette, PowerBuilder y Visual Basic ...) y bases de datos (SQL Server y ORACLE). Pedro es MCP y MAP 2012, es fundador, diseñador y programador de www.devjoker.com..
Fecha de alta:14/07/2006
Última actualizacion:14/07/2006
Visitas totales:155706
Valorar el contenido:
Últimas consultas realizadas en los foros
Últimas preguntas sin contestar en los foros de devjoker.com