Trabajando con datos Compuestos

20

description

Academia Oracle Capitulo V:Trabajando con datos Compuestos

Transcript of Trabajando con datos Compuestos

Page 1: Trabajando con datos Compuestos
Page 2: Trabajando con datos Compuestos

Después de completar esta lección, debe ser capaz de:

Crear registro definidos por el usuario. Crear un registro con el atributo

%ROWTYPE. Crear una tabla INDEX BY. Crear una tabla de registros INDEX BY. Describir la diferencia entre registros, tablas

y tablas de registros

Page 3: Trabajando con datos Compuestos

Dos tipos:◦ RECORDS PL/SQL◦ Colecciones PL/SQL

Tabla INDEX BY Tabla anidada VARRAY

Contienen componentes internos. Son reusables.

Page 4: Trabajando con datos Compuestos

Tipos de datos RECORD y TABLE. Al igual que las variables escalares, las variables compuestas

tienen un tipo de datos. Los tipos de datos compuestos (también conocidos como colecciones) son RECORD, TABLE, NESTED TABLE y VARRAY. Usamos el tipo de datos RECORD para tratar como una unidadalógica datos relacionados pero distintos . Usamos la TABLE para referenciar y manipular colecciones de datos como un objeto entero. Los tipos de datos VARRAY Y NESTED TABLE son cubiertos en el curso Advanced PL/SQL.

Un record (registro) es un grupo de datos relacionados almacenados como campos, cada uno posee su propio nombre y tipo de dato. Una tabla contiene una columna y una clave primaria para otorgar un acceso array-like a las filas. Despues de ser definidos, las tablas y registros pueden ser reusados.

Para mayor informacion refierase a PL/SQL User’s Guide and Reference

Page 5: Trabajando con datos Compuestos

Deben contener uno o más componentes de cualquier tipo de dato escalar RECORD o INDEX BY, llamados campos.

Son similares a los registros en un lenguaje de tercera generación (3GL).

No son iguales a las filas una tabla de una BD.

Tratan una colección de campos como una unidad lógica.

Son convenientes para recuperar una fila de datos de una tabla para ser procesada.

Page 6: Trabajando con datos Compuestos

Un record es un grupo de datos relacionados almacenados en campos, cada uno de los cuales posee su nombre y tipo de dato. Un record que contiene campos para nombre, salario, y fecha de contratación de un empleado le permite tratar los datos como una unidad lógica.

Cada record definido puede tener cuantos campos sean necesarios.

Pueden tener valores iniciales asignados y pueden ser definidos como NOT NULL.

La palabra reservado DEFAULT puede ser usada cuando defina los campos.

Puede ser definidos y declarados en la parte declarativa de cualquier bloque, subprograma o paquete.

Puede declarar y referenciar records anidados. Un registro puede ser el componente de otro registro.

Page 7: Trabajando con datos Compuestos

Para crear un registro, define un record y luego declara los registros de tal tipo. Sintaxis

type_name nombre del registro.filed_name nombre del campo dentro del registro.filed type tipo de dato para el campo. (Puede tomar %TYPE,

%ROWTYPE)exp valor inicial

Sintaxis:TYPE type_name IS RECORD

(field_declaration[, field_declaration]…);Identifier type_name;

Sintaxis:TYPE type_name IS RECORD

(field_declaration[, field_declaration]…);Identifier type_name;

Field_name {field_type |variable%TYPE |table.column%TYPE|table%ROWTYPE}

[[NOT NULL] {:= | DEFAULT} expr]

Field_name {field_type |variable%TYPE |table.column%TYPE|table%ROWTYPE}

[[NOT NULL] {:= | DEFAULT} expr]

Page 8: Trabajando con datos Compuestos

Las declaraciones de los campos son como declaraciones de las variables. Cada campo tiene un único nombre y un tipo de dato específico. No hay tipos de datos predefinidos para los registros PL/SQL, como para las variables escalares. Por lo tanto, debe ser creados primero y luego declarar un identificador de tal tipo.

El siguiente ejemplo muestra que puede usar el atributo %TYPE para especificar un tipo de dato para un campo.

DECLARETYPE emp_record_type IS RECORD(employee_id NUMBER(6) NOT NULL :=100,last_name employee.last_name%TYPE,job_id employee.job_id%TYPE);

emp_record emp_record_type;…

Page 9: Trabajando con datos Compuestos

Los campos en un registro son accedidos por su nombre. Para referenciar o inicializar un campo individual, usa una notación de puntos con la siguiente sintaxis:record_name.field_nameEn un bloque o subprograma, los registros son instanciados cuando se entra al bloque o subprograma y dejan de existir cuando se sale.

Page 10: Trabajando con datos Compuestos

Declara en una variable de acuerdo a una colección de una columna en una tabla o vista de BD .

Prefije %ROWTYPE con el nombre de la tabla de la BD.

Los campos en el registro toman el nomber y tipo de datos de las columnas de la tabla o vista.

Page 11: Trabajando con datos Compuestos

Usar el atributo %ROWTYPE cuando no esté seguro de la estructura de la tabla de la base de datos. Usando este atributo tambien asegura que los tipos de datos de las variables declaradas cambian dinámicamente, en caso de cambio de que la tabla usada sea alterada.

Este atributo es particularmente util cuando se quiere recuperar una fila completa. En ausencia de este atributo se debe declarar una variable por cada columna recuperada por la sentencia select *.

Page 12: Trabajando con datos Compuestos

Declarar una variable para almacenar la informacion sobre un departamento de la tabla DEPARTMENTS.dept_record departments%ROWTYPE;

Declarar una variable para almacenar la informacion sobre un empleado de la tabla EMPLOYEES.

emp_record employees%ROWTYPE;

Page 13: Trabajando con datos Compuestos

Los objetos del tipo tabla son llamados tablas INDEX BY. Son modeladas como (pero no iguales a) tablas de una bd. Usan una clave primaria para proveer un acceso array-like a las filas.

Son similares a un arreglo. Deben contener dos componentes:

◦ Una clave primaria de tipo BINARY_INTEGER que indice la tabla.

◦ Una columna de datos escalares o records, el cual almacena los elementos de la tabla INDEX BY.

Puede incrementar dinámicamente, porque no tiene restricciones.

Page 14: Trabajando con datos Compuestos

Hay dos pasos involucrados:◦ Declarar un tipo de tabla TABLE.◦ Declarar una variable de tal tipo.

Page 15: Trabajando con datos Compuestos

DECLARETYPE ename_table_type IS TABLE OF

employees.last_name%TYPEINDEX BY BINARY_INTEGER;

TYPE hiredate_table_type IS TABLE OF DATEINDEX BY BINARY_INTEGER;

ename_table ename_table_type;hiredate_table hiredate_table_type;BEGIN ename_table(1) :=‘CAMERON’; hiredate_table(1):=SYSDATE +7;

IF ename_table.EXISTS(1) THENINSERT INTO…

…END;/

Page 16: Trabajando con datos Compuestos

Metodo Descripcion

EXISTS(n) Devuelve TRUE si el elemento de la posicion n en la tabla existe.

COUNT Retorna el numero de elementos que una tabla PL/SQL actualmente contiene.

FIRSTLAST

Devuelve el primer y ultimo (el más pequeño y más grande) índice en una tabla PL/SQL. Devuelve NULL si la tabla está vacía.

PRIOR(n) Devuelve el número del índice que precede al índice n en una tabla PL/SQL.

NEXT(n) Devuelve el número del índice que sigue al índice n en una tabla PL/SQL.

TRIM Remueve un elemento del final de una tabla PL/SQL.TRIM(n) remueve n elementos del final de una tabla PL/SQL.

DELETE DELETE remueve todos los elementos de una tabla PL/SQL.DELETE(n) remueve n elementos de una tabla PL/SQL.DELETE (m,n) remueve todos los elementos en un rango m …n de una tabla PL/SQL.

Page 17: Trabajando con datos Compuestos

En algún momento sólo puede almacenar los detallas de cualquiera de las columnas de una tabla de una BD. Siempre existe la necesidad de almacenar todas las columnas devueltas por una consulta. La Tabla de registros INDEX BY ofrece una solucion a esto. Poque sólo una definicion de una tabla es necesitada para guardar la informacion de todos los campos de una tabla de una BD, la tabla de registros incrementa grandemente la funcionalidad de una tabla INDEX BY.

Puede usar el atributo %ROWTYPE para declarar un registro que representa una fila en una tabla de una BD. La diferencia entre el atributo %ROWTYPE y el tipo de dato compuesto RECORD es que RECORD le permite especificar los tipos de datos de los campos en el registro o declarar los campos de su gusto.

Page 18: Trabajando con datos Compuestos

Define una variable TABLE con un tipo de datos PL/SQL permitidos.

Declarar una variable PL/SQL para guardar la información de un departamento.

Ejemplo:

DECLARE TYPE dept_table_type IS TABLE OF

departments%ROWTYPEINDEX BY BINARY_INTEGER;

dept_table dept_table_type ;--cada elemento de dept_table es un registro.

DECLARE TYPE dept_table_type IS TABLE OF

departments%ROWTYPEINDEX BY BINARY_INTEGER;

dept_table dept_table_type ;--cada elemento de dept_table es un registro.

Page 19: Trabajando con datos Compuestos

SET SERVEROUTPUT ONDECLARE TYPE emp_table_type IS TABLE OF

departments%ROWTYPE INDEX BY BINARY_INTEGER; my emp_table emp_table_type; v_count NUMBER(3):=104;BEGIN FOR i IN 100..v_count LOOP

SELECT * INTO my_emp_table(i) FROM employeesWHERE employee_id = i;

END LOOP; FOR i IN my_emp_table.FIRST.. my_emp_table.LAST LOOP

DBMS_OUTPUT.PUT_LINE(my_emp_table(i).last_name); END LOOP;END;/

SET SERVEROUTPUT ONDECLARE TYPE emp_table_type IS TABLE OF

departments%ROWTYPE INDEX BY BINARY_INTEGER; my emp_table emp_table_type; v_count NUMBER(3):=104;BEGIN FOR i IN 100..v_count LOOP

SELECT * INTO my_emp_table(i) FROM employeesWHERE employee_id = i;

END LOOP; FOR i IN my_emp_table.FIRST.. my_emp_table.LAST LOOP

DBMS_OUTPUT.PUT_LINE(my_emp_table(i).last_name); END LOOP;END;/

Page 20: Trabajando con datos Compuestos

Un registro PL/SQL es una colección de campos individuales que representan a una fila en una tabla. Usando registros puede agrupar los datos en una estructura y luego manipular esta estructura como una entidad o unidad lógica. Esto reduce código, y vuelve al código más fácil de mantener y entender.Al igual que los registros PL/SQL, la tabla es otro tipo de dato compuesto. Las TABLAS INDEX BY son objetos tipo tabla similares a las tablas de una bd. Pero como una pequeña diferencia las tablas usan una clave primaria para otorgar el acceso como a un arreglo (array-like). El tamaño de una tabla INDEX BY esta irrestricto. Pueden tener una columna y una clave primaria. Las columnas pueden tener cualquier tipo de datos, pero la clave primaria debe ser BINARY_INTEGER.La tabla de registros INDEX BY realza la funcionalidad de las tablas INDEX BY, porque solo una definicion de tabla es requerida para guardar la información de todos los campos.Los siguientes métodos ayudan a generalizar código, hacen las colecciones más fáciles de mantener, y vuelven las aplicaciones más fáciles de mantener:EXISTS, COUNT, LIMIT, FIRST y LAST, PRIOR y LAST, TRIM y DELETE.El atributo %ROWTYPE es usado para declarar una variable compuesta cuyo tipo es ele mismo de una fila en una tabla de una BD.