Documentos de Académico
Documentos de Profesional
Documentos de Cultura
SQL
6-1
Registros 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
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
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
•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
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
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
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