Vous êtes sur la page 1sur 85

Diseo e Implementacin de bases de

datos Oracle 11g


Ing. Martn Leiva Castillo
mleivac@unprg.edu.pe

Generalidades


Objetivos



Disear 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

Duracin


4 horas acadmicas

Contenido


Parte I


Parte II


Introduccin a Oracle 11g


Construccin de bases de datos

Parte III


Diseo de bases de datos

Introduccin a Oracle 11g


Parte I

Procesamiento de transacciones en lnea


(OLTP)



Proceso en el cual dada una transaccin 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 estn estructuradas para soportar anlisis de datos
histricos
Bases de datos transaccionales

INSERT
UPDATE
DELETE

SELECT

Procesamiento analtico en lnea (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 rpidas a
consultas empresariales complejas
Carga de datos

Bases de datos transaccionales

INSERT
UPDATE
DELETE

SELECT

Almacn de datos

SELECT

Qu es Oracle Databases?


Oracle Databases es un sistema de gestin de bases de datos


relacionales (RDBMS) que implementa caractersticas
orientadas a objetos
Soporta tipos definidos por el usuario, herencia y
polimorfismo, por lo que tambin 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 cmputo
Brindar transparencia para el usuario final

Ediciones de Oracle 11g







Enterprise Edition
Standard Edition
Standard Edition One
Express Edition

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

Oracle Database
Server

Instancia
System Global Area (SGA)
Database Writer (DBWn)

Database Buffer Cache


Redo Log Buffer

Shared Pool

Log Writer (LGWR)

Library Cache

Checkpoint (CKPT)

Dictionary Cache

System Monitor (SMON)


Process Monitor (PMON)

Large Pool
Java Pool

Program Global Area (PGA)

Base de datos

Archiver (ARCn)

Data Files
Control Files
Redo Log

SQL



Lenguaje utilizado para manipular bases de datos relacionales


Categora de instrucciones:


Lenguaje de definicin de datos (DML)




Lenguaje de manipulacin de datos (DDL)




CREATE, ALTER, DROP, RENAME, TRUNCATE

Lenguaje de control de transacciones




INSERT, UPDATE, DELETE, SELECT

COMMIT, ROLLBACK, SAVEPOINT

Lenguaje de control de datos (DCL)




GRANT, REVOKE

Qu es PL/SQL?





Lenguaje procedimental de Oracle


Es una extensin de SQL
Soporta DDL, DML y DCL
Ventajas






Integracin de SQL
Procesamiento procedimental
Funcionalidades suplementarias
Mejora del rendimiento
Integracin de los productos Oracle

Tipos de datos principales










NUMBER
CHAR
NCHAR
VARCHAR2
NVARCHAR2
DATE
TIMESTAMP









BINARY_FLOAT
BINARY_DOUBLE
ROWID
CLOB
NCLOB
BFILE
BLOB

Instalacin 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 automticamente 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 lgica 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

Conexin con Oracle SQL Developer

Sentencias bsicas


Creamos una tabla


CREATE TABLE Cliente
(
codigo_Cli NUMBER NOT NULL ,
nombre_Cli VARCHAR2(100) NOT NULL
);

Consultamos la tabla
SELECT * FROM Cliente;

Listamos las columnas de la tabla:


DESCRIBE Cliente;
DESC Cliente;

Listando informacin adicional de las columnas:


SELECT * FROM USER_CONS_COLUMNS WHERE TABLE_NAME = 'CLIENTE';

Tabla dual
SELECT 47*3.46 FROM dual;

Construccin de bases de datos


Parte II

Base de datos Empresa

Creacin de usuarios (1)




Creamos el usuario: empresa


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 procedure TO empresa;
GRANT create trigger TO empresa;
GRANT create view TO empresa;

Quitamos privilegios:
REVOKE create view FROM empresa;

Si es necesario eliminar el usuario:


DROP USER empresa;
DROP USER empresa CASCADE;

Creacin de usuarios (2)




Creamos el usuario: empresa


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 procedure TO empresa;
GRANT create trigger TO empresa;

Exigimos cambio de contrasea:


ALTER USER empresa PASSWORD EXPIRE;

Modificamos password:
ALTER USER empresa IDENTIFIED BY 123456;

Tablas



Unidad bsica de almacenamiento en una base de datos Oracle


Tipos:








Tablas relacionales
Tablas temporales
Tablas con organizacin de ndice
Tablas de objetos
Tablas externas
Tablas en clster
Tablas particionadas

Restricciones


Conjunto de reglas que pueden definirse sobre una o ms


columnas de una tabla para ayudar a imponer las reglas del
negocio
Tipos:
Restriccin

Descripcin

NOT NULL

Especifica que una columna no puede contener nulos

UNIQUE

Especificado para una columna o combinacin 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 relacin entre una o ms columnas de la tabla y una o ms


columnas de la tabla referenciada

CHECK

Especifica una condicin que se debe cumplir

Creacin de tablas


Creamos la tabla: proyecto


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 PK_Proyecto PRIMARY KEY ( numero_Pro ) ;
ALTER TABLE Proyecto
ADD CONSTRAINT UQ_Proyecto_nombre UNIQUE ( nombre_Pro ) ;

Creacin de la tabla Departamento




Creamos la tabla
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
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
(
numero_Dep
);

Modificando restricciones


Consultando las restricciones:


SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME='PROYECTO';

Deshabilitando una restriccin


ALTER TABLE Proyecto DISABLE CONSTRAINT FK_PROYECTO_DEPARTAMENTO;

Habilitando una restriccin


ALTER TABLE Proyecto ENABLE CONSTRAINT FK_PROYECTO_DEPARTAMENTO;

Eliminando una restriccin


ALTER TABLE Proyecto DROP CONSTRAINT FK_PROYECTO_DEPARTAMENTO;

Modificando tablas


Agregando una nueva columna:


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

Agregando DEFAULT a la nueva columna:


ALTER TABLE Proyecto MODIFY presupuesto DEFAULT 10000.00;

Renombrando la nueva columna:


ALTER TABLE Proyecto RENAME COLUMN presupuesto TO presupuesto_Pro;

Eliminando la nueva columna:


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;

Construir el resto de tablas




Mantener el siguiente orden:








LugarDepartamento
Empleado
Dependiente
Trabaja
EstadoEmpleado

Consultando las tablas creadas:


SELECT * FROM USER_TABLES;

Secuencias






Asigna nmeros secuenciales que se garantiza que son


unvocos
Pueden generar valores de hasta 28 cifras
La serie de nmeros puede ser ascendente o descendente
El intervalo puede ser cualquier valor
Oracle puede almacenar bloques de nmeros en cach a partir
de una secuencia contenida en memoria, para incrementar
todava la velocidad
Se garantiza que son unvocos, aunque no necesariamente
secuenciales

Creacin de secuencias


Creamos la secuencia:
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 (1,'Investigacin',4,null,null);

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;

Consultando y eliminando secuencias




Obtenemos el nuevo valor de la secuencia:


SELECT numero_Pro.NEXTVAL FROM dual;

Obtenemos el valor actual de la secuencia:


SELECT numero_Pro.CURRVAL FROM dual;

Consultamos las secuencias


SELECT * FROM USER_SEQUENCES;

Eliminamos la secuencia
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 eliminacin de tablas y
secuencias

Ejecucin de una transaccin





Una transaccin es un conjunto de sentencias DML que deben ser


atmicas, consistentes, aisladas y permanentes
Inicio de transaccin



Cuando no hay una transaccin en progreso y se ejecuta una


sentencia DML
No existe sentencia de inicio de transaccin

Fin de transaccin


COMMIT


Finaliza la transaccin actual y hace permanentes los cambios realizados

ROLLBACK


Finaliza la transaccin actual y deshace los cambios realizados

Ejemplo de una transaccin


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

Qu es un procedimiento almacenado?





Es un bloque de cdigo 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 instruccin
EXECUTE
Sintaxis:
CREATE [OR REPLACE] PROCEDURE nombre_procedimiento
[(parmetro {IN/OUT/ IN OUT} tipo, )]
{IS/AS}
Bloque PL/SQL

EXECUTE nombre_procedimiento [(parmetro, )]


DROP PROCEDURE nombre_procedimiento [(parmetro, )]

Procedimiento para eliminar


Dado el nmero de seguro social del empleado y el nmero
de dependiente eliminarlo

CREATE OR REPLACE PROCEDURE pa_eliminarDependiente(


v_nssEmp dependiente.nss_Emp%TYPE,
v_numero dependiente.numero_Depe%TYPE)
IS
BEGIN
DELETE FROM Dependiente WHERE nss_Emp=v_nssEmp AND numero_Depe=v_numero;
COMMIT;
END;

SELECT * FROM Dependiente WHERE nss_Emp='123456789';

EXECUTE pa_eliminarDependiente('123456789',3);

SELECT * FROM Dependiente WHERE nss_Emp='123456789';

Consultando procedimientos


Consultar sus parmetros


DESC pa_eliminardependiente;

Listando procedimientos:
SELECT * FROM USER_PROCEDURES WHERE object_name like 'PA_%';

SELECT * FROM USER_PROCEDURES WHERE object_type='PROCEDURE';

Obteniendo el cdigo fuente:


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

Eliminando el procedimiento:
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 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
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_empleados THEN RAISE_APPLICATION_ERROR(-20999,'Tiene un slo empleado');
END;

Probando el procedimiento


Consultar el proyecto 12
SELECT * FROM Trabaja WHERE numero_Pro=12;

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

Consultar el proyecto 11:


SELECT * FROM Trabaja WHERE numero_Pro=11;

Ejecutamos el procedimiento:
EXEC pa_desasignarProyecto('014685006',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 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_horas THEN 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';

Ejecutamos el procedimiento, asignando 20 horas:


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

Ejecutamos el procedimiento, asignando 14.5 horas:


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

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

Ejercicio 3


Insertar un departamento, en donde el procedimiento genere


el nmero del nuevo departamento

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_numero WHERE 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;

Verificamos:
SELECT * FROM departamento;

Agregando un nuevo departamento, asignando gerente


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

Verificamos:
SELECT * FROM departamento;
SELECT * FROM Empleado WHERE nss_emp='090000002';

Ejercicios adicionales


Insertar un nuevo proyecto, donde en el mismo procedimiento


de insercin se indique el empleado que asumir la jefatura del
proyecto. Tomar en cuenta que un empleado slo puede
dirigir como mximo tres proyectos a la vez.
Registrar un dependiente sabiendo que un empleado no puede
tener ms de cinco dependientes, y que el nmero de
dependiente debe ser generado por el mismo procedimiento.
Adems por cada dependiente asignado, el empleado debe
tener un incremento de salario de 100.00 nuevos soles

Funciones almacenadas

Qu es una funcin almacenada?





Una funcin es un fragmento de cdigo PL/SQL, pero la


funcin devuelve un valor
Sintaxis:
CREATE [OR REPLACE] FUNCTION nombre_funcin
[(parmetro [IN] tipo, )]
RETURN tipo
{IS/AS}
Bloque PL/SQL

SELECT nombre_funcin[(parmetro, )] FROM dual


variable := nombre_funcin[(parmetro, )]
DROP FUNCTION nombre_funcin

Funciones: ejemplo 1
Implementar una funcin que devuelva el nmero de
empleados de acuerdo a un estado especfico

CREATE OR REPLACE FUNCTION fdu_numeroEmpleados(


v_estado empleado.estado_Emp%TYPE)
RETURN number
IS
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;

SELECT fdu_numeroEmpleados('V') FROM dual;


SELECT fdu_numeroEmpleados('N') FROM dual;

Consultando funciones


Consultar sus parmetros


DESC fdu_numeroEmpleados;

Listando funciones:
SELECT * FROM USER_PROCEDURES WHERE object_name like 'FDU_%';

SELECT * FROM USER_PROCEDURES WHERE object_type='FUNCTION';

Obteniendo el cdigo fuente:


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

Funciones: ejemplo 2


Implementar una funcin que devuelva los departamentos


mostrando el nmero de empleados de sexo masculino y
femenino

CREATE OR REPLACE FUNCTION fdu_numeroEmpleadoDepSexo(


v_numeroDep empleado.numero_Dep%TYPE,
v_sexo empleado.sexo_Emp%TYPE)
RETURN number
IS
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;

SELECT numero_Dep, nombre_Dep,


fdu_numeroempleadodepsexo(numero_Dep,1) as Masculino,
fdu_numeroempleadodepsexo(numero_Dep,0) as Femenino
FROM Departamento;

Ejercicios



Para cada empleado que es supervisor mostrar el nmero de


supervisados que tienen
Para cada proyecto mostrar el nombre completo del
empleado ms antiguo que tienen

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 instruccin DML:
INSERT, UPDATE, DELETE
Puede ejecutarse antes o despus de la verificacin 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
restriccin de integridad
Se puede ejecutar para cada fila afectada por la instruccin
DML, o una sola vez para cada instruccin DML ejecutada

Tipos de disparadores


Dependiendo del momento en que se ejecuta:





Dependiendo de las veces que se ejecuta:





Antes de la verificacin de las restricciones de integridad


(BEFORE)
Despus de la verificacin de las restricciones de integridad
(AFTER)
Para cada fila afectada por la instruccin DML (opcin FOR
EACH ROW)
Una sola vez para cada instruccin DML (opcin predeterminada)

Si esta asociado a una vista:




Su ejecucin va a reemplazar a la instruccin DML a la que est


asociado ( INSTEAD OF)

Creacin de un disparador


Sintaxis:
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




Los datos de la tabla son inaccesibles desde las instrucciones


del bloque
Slo la fila que se est modificando es accesible a travs 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 clusula 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
new
old

INSERT
Permite conocer cual
es la fila insertada

UPDATE

DELETE

Permite conocer la fila


despus de su modificacin
Permite conocer la fila que
se va a modificar

Permite conocer qu
fila se va a eliminar

Disparadores: ejemplo 1


Eliminar slo los departamento que no tengan empleados


asignados
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 Departamento WHERE numero_Dep=12;

DELETE FROM Departamento WHERE numero_Dep=5;

Consultando disparadores


Listar sus propiedades


SELECT * FROM USER_TRIGGERS;

Listando disparadores:
SELECT * FROM USER_PROCEDURES WHERE object_name like 'TR_%';

SELECT * FROM USER_PROCEDURES WHERE object_type='TRIGGER';

Obteniendo el cdigo fuente:


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 (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 Empleado WHERE nss_Emp IN ('788229980','701781110');

Actualizamos salarios:
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';

Confirmamos actualizacin:
SELECT nss_Emp,salario_Emp,numero_Dep FROM Empleado WHERE nss_Emp IN ('788229980','701781110');

Disparadores: ejemplo 3


Un empleado no debe dedicarle ms 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;
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';

Asignamos proyecto al empleado:


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

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

Deshabilitar disparadores




La instruccin ALTER TRIGGER permite desactivar y despus


reactivar los disparadores
La desactivacin y la reactivacin 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;

Ejemplos:
ALTER TRIGGER tr_actualizaSalario DISABLE;
ALTER TRIGGER 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 adems se indique que va a ser jefe del proyecto, que
ste tenga slo un jefe

Paquetes

Qu es un paquete?



Agrupa de forma lgica elementos PL/SQL relacionados


Se dividen en dos partes:



Una cabecera o especificacin


Un cuerpo

Ventajas:






Modularidad
Simplificacin de desarrollo
Ocultar datos
Adicin de funcionalidades
Mejora de rendimiento

Cabecera del paquete




Permite describir el contenido del paquete y conocer el


nombre y los parmetros de llamada de las funciones y
procedimientos
Sintaxis:
CREATE PACKAGE nombre_paquete AS
--Definicin de tipos
--Declaracin de variables pblicas
--Prototipos de los cursores pblicos
--Prototipos de los procedimientos y funciones pblicos
END [nombre_paquete];

Ejemplo de cabecera
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 implementacin de los procedimientos y funciones


descritos en la cabecera
Tambin contiene definiciones de tipos y declaraciones de
variables cuyo mbito est limitado al cuerpo del paquete
Sintaxis:
CREATE PACKAGE BODY nombre_paquete AS
--Definicin de tipos locales al paquete
--Declaracin de variables locales al paquete
--Implementacin de los cursores pblicos
--Cuerpo de los procedimientos y funciones locales al paquete
--Cuerpo de los procedimientos y funciones pblicas
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 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;

Ejecucin 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_modificarProyecto(18,'Mantenimiento','Pacasmayo','T',4);
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 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 seleccin de mltiples registros
Estos punteros almacenan la direccin de memoria del objeto
apuntado y por lo tanto pueden pasarse como parmetros de
entrada/salida entre procedimientos almacenados o funciones
Declaracin:
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;

PROCEDURE pa_listarEmpleadosXEstado(
v_estado empleado.estado_Emp%TYPE,
v_cursor OUT vCursor);
END paq_Empleado;

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('C',: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;

Ejercicios


Dado un nmero de proyecto listar los nombre completos de


los empleados, as como tambin el nombre del departamento
al que pertenecen
Dado un nmero de seguro social de empleado listar sus
datos personales y tambin listar sus dependientes

Diseo de bases de datos


Parte III

Oracle SQL Developer Data Modeler

Diseando una base de datos




Considerar:









Tablas
Columnas
Restricciones
Secuencias

Mantener un diccionario de datos


Generar script DDL
Generar informe

Vous aimerez peut-être aussi