Está en la página 1de 22

Traducido del inglés al español - www.onlinedoctranslator.

com

1
Programación de bases de datos con
PL / SQL
6-1
Registros definidos por el usuario

Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos.

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

• Un registro PL / SQL es un tipo de datos compuestos que consta de un grupo


de elementos de datos relacionados almacenados como campos, cada uno con
su propio nombre y tipo de datos.

• Puede hacer referencia a todo el registro por su nombre y / oa


campos individuales por sus nombres
• La sintaxis típica para definir un registro se muestra a continuación.
• Este código define un registro basado en la estructura de un
fila dentro de la tabla nombrada

nombre_registro nombre de la tabla% ROWTYPE;

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

• Usted hace referencia a cada campo colocando un prefijo de punto en su nombre


de campo con el nombre de registro: nombre_registro.nombre_campo

• Por ejemplo, hace referencia al campo job_id en el


v_emp_record registro de la siguiente manera:
- v_emp_record.job_id

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

• ¿Cuántas variables escalares debe DECLARAR para mantener


los valores de la columna?

PLSQL 6-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 7
Registros definidos por el usuario

Respuesta: once, uno para cada columna de la tabla.

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

• Cada campo o componente dentro del registro tendrá su


propio nombre y tipo de datos según la estructura de la tabla.
• Puede hacer referencia a todo el registro por su nombre y
a los campos individuales por sus nombres

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;

v_emp_copy_record.salary: = v_emp_record.salary * 1.2 ;

DBMS_OUTPUT.PUT_LINE ( v_emp_record.first_name || '' ||


v_emp_record.last_name || ': Salario anterior -' ||
v_emp_record.salary || ', Nuevo salario propuesto -' ||
v_emp_copy_record.salary || '.'); FIN;

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

• ¿Qué sucede si necesita datos de una combinación de varias tablas?


• Puede declarar sus propias estructuras de registros que contengan
los campos que desee

• 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

• Comience con la palabra clave TYPE para definir la estructura de su


registro

• Debe incluir al menos un campo y los campos se pueden


definir usando tipos de datos escalares como DATE,
VARCHAR2 o NUMBER, o usando atributos como% TYPE
y% ROWTYPE
• Después de declarar el tipo, use el type_name para declarar
una variable de ese tipo
ESCRIBE escribe un nombre ES REGISTRO (
field_declaration [, field_declaration] ...);

identificador escribe un nombre;

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 escribe un nombre es el nombre que le da a su tipo de datos personalizado.

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

• Primero, declare / defina el tipo y una variable de ese


tipo
• Luego usa la variable y sus componentes

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

Respuesta: hay cuatro campos que se pueden abordar en v_emp_dept_rec:

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.

• Su alcance y visibilidad siguen las mismas reglas que para las


variables escalares.
• Por ejemplo, puede declarar un tipo (y un registro basado
en el tipo) en un bloque externo y hacer referencia
ellos dentro de un bloque interior

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

campos, cada uno con su propio nombre y tipo de datos.

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

También podría gustarte