Está en la página 1de 85
Diseño e Implementación de bases de datos Oracle 11g Ing. Martín Leiva Castillo mleivac@unprg.edu.pe
Diseño e Implementación de bases de datos Oracle 11g
Diseño e Implementación de bases de
datos Oracle 11g
Ing. Martín Leiva Castillo mleivac@unprg.edu.pe
Ing. Martín Leiva Castillo
mleivac@unprg.edu.pe

Generalidades

Objetivos

Diseñar una base de datos transaccional usando la herramienta de modelado Oracle SQL Data Modeler Construir una base de datos transaccional aplicando PL/SQL y usando el entorno Oracle SQL Developer

Duración

4 horas académicas

una base de datos transaccional aplicando PL/SQL y usando el entorno Oracle SQL Developer Duración 4

Contenido

Parte I

Introducción a Oracle 11g

Parte II

Construcción de bases de datos

Parte III

Diseño de bases de datos

Contenido Parte I Introducción a Oracle 11g Parte II Construcción de bases de datos Parte III
Introducción a Oracle 11g Parte I
Introducción a Oracle 11g
Introducción a Oracle 11g
Parte I
Parte I

Procesamiento de transacciones en línea (OLTP)

Proceso en el cual dada una transacción es procesada inmediatamente en los sistemas de procesamiento Las bases de datos OLTP se caracterizan por ser altamente normalizadas para soportar el procesamiento masivo de transacciones No están estructuradas para soportar análisis de datos históricos

estructuradas para soportar análisis de datos históricos Bases de datos transaccionales INSERT SELECT UPDATE
estructuradas para soportar análisis de datos históricos Bases de datos transaccionales INSERT SELECT UPDATE
estructuradas para soportar análisis de datos históricos Bases de datos transaccionales INSERT SELECT UPDATE

Bases de datos transaccionales

para soportar análisis de datos históricos Bases de datos transaccionales INSERT SELECT UPDATE DELETE

INSERT

SELECT

UPDATE

DELETE

Procesamiento analítico en línea (OLAP)

Proceso interactivo de crear, mantener, analizar y elaborar informes sobre datos Los datos son percibidos y manejados como si estuvieran almacenados en una estructura multidimensional Las base de datos OLAP proveen de respuestas rápidas a consultas empresariales complejas

de respuestas rápidas a consultas empresariales complejas Carga de datos Bases de datos transaccionales Almacén de
de respuestas rápidas a consultas empresariales complejas Carga de datos Bases de datos transaccionales Almacén de
de respuestas rápidas a consultas empresariales complejas Carga de datos Bases de datos transaccionales Almacén de

Carga de datos

rápidas a consultas empresariales complejas Carga de datos Bases de datos transaccionales Almacén de datos INSERT
rápidas a consultas empresariales complejas Carga de datos Bases de datos transaccionales Almacén de datos INSERT

Bases de datos transaccionales

Almacén de datos

complejas Carga de datos Bases de datos transaccionales Almacén de datos INSERT SELECT SELECT UPDATE DELETE
complejas Carga de datos Bases de datos transaccionales Almacén de datos INSERT SELECT SELECT UPDATE DELETE

INSERT

SELECT

SELECT

UPDATE

DELETE

¿Qué es Oracle Databases?

Oracle Databases es un sistema de gestión de bases de datos relacionales (RDBMS) que implementa características orientadas a objetos Soporta tipos definidos por el usuario, herencia y polimorfismo, por lo que también considerado como un Sistema Administrador de Base de Datos Relacional-Objeto (ORDBMS) Oracle Database ha extendido el modelo relacional a un modelo relacional-objeto, haciendo posible almacenar modelos de negocio complejos en una base de datos relacional

Grid Computing

El concepto principal es el de compartir potencia computacional Describe un sistema de computadoras conectados a modo de una malla de manera que sumen sus capacidades de procesamiento Principales beneficios:

Brindar alta calidad al menor costo No necesitar de toda una nueva infraestructura para que funcione Brindar el poder de un supercomputador No precisar hardware adicional, para posibilitar el incremento de la potencia de cómputo Brindar transparencia para el usuario final

Ediciones de Oracle 11g

Enterprise Edition Standard Edition Standard Edition One Express Edition

Información adicional:

http://docs.oracle.com/cd/E11882_01/license.112/e10594/editions.htm#DBLIC109

Oracle Database Server

Oracle Database Server Instancia System Global Area (SGA) Database Buffer Cache Redo Log Buffer Shared Pool

Instancia

Oracle Database Server Instancia System Global Area (SGA) Database Buffer Cache Redo Log Buffer Shared Pool
System Global Area (SGA) Database Buffer Cache Redo Log Buffer Shared Pool Library Cache Dictionary
System Global Area (SGA)
Database Buffer Cache
Redo Log Buffer
Shared Pool
Library Cache
Dictionary Cache
Large Pool
Java Pool
Database Writer (DBWn)
Database Writer (DBWn)
Log Writer (LGWR)
Log Writer (LGWR)
Checkpoint (CKPT)
Checkpoint (CKPT)
System Monitor (SMON)
System Monitor (SMON)
Process Monitor (PMON)
Process Monitor (PMON)
Archiver (ARCn)
Archiver (ARCn)
System Monitor (SMON) Process Monitor (PMON) Archiver (ARCn) Base de datos • Data Files • Control

Base de datos

• Data Files

• Control Files

• Redo Log

Program Global Area (PGA)

Monitor (PMON) Archiver (ARCn) Base de datos • Data Files • Control Files • Redo Log

SQL

Lenguaje utilizado para manipular bases de datos relacionales Categoría de instrucciones:

Lenguaje de definición de datos (DML)

INSERT, UPDATE, DELETE, SELECT

Lenguaje de manipulación de datos (DDL)

CREATE,ALTER, DROP, RENAME,TRUNCATE

Lenguaje de control de transacciones

COMMIT, ROLLBACK, SAVEPOINT

Lenguaje de control de datos (DCL)

GRANT, REVOKE

¿Qué es PL/SQL?

Lenguaje procedimental de Oracle Es una extensión de SQL Soporta DDL, DML y DCL Ventajas

Integración de SQL Procesamiento procedimental Funcionalidades suplementarias Mejora del rendimiento Integración de los productos Oracle

Tipos de datos principales

NUMBER CHAR NCHAR VARCHAR2 NVARCHAR2 DATE TIMESTAMP

BINARY_FLOAT BINARY_DOUBLE ROWID CLOB NCLOB BFILE BLOB

Instalación de Oracle

Oracle Database 11g Express Oracle SQL Developer Oracle SQL Data Modeler

Instalación de Oracle Oracle Database 11g Express Oracle SQL Developer Oracle SQL Data Modeler
Instalación de Oracle Oracle Database 11g Express Oracle SQL Developer Oracle SQL Data Modeler
Instalación de Oracle Oracle Database 11g Express Oracle SQL Developer Oracle SQL Data Modeler

Usuarios SYS y SYSTEM

Toda base de datos Oracle tiene siempre estos dos usuarios Se crean automáticamente cuando se instala Oracle Sirven para gestionar la base de datos Son los propietarios del diccionario de datos de la base de datos

Objetos de datos y Esquemas

Un objeto de datos es una estructura lógica que puede ser una tabla, un archivos de índice o un archivo temporal En una base de datos pueden existir otros objetos que no contienen datos como las vistas y las secuencias Todo objeto independientemente si contiene datos o no debe pertenecer a un esquema Cada usuario es propietario de un solo esquema, que tiene el mismo nombre de usuario Dentro de un esquema cada objeto de un tipo particular tiene un nombre único

Objetos de base de datos

Tablas Restricciones Secuencias Procedimientos almacenados Funciones Desencadenadores

Conexión con Oracle SQL Developer

Conexión con Oracle SQL Developer

Sentencias básicas

Creamos una tabla CREATE TABLE Cliente ( ) codigo_Cli NUMBER NOT NULL , nombre_CliVARCHAR2(100) NOT
Creamos una tabla
CREATE TABLE Cliente
(
)
codigo_Cli NUMBER NOT NULL ,
nombre_CliVARCHAR2(100) NOT NULL
;

Consultamos la tabla

SELECT * FROM Cliente;
SELECT * FROM Cliente;

Listamos las columnas de la tabla:

DESCRIBE Cliente;
DESCRIBE Cliente;
DESC Cliente;
DESC Cliente;

Listando información adicional de las columnas:

SELECT * FROM USER_CONS_COLUMNS WHERE TABLE_NAME = 'CLIENTE';
SELECT * FROM USER_CONS_COLUMNS WHERE TABLE_NAME = 'CLIENTE';

Tabla dual

SELECT 47*3.46 FROM dual;
SELECT 47*3.46 FROM dual;
Construcción de bases de datos Parte II
Construcción de bases de datos
Construcción de bases de datos
Parte II
Parte II

Base de datos Empresa

Creación de usuarios (1)

Creamos el usuario: empresa

CREATE USER empresa IDENTIFIED BY 123456 DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP QUOTA UNLIMITED ON
CREATE USER empresa IDENTIFIED BY 123456 DEFAULT TABLESPACE USERS TEMPORARY
TABLESPACE TEMP QUOTA UNLIMITED ON USERS;

Asignamos privilegios:

GRANT create session TO empresa; GRANT create table TO empresa; GRANT create sequence TO empresa;
GRANT create session TO empresa;
GRANT create table TO empresa;
GRANT create sequence TO empresa;
GRANT create procedure TO empresa;
GRANT create trigger TO empresa;
GRANT create view TO empresa;

Quitamos privilegios:

REVOKE create view FROM empresa;
REVOKE create view FROM empresa;

Si es necesario eliminar el usuario:

DROP USER empresa;
DROP USER empresa;
DROP USER empresa CASCADE;
DROP USER empresa CASCADE;

Creación de usuarios (2)

Creamos el usuario: empresa

CREATE USER empresa IDENTIFIED BY 123456 DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP QUOTA UNLIMITED ON
CREATE USER empresa IDENTIFIED BY 123456 DEFAULT TABLESPACE USERS TEMPORARY
TABLESPACE TEMP QUOTA UNLIMITED ON USERS;
Asignamos privilegios: GRANT create session TO empresa; GRANT create table TO empresa; TO GRANT create
Asignamos privilegios:
GRANT create session TO empresa;
GRANT create table TO empresa;
TO
GRANT
create sequence
empresa;
GRANT create procedure TO empresa;
GRANT create trigger TO empresa;

Exigimos cambio de contraseña:

ALTER USER empresa PASSWORD EXPIRE;
ALTER USER empresa PASSWORD EXPIRE;

Modificamos password:

ALTER USER empresa IDENTIFIED BY 123456;
ALTER USER empresa IDENTIFIED BY 123456;

Tablas

Unidad básica de almacenamiento en una base de datos Oracle Tipos:

Tablas relacionales Tablas temporales Tablas con organización de índice Tablas de objetos Tablas externas Tablas en clúster Tablas particionadas

Restricciones

Conjunto de reglas que pueden definirse sobre una o más columnas de una tabla para ayudar a imponer las reglas del negocio Tipos:

Restricción Descripción NOT NULL Especifica que una columna no puede contener nulos UNIQUE Especificado para
Restricción
Descripción
NOT NULL
Especifica que una columna no puede contener nulos
UNIQUE
Especificado para una columna o combinación de columnas cuyos valores deben ser
únicos para todas las filas de la tabla
PRIMARY KEY
Identifica de manera única cada fila de una tabla
FOREIGN KEY
Establece e impone una relación entre una o más columnas de la tabla y una o más
columnas de la tabla referenciada
CHECK
Especifica una condición que se debe cumplir

Creación de tablas

Creamos la tabla: proyecto

CREATE TABLE Proyecto ( ) numero_Pro NUMBER (4) NOT NULL , nombre_Pro CHAR (35) NOT
CREATE TABLE Proyecto
(
)
numero_Pro NUMBER (4) NOT NULL ,
nombre_Pro CHAR (35) NOT NULL ,
lugar_Pro CHAR (15) NOT NULL ,
estado_Pro CHAR (1) DEFAULT 'E' NOT NULL ,
numero_Dep NUMBER (2) NOT NULL
;

Creamos sus restricciones:

ALTER TABLE Proyecto ADD CONSTRAINT CK_Proyecto_estado CHECK (estado_Pro IN ('T','S','E'));
ALTER TABLE Proyecto
ADD CONSTRAINT CK_Proyecto_estado CHECK (estado_Pro IN ('T','S','E'));
ALTER TABLE Proyecto
ADD CONSTRAINT PK_Proyecto PRIMARY KEY ( numero_Pro ) ;
ALTER TABLE Proyecto
ADD CONSTRAINT UQ_Proyecto_nombre UNIQUE ( nombre_Pro ) ;

Creación de la tabla Departamento

Creamos la tabla

CREATE TABLE Departamento ( ) numero_Dep NUMBER (2) NOT NULL , nombre_Dep CHAR (25) NOT
CREATE TABLE Departamento
(
)
numero_Dep NUMBER (2) NOT NULL ,
nombre_Dep CHAR (25) NOT NULL ,
fechaIniGer_Dep DATE ,
numeroEmp_Dep NUMBER (3) DEFAULT 0 NOT NULL ,
nss_Emp CHAR (9)
;

Creamos sus restricciones:

ALTER TABLE Departamento ADD CONSTRAINT PK_Departamento PRIMARY KEY ( numero_Dep ) ; ALTER TABLE Departamento
ALTER TABLE Departamento
ADD CONSTRAINT PK_Departamento PRIMARY KEY ( numero_Dep ) ;
ALTER TABLE Departamento
ADD CONSTRAINT UQ_Departamento_nombre UNIQUE ( nombre_Dep ) ;
ALTER TABLE Departamento
ADD CONSTRAINT UQ_Departamento_nss UNIQUE ( nss_Emp ) ;

Restricciones de integridad referencial

ALTER TABLE Proyecto ADD CONSTRAINT FK_Proyecto_Departamento FOREIGN KEY ( numero_Dep ) REFERENCES Departamento (
ALTER TABLE Proyecto
ADD CONSTRAINT FK_Proyecto_Departamento FOREIGN KEY
(
numero_Dep
)
REFERENCES Departamento
(
numero_Dep
);

Modificando restricciones

Consultando las restricciones:

SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME='PROYECTO';
SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME='PROYECTO';

Deshabilitando una restricción

ALTER TABLE Proyecto DISABLE CONSTRAINT FK_PROYECTO_DEPARTAMENTO;
ALTER TABLE Proyecto DISABLE CONSTRAINT FK_PROYECTO_DEPARTAMENTO;

Habilitando una restricción

ALTER TABLE Proyecto ENABLE CONSTRAINT FK_PROYECTO_DEPARTAMENTO;
ALTER TABLE Proyecto ENABLE CONSTRAINT FK_PROYECTO_DEPARTAMENTO;

Eliminando una restricción

ALTER TABLE Proyecto DROP CONSTRAINT FK_PROYECTO_DEPARTAMENTO;
ALTER TABLE Proyecto DROP CONSTRAINT FK_PROYECTO_DEPARTAMENTO;

Modificando tablas

Agregando una nueva columna:

ALTER TABLE Proyecto ADD presupuesto NUMBER(8,2) NULL;
ALTER TABLE Proyecto ADD presupuesto NUMBER(8,2) NULL;

Agregando DEFAULT a la nueva columna:

ALTER TABLE Proyecto MODIFY presupuesto DEFAULT 10000.00;
ALTER TABLE Proyecto MODIFY presupuesto DEFAULT 10000.00;

Renombrando la nueva columna:

ALTER TABLE Proyecto RENAME COLUMN presupuesto TO presupuesto_Pro;
ALTER TABLE Proyecto RENAME COLUMN presupuesto TO presupuesto_Pro;

Eliminando la nueva columna:

ALTER TABLE Proyecto DROP COLUMN presupuesto_Pro;
ALTER TABLE Proyecto DROP COLUMN presupuesto_Pro;

Agregando una columna NOT NULL:

ALTER TABLE Proyecto ADD presupuesto_Pro NUMBER(8,2) DEFAULT 10000.00 NOT NULL;
ALTER TABLE Proyecto ADD presupuesto_Pro NUMBER(8,2) DEFAULT 10000.00 NOT NULL;

Construir el resto de tablas

Mantener el siguiente orden:

LugarDepartamento Empleado Dependiente Trabaja EstadoEmpleado

Consultando las tablas creadas:

SELECT * FROM USER_TABLES;
SELECT * FROM USER_TABLES;

Secuencias

Asigna números secuenciales que se garantiza que son unívocos Pueden generar valores de hasta 28 cifras La serie de números puede ser ascendente o descendente El intervalo puede ser cualquier valor Oracle puede almacenar bloques de números en caché a partir de una secuencia contenida en memoria, para incrementar todavía la velocidad Se garantiza que son unívocos, aunque no necesariamente secuenciales

Creación de secuencias

Creamos la secuencia:

CREATE SEQUENCE numero_Pro START WITH 1 INCREMENT BY 1;
CREATE SEQUENCE numero_Pro
START WITH 1
INCREMENT BY 1;

Utilizamos la secuencia:

INSERT INTO Departamento(numero_Dep,nombre_Dep,numeroEmp_Dep,nss_Emp,FechaIniGer_Dep) VALUES
INSERT INTO
Departamento(numero_Dep,nombre_Dep,numeroEmp_Dep,nss_Emp,FechaIniGer_Dep)
VALUES (1,'Investigación',4,null,null);
INSERT INTO Proyecto(numero_Pro,nombre_Pro,lugar_Pro,estado_Pro,numero_Dep) VALUES
INSERT INTO Proyecto(numero_Pro,nombre_Pro,lugar_Pro,estado_Pro,numero_Dep)
VALUES (numero_Pro.nextval,'ProductoX','Chepen','E',1);
INSERT INTO Proyecto(numero_Pro,nombre_Pro,lugar_Pro,estado_Pro,numero_Dep)
VALUES (numero_Pro.nextval,'ProductoY','Pacasmayo','S',1);
SELECT * FROM Proyecto;
SELECT * FROM Proyecto;

Consultando y eliminando secuencias

Obtenemos el nuevo valor de la secuencia:

SELECT numero_Pro.NEXTVAL FROM dual;
SELECT numero_Pro.NEXTVAL FROM dual;

Obtenemos el valor actual de la secuencia:

SELECT numero_Pro.CURRVAL FROM dual;
SELECT numero_Pro.CURRVAL FROM dual;

Consultamos las secuencias

SELECT * FROM USER_SEQUENCES;
SELECT * FROM USER_SEQUENCES;

Eliminamos la secuencia

DROP SEQUENCE numero_Pro ;
DROP SEQUENCE numero_Pro ;

Llenar la base de datos

Volver a crear la secuencia numero_Pro Crear la secuencia numero_Eem Ejecutar el script de llenado de la base de datos Se recomienda crear un script de eliminación de tablas y secuencias

Ejecutar el script de llenado de la base de datos Se recomienda crear un script de

Ejecución de una transacción

Una transacción es un conjunto de sentencias DML que deben ser atómicas, consistentes, aisladas y permanentes Inicio de transacción

Cuando no hay una transacción en progreso y se ejecuta una sentencia DML No existe sentencia de inicio de transacción

Fin de transacción

COMMIT

Finaliza la transacción actual y hace permanentes los cambios realizados

ROLLBACK

Finaliza la transacción actual y deshace los cambios realizados

Ejemplo de una transacción

SELECT * FROM Dependiente WHERE nss_emp='000342102'; DELETE FROM Dependiente WHERE nss_emp='000342102';
SELECT * FROM Dependiente WHERE nss_emp='000342102';
DELETE FROM Dependiente WHERE nss_emp='000342102';
SELECT * FROM Dependiente WHERE nss_emp='000342102';
ROLLBACK;
SELECT * FROM Dependiente WHERE nss_emp='000342102';
DELETE FROM Dependiente WHERE nss_emp='000342102';
SELECT * FROM Dependiente WHERE nss_emp='000342102';
COMMIT;
SELECT * FROM Dependiente WHERE nss_emp='000342102';
Procedimientos almacenados
Procedimientos almacenados
Procedimientos almacenados

¿Qué es un procedimiento almacenado?

Es un bloque de código PL/SQL nominado, almacenado en la base de dato y se puede ejecutar desde aplicaciones u otros procedimientos almacenados Para hacer referencia se puede utilizar la instrucción EXECUTE Sintaxis:

CREATE [OR REPLACE] PROCEDURE nombre_procedimiento [(parámetro {IN/OUT/ IN OUT} tipo, …)] {IS/AS} Bloque PL/SQL
CREATE [OR REPLACE] PROCEDURE nombre_procedimiento
[(parámetro {IN/OUT/ IN OUT} tipo, …)]
{IS/AS}
Bloque PL/SQL
EXECUTE nombre_procedimiento [(parámetro, …)]
EXECUTE nombre_procedimiento [(parámetro, …)]
DROP PROCEDURE nombre_procedimiento [(parámetro, …)]
DROP PROCEDURE nombre_procedimiento [(parámetro, …)]

Procedimiento para eliminar

Dado el número de seguro social del empleado y el número de dependiente eliminarlo

CREATE OR REPLACE PROCEDURE pa_eliminarDependiente( v_nssEmp dependiente.nss_Emp%TYPE, v_numero
CREATE OR REPLACE PROCEDURE pa_eliminarDependiente(
v_nssEmp dependiente.nss_Emp%TYPE,
v_numero dependiente.numero_Depe%TYPE)
1
IS
BEGIN
DELETE FROM Dependiente WHERE nss Emp=v nssEmp AND numero Depe=v numero;
COMMIT;
END;
_
_
_
_
2
SELECT * FROM Dependiente WHERE nss_Emp='123456789';
3
EXECUTE pa_eliminarDependiente('123456789',3);
4 SELECT * FROM Dependiente WHERE nss_Emp='123456789';
4
SELECT * FROM Dependiente WHERE nss_Emp='123456789';

Consultando procedimientos

Consultar sus parámetros

DESC pa_eliminardependiente;
DESC pa_eliminardependiente;

Listando procedimientos:

SELECT * FROM USER_PROCEDURES WHERE object_name like 'PA_%';
SELECT * FROM USER_PROCEDURES WHERE object_name like 'PA_%';
SELECT * FROM USER_PROCEDURES WHERE object_type='PROCEDURE';
SELECT * FROM USER_PROCEDURES WHERE object_type='PROCEDURE';

Obteniendo el código fuente:

SELECT line, text FROM USER_SOURCE WHERE name='PA_ELIMINARDEPENDIENTE';
SELECT line, text FROM USER_SOURCE WHERE name='PA_ELIMINARDEPENDIENTE';

Eliminando el procedimiento:

DROP PROCEDURE pa_eliminarDependiente;
DROP PROCEDURE pa_eliminarDependiente;

Procedimiento para insertar

Insertar un nuevo proyecto

CREATE OR REPLACE PROCEDURE pa_insertarProyecto( v_nombre proyecto.nombre_Pro%TYPE, v_numeroDep
CREATE OR REPLACE PROCEDURE pa_insertarProyecto(
v_nombre proyecto.nombre_Pro%TYPE,
v_numeroDep proyecto.numero_Dep%TYPE,
v_lugar proyecto.lugar_Pro%TYPE)
1
IS
BEGIN
INSERT INTO Proyecto(numero Pro,nombre Pro,numero Dep,lugar Pro)
VALUES(numero_Pro.nextval,v_nombre,v_numeroDep,v_lugar);
COMMIT;
_
_
_
_
END;
2
EXEC pa_insertarProyecto('Desarrollo de Sistema Contable',5,'Pacasmayo');
3
SELECT * FROM Proyecto;

Ejercicio 1

Retirar un empleado de un proyecto, siempre y cuando no sea el único asignado al proyecto

CREATE OR REPLACE PROCEDURE pa_desasignarProyecto( v_nss trabaja.nss_Emp%TYPE, v_numero trabaja.numero_Pro%TYPE) IS
CREATE OR REPLACE PROCEDURE pa_desasignarProyecto(
v_nss trabaja.nss_Emp%TYPE,
v_numero trabaja.numero_Pro%TYPE)
IS
sin_empleados EXCEPTION;
cuenta NUMBER;
BEGIN
SELECT COUNT(*) INTO cuenta FROM Trabaja WHERE numero_Pro=v_numero;
IF cuenta=1 THEN
RAISE sin_empleados;
END IF;
DELETE FROM Trabaja WHERE numero_Pro=v_numero AND nss_Emp=v_nss;
COMMIT;
EXCEPTION
WHEN sin_empleadosTHEN RAISE_APPLICATION_ERROR(-20999,'Tiene un sólo empleado');
END;

Probando el procedimiento

Consultar el proyecto 12

SELECT * FROM Trabaja WHERE numero_Pro=12;
SELECT * FROM Trabaja WHERE numero_Pro=12;

Ejecutamos el procedimiento:

EXEC pa_desasignarProyecto('425984153',12);
EXEC pa_desasignarProyecto('425984153',12);
SELECT * FROM Trabaja WHERE numero_Pro=12;
SELECT * FROM Trabaja WHERE numero_Pro=12;

Consultar el proyecto 11:

SELECT * FROM Trabaja WHERE numero_Pro=11;
SELECT * FROM Trabaja WHERE numero_Pro=11;

Ejecutamos el procedimiento:

EXEC pa_desasignarProyecto('014685006',11);
EXEC pa_desasignarProyecto('014685006',11);
SELECT * FROM Trabaja WHERE numero_Pro=11
SELECT * FROM Trabaja WHERE numero_Pro=11

Ejercicio 2

Asignar un empleado de un proyecto, sabiendo que no debe exceder el total de 40 horas semanales asignados a proyectos

CREATE OR REPLACE PROCEDURE pa_asignarProyecto( v_nss trabaja.nss_Emp%TYPE, v_numero trabaja.numero_Pro%TYPE, v_horas
CREATE OR REPLACE PROCEDURE pa_asignarProyecto(
v_nss trabaja.nss_Emp%TYPE,
v_numero trabaja.numero_Pro%TYPE,
v_horas trabaja.horasSem_Tra%TYPE)
IS
exceso_horas EXCEPTION;
suma NUMBER;
BEGIN
SELECT SUM(horasSem_Tra) INTO suma FROM Trabaja WHERE nss_Emp=v_nss;
suma := suma + v_horas;
IF suma>40 THEN
RAISE exceso_horas;
END IF;
INSERT INTO Trabaja(numero_Pro,nss_Emp,horasSem_Tra)VALUES(v_numero,v_nss,v_horas);
COMMIT;
EXCEPTION
WHEN exceso_horasTHEN RAISE_APPLICATION_ERROR(-20999, 'No debe superar las 40 horas semanales');
END;

Probando el procedimiento

Consultar al empleado con nss ‘090000002’

SELECT * FROM Trabaja WHERE nss_Emp='090000002';
SELECT * FROM Trabaja WHERE nss_Emp='090000002';

Ejecutamos el procedimiento, asignando 20 horas:

EXEC pa_asignarProyecto('090000002',12,20);
EXEC pa_asignarProyecto('090000002',12,20);

Ejecutamos el procedimiento, asignando 14.5 horas:

EXEC pa_asignarProyecto('090000002',12,14.5);
EXEC pa_asignarProyecto('090000002',12,14.5);

Verificamos:

SELECT * FROM Trabaja WHERE nss_Emp='090000002';
SELECT * FROM Trabaja WHERE nss_Emp='090000002';

Ejercicio 3

Insertar un departamento, en donde el procedimiento genere el número del nuevo departamento

CREATE OR REPLACE PROCEDURE pa_insertarDepartamento( v_nombre departamento.nombre_Dep%TYPE, v_nss
CREATE OR REPLACE PROCEDURE pa_insertarDepartamento(
v_nombre departamento.nombre_Dep%TYPE,
v_nss departamento.nss_Emp%TYPE,
v_fecha departamento.fechaIniGer_Dep%TYPE,
v_numero OUT departamento.numero_Dep%TYPE)
IS
BEGIN
SELECT MAX(numero_Dep)+1 INTO v_numero FROM Departamento;
IF v_nss IS NULL THEN
INSERT INTO Departamento(numero_Dep,nombre_Dep)
VALUES(v_numero,v_nombre);
ELSE
INSERT INTO Departamento(numero_Dep,nombre_Dep,nss_Emp,fechaIniGer_Dep,numeroEmp_Dep)
VALUES(v_numero,v_nombre,v_nss,v_fecha,1);
UPDATE Empleado SET numero_Dep=v_numeroWHERE nss_Emp=v_nss;
END IF;
COMMIT;
EXCEPTION
WHEN OTHERS THEN rollback;
END;

Probando el procedimiento

Agregando un nuevo departamento, sin gerente

variable c1 number; EXECUTE pa_insertarDepartamento('Seguridad Industrial',null,null,:c1); print c1;
variable c1 number;
EXECUTE pa_insertarDepartamento('Seguridad Industrial',null,null,:c1);
print c1;

Verificamos:

SELECT * FROM departamento;
SELECT * FROM departamento;

Agregando un nuevo departamento, asignando gerente

variable c1 number; EXECUTE pa_insertarDepartamento('Control de calidad','090000002',sysdate,:c1); print
variable c1 number;
EXECUTE pa_insertarDepartamento('Control de calidad','090000002',sysdate,:c1);
print c1;

Verificamos:

SELECT * FROM departamento;
SELECT * FROM departamento;
SELECT * FROM EmpleadoWHERE nss_emp='090000002';
SELECT * FROM EmpleadoWHERE nss_emp='090000002';

Ejercicios adicionales

Insertar un nuevo proyecto, donde en el mismo procedimiento de inserción se indique el empleado que asumirá la jefatura del proyecto. Tomar en cuenta que un empleado sólo puede dirigir como máximo tres proyectos a la vez. Registrar un dependiente sabiendo que un empleado no puede tener más de cinco dependientes, y que el número de dependiente debe ser generado por el mismo procedimiento. Además por cada dependiente asignado, el empleado debe tener un incremento de salario de 100.00 nuevos soles

Además por cada dependiente asignado, el empleado debe tener un incremento de salario de 100.00 nuevos
Además por cada dependiente asignado, el empleado debe tener un incremento de salario de 100.00 nuevos
Funciones almacenadas
Funciones almacenadas
Funciones almacenadas

¿Qué es una función almacenada?

Una función es un fragmento de código PL/SQL, pero la función devuelve un valor Sintaxis:

CREATE [OR REPLACE] FUNCTION nombre_función [(parámetro [IN] tipo, …)] RETURN tipo {IS/AS} Bloque PL/SQL
CREATE [OR REPLACE] FUNCTION nombre_función
[(parámetro [IN] tipo, …)]
RETURN tipo
{IS/AS}
Bloque PL/SQL
SELECT nombre_función[(parámetro, …)] FROM dual
SELECT nombre_función[(parámetro, …)] FROM dual
variable := nombre_función[(parámetro, …)]
variable := nombre_función[(parámetro, …)]
DROP FUNCTION nombre_función
DROP FUNCTION nombre_función

Funciones: ejemplo 1

Implementar una función que devuelva el número de empleados de acuerdo a un estado específico

CREATE OR REPLACE FUNCTION fdu_numeroEmpleados( v_estado empleado.estado_Emp%TYPE) RETURN number IS 1 numero number;
CREATE OR REPLACE FUNCTION fdu_numeroEmpleados(
v_estado empleado.estado_Emp%TYPE)
RETURN number
IS
1
numero number;
BEGIN
SELECT COUNT(*) INTO numero FROM empleado WHERE estado_Emp=v_estado;
RETURN numero;
END;
SELECT fdu_numeroEmpleados('C') FROM dual;
SELECT fdu_numeroEmpleados('A') FROM dual;
2
SELECT fdu_numeroEmpleados('V') FROM dual;
SELECT fdu_numeroEmpleados('N') FROM dual;

Consultando funciones

Consultar sus parámetros

DESC fdu_numeroEmpleados;
DESC fdu_numeroEmpleados;

Listando funciones:

SELECT * FROM USER_PROCEDURES WHERE object_name like 'FDU_%';
SELECT * FROM USER_PROCEDURES WHERE object_name like 'FDU_%';
SELECT * FROM USER_PROCEDURES WHERE object_type='FUNCTION';
SELECT * FROM USER_PROCEDURES WHERE object_type='FUNCTION';

Obteniendo el código fuente:

SELECT line, text FROM USER_SOURCE WHERE name='FDU_NUMEROEMPLEADOS';
SELECT line, text FROM USER_SOURCE WHERE name='FDU_NUMEROEMPLEADOS';

Funciones: ejemplo 2

Implementar una función que devuelva los departamentos mostrando el número de empleados de sexo masculino y femenino

CREATE OR REPLACE FUNCTION fdu_numeroEmpleadoDepSexo( v_numeroDep empleado.numero_Dep%TYPE, v_sexo
CREATE OR REPLACE FUNCTION fdu_numeroEmpleadoDepSexo(
v_numeroDep empleado.numero_Dep%TYPE,
v_sexo empleado.sexo_Emp%TYPE)
RETURN number
IS
1
numero number;
BEGIN
SELECT COUNT(*) INTO numero FROM empleado
WHERE numero_Dep=v_numeroDep AND sexo_Emp=v_sexo AND estado_Emp IN ('A','V');
RETURN numero;
END;
2 SELECT numero_Dep, nombre_Dep, fdu_numeroempleadodepsexo(numero_Dep,1) as Masculino,
2
SELECT numero_Dep, nombre_Dep,
fdu_numeroempleadodepsexo(numero_Dep,1) as Masculino,
fdu_numeroempleadodepsexo(numero_Dep,0) as Femenino
FROM Departamento;
as Masculino, fdu_numeroempleadodepsexo(numero_Dep,0) as Femenino FROM Departamento;

Ejercicios

Para cada empleado que es supervisor mostrar el número de supervisados que tienen Para cada proyecto mostrar el nombre completo del empleado más antiguo que tienen

número de supervisados que tienen Para cada proyecto mostrar el nombre completo del empleado más antiguo
Disparadores
Disparadores
Disparadores

¿Qué es un disparador?

Un disparador es un bloque PL/SQL asociado a una tabla Se ejecuta cuando se aplique a la tabla un instrucción DML:

INSERT, UPDATE, DELETE Puede ejecutarse antes o después de la verificación de las restricciones de integridad Permiten implementar restricciones complejas o que tengan en cuenta datos procedentes de varias filas o de varias tablas No deben emplearse cuando sea posible establecer una restricción de integridad Se puede ejecutar para cada fila afectada por la instrucción DML, o una sola vez para cada instrucción DML ejecutada

Tipos de disparadores

Dependiendo del momento en que se ejecuta:

Antes de la verificación de las restricciones de integridad (BEFORE) Después de la verificación de las restricciones de integridad (AFTER)

Dependiendo de las veces que se ejecuta:

Para cada fila afectada por la instrucción DML (opción FOR EACH ROW) Una sola vez para cada instrucción DML (opción predeterminada)

Si esta asociado a una vista:

Su ejecución va a reemplazar a la instrucción DML a la que esté asociado ( INSTEAD OF)

Creación de un disparador

Sintaxis:

CREATE [OR REPLACE] TRIGGER nombre_disparador {BEFORE / AFTER / INSTEAD OF} {INSERT / UPDATE [OF
CREATE [OR REPLACE] TRIGGER nombre_disparador
{BEFORE / AFTER / INSTEAD OF}
{INSERT / UPDATE [OF col,…] / DELETE}
ON nombre_table [FOR EACH ROW]
[WHEN (condicion)]
Bloque PL/SQL;
DROP TRIGGER nombre_disparador
DROP TRIGGER nombre_disparador

Los datos de la tabla son inaccesibles desde las instrucciones del bloque Sólo la fila que se está modificando es accesible a través de dos variables de tipo RECORD: OLD y NEW

OLD y NEW

Poseen la misma estructura de la tabla o de la vista asociada Pueden ser utilizadas en la cláusula WHEN del disparador o en el bloque de instrucciones En el último caso, se referencian como variables host mediante el prefijo “:” (:OLD.nombre_campo, :NEW.nombre_campo)

Variables INSERT UPDATE DELETE new Permite conocer cual es la fila insertada Permite conocer la
Variables
INSERT
UPDATE
DELETE
new
Permite conocer cual
es la fila insertada
Permite conocer la fila
después de su modificación
old
Permite conocer la fila que
se va a modificar
Permite conocer qué
fila se va a eliminar

Disparadores: ejemplo 1

Eliminar sólo los departamento que no tengan empleados asignados

CREATE OR REPLACE TRIGGER tr_eliminaDepartamento AFTER DELETE ON Departamento FOR EACH ROW WHEN
CREATE OR REPLACE TRIGGER tr_eliminaDepartamento
AFTER DELETE
ON Departamento
FOR EACH ROW
WHEN (old.numeroEmp_Dep>0)
BEGIN
RAISE_APPLICATION_ERROR(-20999, 'No puede eliminarse porque tiene empleados');
END;

Probar disparador:

DELETE FROM DepartamentoWHERE numero_Dep=12;
DELETE FROM DepartamentoWHERE numero_Dep=12;
DELETE FROM DepartamentoWHERE numero_Dep=5;
DELETE FROM DepartamentoWHERE numero_Dep=5;

Consultando disparadores

Listar sus propiedades

SELECT * FROM USER_TRIGGERS;
SELECT * FROM USER_TRIGGERS;

Listando disparadores:

SELECT * FROM USER_PROCEDURES WHERE object_name like 'TR_%';
SELECT * FROM USER_PROCEDURES WHERE object_name like 'TR_%';
SELECT * FROM USER_PROCEDURES WHERE object_type='TRIGGER';
SELECT * FROM USER_PROCEDURES WHERE object_type='TRIGGER';

Obteniendo el código fuente:

SELECT line, text FROM USER_SOURCE WHERE name='TR_ELIMINADEPARTAMENTO';
SELECT line, text FROM USER_SOURCE WHERE name='TR_ELIMINADEPARTAMENTO';

Disparadores: ejemplo 2

No permitir aumento de salarios a aquellos empleados que no tengan dependientes

CREATE OR REPLACE TRIGGER tr_actualizaSalario AFTER UPDATE OF salario_Emp ON Empleado FOR EACH ROW WHEN
CREATE OR REPLACE TRIGGER tr_actualizaSalario
AFTER UPDATE OF salario_Emp
ON Empleado
FOR EACH ROW
WHEN (old.salario_Emp<new.salario_Emp)
DECLARE
cuenta number;
BEGIN
SELECT COUNT(*) INTO cuenta FROM Dependiente WHERE nss_Emp=:old.nss_Emp;
IF cuenta=0 THEN
RAISE_APPLICATION_ERROR(-20999,'El empleado no tiene dependientes');
END IF;
END;

Probando disparador

Verificamos datos

SELECT nss_Emp,salario_Emp,numero_Dep FROM EmpleadoWHERE nss_Emp IN ('788229980','701781110');
SELECT nss_Emp,salario_Emp,numero_Dep FROM EmpleadoWHERE nss_Emp IN ('788229980','701781110');

Actualizamos salarios:

UPDATE Empleado SET salario_Emp=salario_Emp+50 WHERE nss_Emp='788229980'; UPDATE Empleado SET
UPDATE Empleado SET salario_Emp=salario_Emp+50 WHERE nss_Emp='788229980';
UPDATE Empleado SET salario_Emp=salario_Emp+50 WHERE nss_Emp= 701781110 ;
'
'

Actualizamos departamento:

UPDATE Empleado SET numero_Dep=10 WHERE nss_Emp='701781110';
UPDATE Empleado SET numero_Dep=10 WHERE nss_Emp='701781110';

Confirmamos actualización:

SELECT nss_Emp,salario_Emp,numero_Dep FROM EmpleadoWHERE nss_Emp IN ('788229980','701781110');
SELECT nss_Emp,salario_Emp,numero_Dep FROM EmpleadoWHERE nss_Emp IN ('788229980','701781110');

Disparadores: ejemplo 3

Un empleado no debe dedicarle más de 40 horas semanales a los proyectos en los que esta asignado

CREATE OR REPLACE TRIGGER tr_insertaTrabaja BEFORE INSERT ON Trabaja FOR EACH ROW DECLARE horas number;
CREATE OR REPLACE TRIGGER tr_insertaTrabaja
BEFORE INSERT
ON Trabaja
FOR EACH ROW
DECLARE
horas number;
BEGIN
SELECT SUM(horasSem_Tra)+:new.horasSem_Tra INTO horas
FROM Trabaja WHERE nss_Emp=:new.nss_Emp;
IF horas>40 THEN
RAISE_APPLICATION_ERROR(-20999,'El empleado excede las 40 horas semanales');
END IF;
END;

Probando disparador

Verificamos datos

SELECT numero_Pro,horassem_Tra FROM Trabaja WHERE nss_Emp='090000007';
SELECT numero_Pro,horassem_Tra FROM Trabaja WHERE nss_Emp='090000007';

Asignamos proyecto al empleado:

INSERT INTO TrabajaVALUES(10,'090000007',21,0); INSERT INTO Trabaja VALUES(10, 090000007 ,15,0); ' '
INSERT INTO TrabajaVALUES(10,'090000007',21,0);
INSERT INTO Trabaja VALUES(10, 090000007 ,15,0);
'
'

Confirmamos actualización:

SELECT numero_Pro,horassem_Tra FROM Trabaja WHERE nss_Emp='090000007';
SELECT numero_Pro,horassem_Tra FROM Trabaja WHERE nss_Emp='090000007';

Deshabilitar disparadores

La instrucción ALTER TRIGGER permite desactivar y después reactivar los disparadores La desactivación y la reactivación de disparadores pueden realizarse disparador por disparador, o tabla por tabla Sintaxis:

ALTER TRIGGER nombre_disparador {ENABLE|DISABLE}; ALTER TABLE nombre_tabla {ENABLE|DISABLE} ALL TRIGGERS;
ALTER TRIGGER nombre_disparador {ENABLE|DISABLE};
ALTER TABLE nombre_tabla {ENABLE|DISABLE} ALL TRIGGERS;

Ejemplos:

ALTER TRIGGER tr_actualizaSalario DISABLE; ALTER TRIGGER tr_actualizaSalario ENABLE;
ALTER TRIGGER tr_actualizaSalario DISABLE;
ALTER TRIGGER tr_actualizaSalario ENABLE;
ALTER TABLE departamento DISABLE ALL TRIGGERS; ALTER TABLE departamento ENABLE ALL TRIGGERS;
ALTER TABLE departamento DISABLE ALL TRIGGERS;
ALTER TABLE departamento ENABLE ALL TRIGGERS;
tr_actualizaSalario ENABLE; ALTER TABLE departamento DISABLE ALL TRIGGERS; ALTER TABLE departamento ENABLE ALL TRIGGERS;

Ejercicios

Cada vez que se agregue un nuevo departamento, se debe agregar de manera predeterminada un lugar asociado a ese nuevo departamento en la ciudad de Chiclayo Verificar cada vez que se asigne un empleado a un proyecto donde además se indique que va a ser jefe del proyecto, que éste tenga sólo un jefe

se asigne un empleado a un proyecto donde además se indique que va a ser jefe
Paquetes
Paquetes
Paquetes

¿Qué es un paquete?

Agrupa de forma lógica elementos PL/SQL relacionados Se dividen en dos partes:

Una cabecera o especificación Un cuerpo

Ventajas:

Modularidad Simplificación de desarrollo Ocultar datos Adición de funcionalidades Mejora de rendimiento

Cabecera del paquete

Permite describir el contenido del paquete y conocer el nombre y los parámetros de llamada de las funciones y procedimientos Sintaxis:

CREATE PACKAGE nombre_paquete AS --Definición de tipos --Declaración de variables públicas --Prototipos de los
CREATE PACKAGE nombre_paquete AS
--Definición de tipos
--Declaración de variables públicas
--Prototipos de los cursores públicos
--Prototipos de los procedimientos y funciones públicos
END [nombre_paquete];

Ejemplo de cabecera

CREATE OR REPLACE PACKAGE paq_Proyecto AS PROCEDURE pa_insertarProyecto( nombre proyecto.nombre_Pro%TYPE, lugar
CREATE OR REPLACE PACKAGE paq_Proyecto
AS
PROCEDURE pa_insertarProyecto(
nombre proyecto.nombre_Pro%TYPE,
lugar proyecto.lugar_Pro%TYPE,
numeroDep proyecto.numero_Dep%TYPE);
PROCEDURE pa_eliminarProyecto(numero proyecto.numero_Pro%TYPE);
PROCEDURE pa_modificarProyecto(
numero proyecto.numero_Pro%TYPE,
nombre proyecto.nombre_Pro%TYPE,
lugar proyecto.lugar_Pro%TYPE,
estado proyecto.estado_Pro%TYPE,
numeroDep proyecto.numero_Dep%TYPE);
END paq_Proyecto;

Cuerpo del paquete

Contiene la implementación de los procedimientos y funciones descritos en la cabecera También contiene definiciones de tipos y declaraciones de variables cuyo ámbito está limitado al cuerpo del paquete Sintaxis:

CREATE PACKAGE BODY nombre_paquete AS --Definición de tipos locales al paquete --Declaración de variables locales
CREATE PACKAGE BODY nombre_paquete AS
--Definición de tipos locales al paquete
--Declaración de variables locales al paquete
--Implementación de los cursores públicos
--Cuerpo de los procedimientos y funciones locales al paquete
--Cuerpo de los procedimientos y funciones públicas
END [nombre_paquete];

Ejemplo de cuerpo de paquete

CREATE OR REPLACE PACKAGE BODY paq_Proyecto AS PROCEDURE pa_insertarProyecto(nombre proyecto.nombre_Pro%TYPE, lugar
CREATE OR REPLACE PACKAGE BODY paq_Proyecto
AS
PROCEDURE pa_insertarProyecto(nombre proyecto.nombre_Pro%TYPE, lugar proyecto.lugar_Pro%TYPE,
numeroDep proyecto.numero_Dep%TYPE)
IS
BEGIN
INSERT INTO Proyecto(numero_Pro,nombre_Pro,lugar_Pro,numero_Dep)
VALUES (numero_Pro.nextval, nombre, lugar, numeroDep);
commit;
END pa_insertarProyecto;
PROCEDURE pa_eliminarProyecto(numero proyecto.numero_Pro%TYPE)
IS
BEGIN
DELETE FROM Proyecto WHERE numero_Pro=numero;
commit;
END pa_eliminarProyecto;
PROCEDURE pa_modificarProyecto(numero proyecto.numero_Pro%TYPE, nombre proyecto.nombre_Pro%TYPE,
lugar proyecto.lugar_Pro%TYPE, estado proyecto.estado_Pro%TYPE, numeroDep proyecto.numero_Dep%TYPE)
IS
BEGIN
UPDATE Proyecto SET nombre_Pro=nombre, lugar_Pro=lugar, numero_Dep=numero_Dep, estado_Pro=estado
WHERE numero_Pro=numero;
commit;
END pa_modificarProyecto;
END paq_Proyecto;

Ejecución de los procedimientos

Se debe indicar el nombre del paquete

EXECUTE paq_Proyecto.pa_insertarProyecto('Mantenimiento','Chepen',6); SELECT * FROM Proyecto;
EXECUTE paq_Proyecto.pa_insertarProyecto('Mantenimiento','Chepen',6);
SELECT * FROM Proyecto;
EXECUTE paq_Proyecto.pa_modificarProyecto(18,'Mantenimiento','Pacasmayo','T',4); SELECT * FROM
EXECUTE paq_Proyecto.pa_modificarProyecto(18,'Mantenimiento','Pacasmayo','T',4);
SELECT * FROM Proyecto;
EXECUTE paq_Proyecto.pa_eliminarProyecto(18); SELECT * FROM Proyecto;
EXECUTE paq_Proyecto.pa_eliminarProyecto(18);
SELECT * FROM Proyecto;

Ejercicios

Implementar los procedimientos para el mantenimiento de dependientes Implementar los procedimientos para el mantenimiento de empleados

procedimientos para el mantenimiento de dependientes Implementar los procedimientos para el mantenimiento de empleados
Procedimientos que devuelven consultas
Procedimientos que devuelven
consultas
Procedimientos que devuelven consultas

Tipo REF CURSOR

Las variables de tipo CURSOR son referencias a cursores Son punteros a un área de trabajo donde Oracle almacena los datos que resultan de una selección de múltiples registros Estos punteros almacenan la dirección de memoria del objeto apuntado y por lo tanto pueden pasarse como parámetros de entrada/salida entre procedimientos almacenados o funciones Declaración:

TYPE t_cursor IS REF CURSOR; res t_cursor;
TYPE t_cursor IS REF CURSOR;
res t_cursor;

Listar empleados por estado

CREATE OR REPLACE PACKAGE paq_Empleado AS TYPE vCursor IS REF CURSOR; 1 PROCEDURE pa_listarEmpleadosXEstado( v_estado
CREATE OR REPLACE PACKAGE paq_Empleado
AS
TYPE vCursor IS REF CURSOR;
1
PROCEDURE pa_listarEmpleadosXEstado(
v_estado empleado.estado_Emp%TYPE,
v_cursor OUT vCursor);
END paq_Empleado;
2
CREATE OR REPLACE PACKAGE BODY paq_Empleado
AS
PROCEDURE pa_listarEmpleadosXEstado(
v_estado empleado.estado_Emp%TYPE,
v_cursor OUT vCursor)
IS
BEGIN
OPEN v_cursor FOR
SELECT nss_Emp,apellidoPat_Emp,apellidoMat_Emp,nombre_Emp,inicial_Emp,fechaIng_Emp
FROM Empleado WHERE estado_Emp=v_estado
ORDER BY apellidoPat_Emp,apellidoMat_Emp,nombre_Emp;
END pa_listarEmpleadosXEstado;
END paq_Empleado;

Probar procedimiento

variable c1 refcursor; execute paq_empleado.pa_listarEmpleadosXEstado('A',:c1); print c1;
variable c1 refcursor;
execute paq_empleado.pa_listarEmpleadosXEstado('A',:c1);
print c1;
variable c1 refcursor; execute paq_empleado.pa_listarEmpleadosXEstado('C',:c1); print c1;
variable c1 refcursor;
execute paq_empleado.pa_listarEmpleadosXEstado('C',:c1);
print c1;
variable c1 refcursor; execute paq_empleado.pa_listarEmpleadosXEstado('V',:c1); print c1;
variable c1 refcursor;
execute paq_empleado.pa_listarEmpleadosXEstado('V',:c1);
print c1;
variable c1 refcursor; execute paq_empleado.pa_listarEmpleadosXEstado('M',:c1); print c1;
variable c1 refcursor;
execute paq_empleado.pa_listarEmpleadosXEstado('M',:c1);
print c1;

Ejercicios

Dado un número de proyecto listar los nombre completos de los empleados, así como también el nombre del departamento al que pertenecen Dado un número de seguro social de empleado listar sus datos personales y también listar sus dependientes

pertenecen Dado un número de seguro social de empleado listar sus datos personales y también listar
Diseño de bases de datos Parte III
Diseño de bases de datos
Diseño de bases de datos
Parte III
Parte III

Oracle SQL Developer Data Modeler

Oracle SQL Developer Data Modeler
Oracle SQL Developer Data Modeler

Diseñando una base de datos

Considerar:

Tablas Columnas Restricciones Secuencias

Mantener un diccionario de datos Generar script DDL Generar informe