Está en la página 1de 22

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.


Objetivos
•Esta lección cubre los siguientes objetivos:
-Cree y manipule registros PL / SQL definidos por el usuario

PLSQL 6-1
Registros definidos por elusuario
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 3
Propósito
•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
Registros definidos por elusuario
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 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
record_name table_name%ROWTYPE;

PLSQL 6-1
Registros definidos por elusuario
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 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 (data type) Field2 (data type) Field3 (data type) ...

PLSQL 6-1
Registros definidos por elusuario
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 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 debes DECLARAR para contener los
valores de la columna?

PLSQL 6-1
Registros definidos por elusuario
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 7
El problema
•Eso es mucha codificación, y algunas tablas tendrán incluso 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
Registros definidos por elusuario
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 8
El problema
DECLARE
v_employee_id employees.employee_id%TYPE;
v_first_name employees.first_name%TYPE;
v_last_name employees.last_name%TYPE;
v_email employees.email%TYPE;
... FIVE MORE SCALAR VARIABLES REQUIRED TO MATCH THE TABLE
v_manager_id employees.manager_id%TYPE;
v_department_id employees.department_id%TYPE;
BEGIN
SELECT employee_id, first_name, ... EIGHT MORE HERE,
department_id
INTO v_employee_id, v_first_name, ... AND HERE,
v_department_id
FROM employees
WHERE employee_id = 100;
END;

PLSQL 6-1
Registros definidos por elusuario
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 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 ya
los campos individuales por sus nombres

PLSQL 6-1
Registros definidos por elusuario
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 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
DECLARE
v_emp_record employees%ROWTYPE;
BEGIN
SELECT * INTO v_emp_record
FROM employees
WHERE employee_id = 100;
DBMS_OUTPUT.PUT_LINE('Email for ' || v_emp_record.first_name || ' ' ||
v_emp_record.last_name || ' is ' || v_emp_record.email || '@oracle.com.');
END;

PLSQL 6-1
Registros definidos por elusuario
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 11
Un registro basado en otro registro
•Puede usar %ROWTYPE para declarar un registro basado en otro
registro:
DECLARE
v_emp_record employees%ROWTYPE;
v_emp_copy_record v_emp_record%ROWTYPE;
BEGIN
SELECT * INTO v_emp_record
FROM employees
WHERE 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 || ': Old Salary - ' ||
v_emp_record.salary || ', Proposed New Salary - ' ||
v_emp_copy_record.salary || '.');
END;

PLSQL 6-1
Registros definidos por elusuario
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 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
Registros definidos por elusuario
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 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

TYPE type_name IS RECORD


(field_declaration[,field_declaration]...);

identifier type_name;

PLSQL 6-1
Registros definidos por elusuario
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 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
Registros definidos por elusuario
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 15
Registros definidos por el usuario: ejemplo 1

DECLARE
TYPE person_dept IS RECORD
(first_name employees.first_name%TYPE,
last_name employees.last_name%TYPE,
department_name departments.department_name%TYPE);
v_person_dept_rec person_dept;
BEGIN
SELECT e.first_name, e.last_name, d.department_name
INTO v_person_dept_rec
FROM employees e JOIN departments d
ON e.department_id = d.department_id
WHERE employee_id = 200;
DBMS_OUTPUT.PUT_LINE(v_person_dept_rec.first_name ||
' ' || v_person_dept_rec.last_name || ' is in the ' ||
v_person_dept_rec.department_name || ' department.');
END;

PLSQL 6-1
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. dieciséis
Registros definidos por elusuario
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?
DECLARE
TYPE dept_info_type IS RECORD
(department_id departments.department_id%TYPE,
department_name departments.department_name%TYPE);
TYPE emp_dept_type IS RECORD
(first_name employees.first_name%TYPE,
last_name employees.last_name%TYPE,
dept_info dept_info_type);
v_emp_dept_rec emp_dept_type;
BEGIN
...
END;

PLSQL 6-1
Registros definidos por elusuario
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 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 a ellos dentro de un bloque
interno

PLSQL 6-1
Registros definidos por elusuario
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 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?
DECLARE -- outer block
TYPE employee_type IS RECORD
(first_name employees.first_name%TYPE := 'Amy');
v_emp_rec_outer employee_type;
BEGIN
DBMS_OUTPUT.PUT_LINE(v_emp_rec_outer.first_name);
DECLARE -- inner block
v_emp_rec_inner employee_type;
BEGIN
v_emp_rec_outer.first_name := 'Clara';
DBMS_OUTPUT.PUT_LINE(v_emp_rec_outer.first_name ||
' and ' || v_emp_rec_inner.first_name);
END;
DBMS_OUTPUT.PUT_LINE(v_emp_rec_outer.first_name);
END;

PLSQL 6-1
Registros definidos por elusuario
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 19
Terminología

•Los términos clave utilizados en esta lección incluyen:


-Registro PL / SQL

PLSQL 6-1
Registros definidos por elusuario
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 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
Registros definidos por elusuario
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 21

También podría gustarte