Documentos de Académico
Documentos de Profesional
Documentos de Cultura
com
1
Programación de bases de datos con
PL / SQL
6-1
Registros definidos por el usuario
2
Objetivos
• Esta lección cubre los siguientes objetivos:
- Cree y manipule registros PL / SQL definidos por el usuario
PLSQL 6-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 3
Registros definidos por el usuario
3
Objetivo
• Ya sabe cómo declarar y usar estructuras de registros
PL / SQL que corresponden a los datos obtenidos por un
cursor, usando el atributo% ROWTYPE
• ¿Qué sucede si desea crear y utilizar una estructura variable
(llamada registro) que corresponde a una fila completa en un
tabla, o una vista, o una combinación de varias tablas, en lugar
de usar solo una o dos columnas?
• O tal vez necesite una estructura de registro que no
corresponda a ningún objeto (s) en la base de datos
PLSQL 6-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 4
Registros definidos por el usuario
En lecciones anteriores, vimos un registro declarado con% ROWTYPE basado en la estructura de un cursor. Ahora
examinaremos un registro basado en la estructura de una tabla mientras nos preparamos para trabajar con estructuras de
registro más complejas.
4
Registros PL / SQL
PLSQL 6-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 5
Registros definidos por el usuario
5
Estructura de un registro PL / SQL
Field1 (tipo de datos) Field2 (tipo de datos) Field3 (tipo de datos) ...
PLSQL 6-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 6
Registros definidos por el usuario
6
El problema
• La tabla EMPLOYEES contiene once columnas:
EMPLOYEE_ID, FIRST_NAME, ...., MANAGER_ID,
DEPARTMENT_ID
• Necesita codificar un SELECT * INTO nombres de variable
FROM EMPLOYEES WHERE ... en su subprograma PL / SQL
PLSQL 6-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 7
Registros definidos por el usuario
7
El problema
• Eso es mucha codificación, y algunas tablas tendrán aún
más columnas
• Además, ¿qué haces si se agrega una nueva columna a la
tabla?
• ¿O se descarta una columna existente?
PLSQL 6-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 8
Registros definidos por el usuario
8
El problema
DECLARAR
v_employee_id employee.employee_id% TYPE;
v_first_name empleados.first_name% TYPE;
v_last_name empleados.last_name% TYPE; v_email
employee.email% TYPE;
. . . SE REQUIEREN CINCO VARIABLES ESCALARES MÁS PARA COINCIDIR CON LA TABLA
v_manager_id employee.manager_id% TYPE;
v_department_id employee.department_id% TYPE;
EMPEZAR
SELECCIONE ID_empleado, primer nombre, ... OCHO MÁS AQUÍ,
departamento_id
INTO v_employee_id, v_first_name, ... Y AQUÍ,
v_department_id
DE empleados
DONDE employee_id = 100;
FIN;
PLSQL 6-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 9
Registros definidos por el usuario
9
El problema
• Mira el código de nuevo
• ¿No sería más fácil declarar una variable en lugar de
once?
• % ROWTYPE nos permite declarar una variable como un registro basado
en la estructura de una tabla en particular
PLSQL 6-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 10
Registros definidos por el usuario
10
La solución: utilice un registro PL / SQL
• Utilice% ROWTYPE para declarar una variable como un registro
basado en la estructura de la tabla EMPLOYEES
• Menos código para escribir y nada que cambiar si se
agregan o quitan columnas
DECLARAR
empleados de v_emp_record% ROWTYPE;
EMPEZAR
SELECCIONAR * EN v_emp_record
DE empleados
DONDE employee_id = 100; DBMS_OUTPUT.PUT_LINE ('Correo electrónico para'
|| v_emp_record.first_name
||
'' || v_emp_record.last_name || 'es' ||
v_emp_record.email ||
'@ oracle.com.');
FIN;
PLSQL 6-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 11
Registros definidos por el usuario
11
Un registro basado en otro registro
• Puede usar% ROWTYPE para declarar un registro basado en
otro registro:
DECLARAR
empleados de v_emp_record% ROWTYPE;
v_emp_copy_record v_emp_record% ROWTYPE ;
EMPEZAR
SELECCIONAR * EN v_emp_record
DE empleados
DONDE employee_id = 100;
v_emp_copy_record: = v_emp_record;
PLSQL 6-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 12
Registros definidos por el usuario
12
Definición de sus propios registros
• Registros PL / SQL:
- Debe contener uno o más componentes / campos de cualquier escalar o
tipo compuesto
- No son lo mismo que las filas en una tabla de base de datos
- Se le pueden asignar valores iniciales y se puede definir como NOT
NULL
- Pueden ser componentes de otros registros (registros anidados)
PLSQL 6-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 13
Registros definidos por el usuario
Los registros, incluso si se declaran con% ROWTYPE, no son lo mismo que las filas de una tabla.
Las filas de la tabla se almacenan en el disco y los datos en una fila de la tabla son permanentes (a menos que se modifiquen con DML).
Los registros se almacenan en la memoria (como otras variables) y los datos almacenados en un registro persistirán
solo durante la ejecución del bloque de código.
13
Sintaxis para registros definidos por el usuario
PLSQL 6-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 14
Registros definidos por el usuario
Los tipos de datos escalares de Oracle como VARCHAR2, DATE y NUMBER son tipos de datos predefinidos que se
declaran automáticamente (con alcance global) en cada base de datos de Oracle. Con la palabra clave TYPE,
simplemente está creando tipos de datos adicionales con una estructura personalizada para usar dentro de su bloque
de código.
los field_declaration contiene el (los) nombre (s) de campo, tipo (s) de datos y cualquier valor de inicialización como
NOT NULL o DEFAULT.
los identificador es el nombre de la variable que se declara utilizando el tipo de datos personalizado que creó.
14
Registros definidos por el usuario: ejemplo 1
PLSQL 6-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 15
Registros definidos por el usuario
15
Registros definidos por el usuario: ejemplo 1
DECLARAR
TYPE person_dept ES RECORD
(nombre_empleados.nombre_primero% TYPE,
last_name empleados.last_name% TYPE,
nombre_departamento departamentos nombre_departamento% TYPE);
v_person_dept_rec person_dept ;
EMPEZAR
SELECCIONE e.first_name, e.last_name, d.department_name
INTO v_person_dept_rec
DESDE empleados e UNIRSE a
departamentos d ON e.department_id =
d.department_id DONDE employee_id = 200;
DBMS_OUTPUT.PUT_LINE ( v_person_dept_rec.first_name || '' ||
v_person_dept_rec.last_name || 'está en el' ||
v_person_dept_rec.department_name || ' Departamento.');
FIN;
PLSQL 6-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. dieciséis
Registros definidos por el usuario
dieciséis
Registros definidos por el usuario: ejemplo 2
• Aquí tenemos dos tipos de datos personalizados, uno
anidado dentro del otro
• ¿Cuántos campos se pueden abordar
en v_emp_dept_rec?
DECLARAR
ESCRIBE dept_info_type ES REGISTRO
(departamento_id departamentos ID_departamento% TYPE,
Nombre de Departamento departamentos nombre_departamento% TYPE);
ESCRIBE emp_dept_type ES REGISTRO
(primer nombre empleados.nombre_primero% TYPE,
apellido empleados.último nombre% TIPO,
dept_info dept_info_type );
v_emp_dept_rec emp_dept_type ;
EMPEZAR
...
FIN;
PLSQL 6-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 17
Registros definidos por el usuario
v_emp_dept_rec.first_name
v_emp_dept_rec.last_name
v_emp_dept_rec.dept_info.department_id
v_emp_dept_rec.dept_info.department_name
17
Declaración y uso de tipos y registros
• Los tipos y registros son estructuras compuestas que se pueden declarar
en cualquier lugar donde las variables escalares se puedan declarar en
bloques anónimos, procedimientos, funciones, especificaciones de
paquetes (globales), cuerpos de paquetes (locales),
desencadenantes, etc.
PLSQL 6-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 18
Registros definidos por el usuario
18
Visibilidad y alcance de tipos y registros
• El tipo y el registro declarados en el bloque exterior son
visible dentro del bloque exterior y el bloque interior
• ¿Qué mostrará cada una de las PUT_LINE?
DECLARAR - bloque exterior
TIPO tipo_empleado ES REGISTRO
(nombre_empleados.nombre_primero% TYPE: = 'Amy');
v_emp_rec_outer tipo de empleado ;
EMPEZAR
DBMS_OUTPUT.PUT_LINE ( v_emp_rec_outer .primer nombre);
DECLARAR - bloque interior
v_emp_rec_inner tipo de empleado ;
EMPEZAR
v_emp_rec_outer .first_name: = 'Clara' ;
DBMS_OUTPUT.PUT_LINE ( v_emp_rec_outer . primer nombre || 'y'
|| v_emp_rec_inner.first_name) ;
FIN;
DBMS_OUTPUT.PUT_LINE ( v_emp_rec_outer .primer nombre);
FIN;
PLSQL 6-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 19
Registros definidos por el usuario
Ejecute el código en APEX y vea si sus predicciones son correctas; debería obtener:
Amy
Clara y Amy
Clara
19
Terminología
• Los términos clave utilizados en esta lección incluyen:
- Registro PL / SQL
PLSQL 6-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 20
Registros definidos por el usuario
• Registro PL / SQL: un tipo de datos compuestos que consta de un grupo de elementos de datos relacionados almacenados como
20
Resumen
• En esta lección, debería haber aprendido a:
- Cree y manipule registros PL / SQL definidos por el usuario
- Definir una estructura de registro utilizando el atributo% ROWTYPE
PLSQL 6-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 21
Registros definidos por el usuario
21
22