Trabajando con datos Compuestos

10,690 views

Published on

Academia Oracle Capitulo V:Trabajando con datos Compuestos

Published in: Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
10,690
On SlideShare
0
From Embeds
0
Number of Embeds
62
Actions
Shares
0
Downloads
120
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • Trabajando con datos Compuestos

    1. 2. <ul><li>Después de completar esta lección, debe ser capaz de: </li></ul><ul><li>Crear registro definidos por el usuario. </li></ul><ul><li>Crear un registro con el atributo %ROWTYPE. </li></ul><ul><li>Crear una tabla INDEX BY. </li></ul><ul><li>Crear una tabla de registros INDEX BY. </li></ul><ul><li>Describir la diferencia entre registros, tablas y tablas de registros </li></ul>
    2. 3. <ul><li>Dos tipos: </li></ul><ul><ul><li>RECORDS PL/SQL </li></ul></ul><ul><ul><li>Colecciones PL/SQL </li></ul></ul><ul><ul><ul><li>Tabla INDEX BY </li></ul></ul></ul><ul><ul><ul><li>Tabla anidada VARRAY </li></ul></ul></ul><ul><li>Contienen componentes internos. </li></ul><ul><li>Son reusables. </li></ul>
    3. 4. <ul><li>Tipos de datos RECORD y TABLE. </li></ul><ul><li>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. </li></ul><ul><li>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. </li></ul><ul><li>Para mayor informacion refierase a PL/SQL User’s Guide and Reference </li></ul>
    4. 5. <ul><li>Deben contener uno o más componentes de cualquier tipo de dato escalar RECORD o INDEX BY, llamados campos. </li></ul><ul><li>Son similares a los registros en un lenguaje de tercera generación (3GL). </li></ul><ul><li>No son iguales a las filas una tabla de una BD. </li></ul><ul><li>Tratan una colección de campos como una unidad lógica. </li></ul><ul><li>Son convenientes para recuperar una fila de datos de una tabla para ser procesada. </li></ul>
    5. 6. <ul><li>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. </li></ul><ul><li>Cada record definido puede tener cuantos campos sean necesarios. </li></ul><ul><li>Pueden tener valores iniciales asignados y pueden ser definidos como NOT NULL. </li></ul><ul><li>La palabra reservado DEFAULT puede ser usada cuando defina los campos. </li></ul><ul><li>Puede ser definidos y declarados en la parte declarativa de cualquier bloque, subprograma o paquete. </li></ul><ul><li>Puede declarar y referenciar records anidados. Un registro puede ser el componente de otro registro. </li></ul>
    6. 7. <ul><li>Para crear un registro, define un record y luego declara los registros de tal tipo. </li></ul><ul><li>Sintaxis </li></ul><ul><li>type_name nombre del registro. </li></ul><ul><li>filed_name nombre del campo dentro del registro. </li></ul><ul><li>filed type tipo de dato para el campo. (Puede tomar %TYPE, %ROWTYPE) </li></ul><ul><li>exp valor inicial </li></ul>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]
    7. 8. <ul><li>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. </li></ul><ul><li>El siguiente ejemplo muestra que puede usar el atributo %TYPE para especificar un tipo de dato para un campo. </li></ul><ul><li>DECLARE </li></ul><ul><li>TYPE emp_record_type IS RECORD </li></ul><ul><li>(employee_id NUMBER(6) NOT NULL :=100, </li></ul><ul><li>last_name employee.last_name%TYPE, </li></ul><ul><li>job_id employee.job_id%TYPE); </li></ul><ul><li>emp_record emp_record_type; </li></ul><ul><li>… </li></ul>
    8. 9. <ul><li>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: </li></ul><ul><li>record_name.field_name </li></ul><ul><li>En un bloque o subprograma, los registros son instanciados cuando se entra al bloque o subprograma y dejan de existir cuando se sale. </li></ul>
    9. 10. <ul><li>Declara en una variable de acuerdo a una colección de una columna en una tabla o vista de BD . </li></ul><ul><li>Prefije %ROWTYPE con el nombre de la tabla de la BD. </li></ul><ul><li>Los campos en el registro toman el nomber y tipo de datos de las columnas de la tabla o vista. </li></ul>
    10. 11. <ul><li>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. </li></ul><ul><li>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 *. </li></ul>
    11. 12. <ul><li>Declarar una variable para almacenar la informacion sobre un departamento de la tabla DEPARTMENTS. </li></ul><ul><ul><li>dept_record departments%ROWTYPE; </li></ul></ul><ul><li>Declarar una variable para almacenar la informacion sobre un empleado de la tabla EMPLOYEES. </li></ul><ul><ul><li>emp_record employees%ROWTYPE; </li></ul></ul>
    12. 13. <ul><li>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. </li></ul><ul><li>Son similares a un arreglo. </li></ul><ul><li>Deben contener dos componentes: </li></ul><ul><ul><li>Una clave primaria de tipo BINARY_INTEGER que indice la tabla. </li></ul></ul><ul><ul><li>Una columna de datos escalares o records, el cual almacena los elementos de la tabla INDEX BY. </li></ul></ul><ul><li>Puede incrementar dinámicamente, porque no tiene restricciones. </li></ul>
    13. 14. <ul><li>Hay dos pasos involucrados: </li></ul><ul><ul><li>Declarar un tipo de tabla TABLE. </li></ul></ul><ul><ul><li>Declarar una variable de tal tipo. </li></ul></ul>
    14. 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… … END; /
    15. 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 LAST 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.
    16. 17. <ul><li>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. </li></ul><ul><li>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. </li></ul>
    17. 18. <ul><li>Define una variable TABLE con un tipo de datos PL/SQL permitidos. </li></ul><ul><li>Declarar una variable PL/SQL para guardar la información de un departamento. </li></ul><ul><li>Ejemplo: </li></ul>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.
    18. 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); END LOOP; END; /
    19. 20. <ul><li>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. </li></ul><ul><li>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. </li></ul><ul><li>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. </li></ul><ul><li>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: </li></ul><ul><li>EXISTS, COUNT, LIMIT, FIRST y LAST, PRIOR y LAST, TRIM y DELETE. </li></ul><ul><li>El atributo %ROWTYPE es usado para declarar una variable compuesta cuyo tipo es ele mismo de una fila en una tabla de una BD. </li></ul>

    ×