Sunteți pe pagina 1din 24

Trabajar con Tipos de Dato Compuestos

Copyright 2004, Oracle. Todos los derechos reservados.

Objetivos

Al finalizar esta leccin, debera estar capacitado para lo siguiente: Crear registros PL/SQL 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

Copyright 2004, Oracle. Todos los derechos reservados.

Tipos de Dato Compuestos


Pueden contener varios valores, a diferencia de los tipos escalares Existen dos tipos:
Registros PL/SQL Recopilaciones PL/SQL Matrices asociativas o tablas INDEX BY Tabla anidada VARRAY

Copyright 2004, Oracle. Todos los derechos reservados.

Tipos de Dato Compuestos

Utilizar registros PL/SQL para almacenar valores de distintos tipos de dato, pero slo una incidencia cada vez. Utilizar recopilaciones PL/SQL cuando desee almacenar valores del mismo tipo de dato.

Copyright 2004, Oracle. Todos los derechos reservados.

Registros PL/SQL

Deben contener uno o ms componentes de cualquier tipo de dato escalar, RECORD o de tabla INDEX BY, denominados campos Son similares a las estructuras en la mayora de los lenguajes 3GL, incluidos C y C++ Estn definidos por el usuario y pueden ser el subjuego de una fila en una tabla Tratan una recopilacin de campos como una unidad lgica Resultan convenientes para recuperar una fila de datos de una tabla para su procesamiento

Copyright 2004, Oracle. Todos los derechos reservados.

Creacin de un Registro PL/SQL

Sintaxis:

TYPE type_name IS RECORD (field_declaration[, field_declaration]);

identifier

type_name;

field_declaration:
field_name {field_type | variable%TYPE | table.column%TYPE | table%ROWTYPE} [[NOT NULL] {:= | DEFAULT} expr]

Copyright 2004, Oracle. Todos los derechos reservados.

Creacin de un Registro PL/SQL

Declarar variables para almacenar el nombre, el trabajo y el salario de un nuevo empleado. Ejemplo:
... TYPE emp_record_type IS RECORD (last_name VARCHAR2(25), job_id VARCHAR2(10), salary NUMBER(8,2)); emp_record emp_record_type; ...

Copyright 2004, Oracle. Todos los derechos reservados.

Estructura de Registro PL/SQL

Campo 1 (tipo de dato)

Campo 2 (tipo de dato) Campo 3 (tipo de dato)

Ejemplo:
Campo 1 (tipo de dato) Campo 2 (tipo de dato) Campo 3 (tipo de dato)
employee_id number(6)
100

last_name varchar2(25)
King

job_id varchar2(10)
AD_PRES

Copyright 2004, Oracle. Todos los derechos reservados.

Atributo %ROWTYPE

Declarar una variable segn la recopilacin de columnas en una vista o tabla de base de datos. Anteponer %ROWTYPE con la vista o tabla de base de datos. Los campos del registro toman los nombres y los tipos de dato de las columnas de la tabla o vista.

Sintaxis:
DECLARE identifier reference%ROWTYPE;

Copyright 2004, Oracle. Todos los derechos reservados.

Ventajas del Uso de %ROWTYPE

No es necesario conocer el nmero y los tipos de dato de las columnas subyacentes de base de datos. Puede que el nmero y los tipos de dato de la columna subyacente de base de datos cambien en tiempo de ejecucin. El atributo resulta til al recuperar una fila con la sentencia SELECT *.

Copyright 2004, Oracle. Todos los derechos reservados.

Atributo %ROWTYPE
...
DEFINE employee_number = 124
DECLARE emp_rec BEGIN SELECT * INTO emp_rec FROM employees employees%ROWTYPE;

WHERE

employee_id = &employee_number;

INSERT INTO retired_emps(empno, ename, job, mgr, hiredate, leavedate, sal, comm, deptno) VALUES (emp_rec.employee_id, emp_rec.last_name, emp_rec.job_id,emp_rec.manager_id,

emp_rec.hire_date, SYSDATE, emp_rec.salary,


emp_rec.commission_pct, emp_rec.department_id); END; /

Copyright 2004, Oracle. Todos los derechos reservados.

Insercin de un Registro mediante %ROWTYPE


...
DEFINE employee_number = 124
DECLARE emp_rec BEGIN SELECT employee_id, last_name, job_id, manager_id, retired_emps%ROWTYPE;

hire_date, hire_date, salary, commission_pct,


department_id INTO emp_rec FROM employees WHERE END; / SELECT * FROM retired_emps; employee_id = &employee_number; INSERT INTO retired_emps VALUES emp_rec;

Copyright 2004, Oracle. Todos los derechos reservados.

Actualizacin de una Fila en una Tabla mediante un Registro


SET SERVEROUTPUT ON SET VERIFY OFF DEFINE employee_number = 124 DECLARE emp_rec BEGIN retired_emps%ROWTYPE;

SELECT * INTO emp_rec FROM retired_emps;


emp_rec.leavedate:=SYSDATE; UPDATE retired_emps SET ROW = emp_rec WHERE empno=&employee_number; END;

/
SELECT * FROM retired_emps;

Copyright 2004, Oracle. Todos los derechos reservados.

Matrices Asociativas o Tablas INDEX BY

Son estructuras PL/SQL con dos columnas:


Cadena o entero de tipo de clave primaria Columna de tipo de dato escalar o de registro

No tienen lmite en cuanto a tamao. No obstante, el tamao depender de los valores que pueda contener el tipo de dato clave.

Copyright 2004, Oracle. Todos los derechos reservados.

Creacin de una Tabla INDEX BY


Sintaxis:
TYPE type_name IS TABLE OF {column_type | variable%TYPE | table.column%TYPE} [NOT NULL] | table%ROWTYPE [INDEX BY PLS_INTEGER | BINARY_INTEGER | VARCHAR2(<size>)]; identifier type_name;

Declarar una tabla INDEX BY para almacenar los apellidos de los empleados.
... TYPE ename_table_type IS TABLE OF employees.last_name%TYPE INDEX BY PLS_INTEGER; ... ename_table ename_table_type;
Copyright 2004, Oracle. Todos los derechos reservados.

Estructura de la Tabla INDEX BY

Clave nica ...


1 5 3 ...

Valor ...
Jones Smith Maduro ...

PLS_INTEGER

Escalar

Copyright 2004, Oracle. Todos los derechos reservados.

Creacin de una Tabla INDEX BY


DECLARE TYPE ename_table_type IS TABLE OF employees.last_name%TYPE INDEX BY PLS_INTEGER; TYPE hiredate_table_type IS TABLE OF DATE INDEX BY PLS_INTEGER; ename_table ename_table_type; hiredate_table hiredate_table_type; BEGIN ename_table(1) := 'CAMERON'; hiredate_table(8) := SYSDATE + 7; IF ename_table.EXISTS(1) THEN INSERT INTO ... ... END;

Copyright 2004, Oracle. Todos los derechos reservados.

Uso de los Mtodos de Tablas INDEX BY

Los siguientes mtodos facilitan el uso de las tablas INDEX BY: EXISTS COUNT PRIOR NEXT DELETE

FIRST y LAST

Copyright 2004, Oracle. Todos los derechos reservados.

Tabla de Registros INDEX BY

Defina una variable de tabla INDEX BY para contener una fila completa de una tabla. Ejemplo:
DECLARE TYPE dept_table_type IS TABLE OF departments%ROWTYPE INDEX BY PLS_INTEGER; dept_table dept_table_type; -- Each element of dept_table is a record

Copyright 2004, Oracle. Todos los derechos reservados.

Ejemplo de Tabla de Registros INDEX BY


SET SERVEROUTPUT ON DECLARE TYPE emp_table_type IS TABLE OF employees%ROWTYPE INDEX BY PLS_INTEGER; my_emp_table emp_table_type; max_count NUMBER(3):= 104; BEGIN FOR i IN 100..max_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; /

Copyright 2004, Oracle. Todos los derechos reservados.

Tablas Anidadas

1 2 3

Bombay Sydney Oxford

4 ..
2 GB

Londres ....

Copyright 2004, Oracle. Todos los derechos reservados.

VARRAY

1 2 3

Bombay Sydney Oxford

4 ..
10

Londres ....
Tokio

Copyright 2004, Oracle. Todos los derechos reservados.

Resumen

En esta leccin, debe haber aprendido lo siguiente: Definir y hacer referencia a variables PL/SQL de tipos de dato compuestos:
Registros PL/SQL Tablas INDEX BY Tabla de registros INDEX BY

Definir un registro PL/SQL mediante el atributo


%ROWTYPE

Copyright 2004, Oracle. Todos los derechos reservados.

Prctica 6: Visin General

En esta prctica se abordan los siguientes temas: Declaracin de las tablas INDEX BY Procesamiento de datos mediante las tablas
INDEX BY

Declaracin de un registro PL/SQL Procesamiento de datos mediante un registro PL/SQL

Copyright 2004, Oracle. Todos los derechos reservados.

S-ar putea să vă placă și