Loading...
Flash Player 9 (or above) is needed to view slideshows. We have detected that you do not have it on your computer.To install it, go here
Trabajando con datos Compuestos
Academia Oracle Capitulo V:Trabajando con datos Compuestos
1106 views | comments | 0 favorites | 19 downloads | 0 embeds (Stats)
More Info
This slideshow is Public
Total Views: 1106 on Slideshare: 1106 from embeds: 0
Slideshow Transcript
- Slide 2: 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
- Slide 3: Dos tipos:
◦ RECORDS PL/SQL
◦ Colecciones PL/SQL
Tabla INDEX BY
Tabla anidada VARRAY
Contienen componentes internos.
Son reusables.
- Slide 4: 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
- Slide 5: 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
- Slide 6: 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.
- Slide 7: 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]
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
- Slide 8: 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.
DECLARE
TYPE 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;
…
- Slide 9: 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_name
En un bloque o subprograma, los registros
son instanciados cuando se entra al bloque o
subprograma y dejan de existir cuando se
sale.
- Slide 10: 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.
- Slide 11: 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
*.
- Slide 12: 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;
- Slide 13: 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.
- Slide 14: Hay dos pasos involucrados:
◦ Declarar un tipo de tabla TABLE.
◦ Declarar una variable de tal tipo.
- Slide 15: DECLARE
TYPE ename_table_type IS TABLE OF
employees.last_name%TYPE
INDEX BY BINARY_INTEGER;
TYPE hiredate_table_type IS TABLE OF DATE
INDEX 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) THEN
INSERT INTO…
…
- Slide 16: 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.
FIRST Devuelve el primer y ultimo (el más pequeño y más grande)
LAST í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.
- Slide 17: 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.
- Slide 18: 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%ROWTYPE
INDEX BY BINARY_INTEGER;
dept_table dept_table_type ;
--cada elemento de dept_table es un registro.
- Slide 19: SET SERVEROUTPUT ON
DECLARE
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 employees
WHERE 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);
- Slide 20: 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.