1
Ingeniería en sistemas
computacionales
Practica 1: Creación de Base de datos en Oracle
Profesor: Pizarro Gurrola Rubén
Integrantes:
Nombre N° Control
Benítez favela Julieta Anahí 10040316
Galindo Payan Daniela 10040325
Hernández Simental Adilene Zamira 10040335
Fecha de entrega: martes 20 de noviembre del 2012
2
Antes de empezar con la creación de nuestra base de datos es necesario crear un usuario
llamado admin con su correspondiente contraseña con privilegios de DBA que por lo
menos pueda crear tablas, índices, vistas, funciones, procedimientos, disparadores,
secuencias etc.
PASO 1 CREACIÓN DE TABLAS
Ya que hemos accedido con el usuario admin procederemos a crear las siguientes
tablas:
Categorías
Productos
Clientes
Empleados
Puestos
Ventas
Detalle_ venta
Facturas
Bitácora
3
1. CREACIÓN DE LA TABLA CATEGORIAS La tabla de categorías esta formada por dos columnas; la columna de id categoría
el cual será la llave primaria o bien el índice único de la tabla este puede ser
varchar ya que no se realizaran operaciones aritméticas con este campo, la otra
columna es la descripción de la categoría el tipo es varchar y en esta columna se
especifican los tipos de categorías que se manejaran en la empresa en nuestro
caso insertamos las categorías de: ropa interior, perfumería, zapatería, joyería,
línea blanca, farmacia, cosméticos, cereales, lácteos, carnes frías, panadería y
dulcería
DDL DE CATEGORIAS drop table categorias; create table categorias ( id_categoria varchar (10) not null primary key, descripcion varchar (50) not null ); --inserción de 10 categorias insert into categorias(id_categoria,descripcion) values (234588, 'ropa interior'); insert into categorias(id_categoria,descripcion) values (335678, ' PERFUMERIA'); insert into categorias(id_categoria,descripcion) values (445678, 'ZAPATERIA'); insert into categorias(id_categoria,descripcion) values (556789, 'JOYERIA'); insert into categorias(id_categoria,descripcion) values (6612345, 'LINEA BLANCA'); insert into categorias(id_categoria,descripcion) values (7790123, 'FARMACIA'); insert into categorias(id_categoria,descripcion) values (8823456, 'COSMETICOS'); insert into categorias(id_categoria,descripcion) values (9956432, 'CEREALES'); insert into categorias(id_categoria,descripcion) values (10023459, 'LACTEOS'); insert into categorias(id_categoria,descripcion)
4
values (200456781, 'CARNES FRIAS'); insert into categorias(id_categoria,descripcion) values (1100779, 'PANADERIA'); insert into categorias(id_categoria,descripcion) values (11007779, 'DULCERIA');
EJECUCIÓN DEL DDL DE LA TABLA CATEGORÍAS
2. CREACIÓN DE LA TABLA DE PRODUCTOS La tabla de productos esta conformada por los siguientes campos:
Clave_Producto: esta es la llave primaria de la tabla y representa el índice
único
Nombre: en esta columna se almacenara el nombre del producto.
Descripción: en este campo almacenaremos una breve descripción del
producto
Costo: este campo representa un valor numérico (es el gasto económico que
genera la fabricación de un producto).
Existencia: es un campo numérico, en este se almacena cuanta cantidad de
un producto se tiene en el inventario.
Id_categoria: este campo es una llave foránea referente a la tabla de
categorías este hace referencia a que categoría pertenece cualquier
5
producto que se agregue a esta tabla, no se puede agregar un producto que
no pertenezca a alguna de las categorías que agregamos a categorías.
DDL DE LA TABLA PRODUCTOS
En esta tabla insertaremos 50 productos los cuales estarán relacionados con la tabla de categorías por medio del id_categoria.
drop table productos; create table productos ( clave_producto number(10) primary key, nombre_producto varchar(20), descripcion varchar(60), costo number(10), precio number(10), existencia number(10), id_categoria varchar(10) ); insert into productos(clave_producto,nombre_producto,descripcion,costo,precio,existencia,id_categoria) values (125690,'leche','leche deslactosada',20,22,34,10023459); insert into productos(clave_producto,nombre_producto,descripcion,costo,precio,existencia,id_categoria) values (120690,'DIESEL','PERFUME FLORAL, RUTAL',1100,1050,8,335678); insert into productos(clave_producto,nombre_producto,descripcion,costo,precio,existencia,id_categoria) values (235690,'CREMA','CREMA ANTI ACNE',150,200,74,8823456); insert into productos(clave_producto,nombre_producto,descripcion,costo,precio,existencia,id_categoria) values (553377,'ZAPATOS','ZAPATOS DE PIEL SINTETICA COLOR CAFE DEL NUMERO 4',500,600,9,445678); insert into productos(clave_producto,nombre_producto,descripcion,costo,precio,existencia,id_categoria) values (667799,'PULSERA','PULSERA CON PIEDRAS DE CUARSO COLOR ROJO',200,230,19,556789); insert into productos(clave_producto,nombre_producto,descripcion,costo,precio,existencia,id_categoria)
6
values (6654321,'LAVADORA','LAVADORA CON CAPACIDAD DE 20KG COLOR VINO',4000,5000,10,6612345);
Ejecución del DDL de la tabla productos
La tabla se ha creado con éxito y contiene los siguientes registros
7
3. CREACIÓN DE LA TABLA DE CLIENTES Esta tabla contiene información sobre los clientes de la empresa los campos de
la tabla son los siguientes:
Clave cliente: este campo es la llave primaria de la tabla puede ser numérico
o varchar
RFC: este es de tipo varchar ya que el rfc contiene letras y números
Razon_Social: tipo de dato varchar (es la denominación por la cual se conoce colectivamente a una empresa. Se trata de un nombre oficial y legal )
Calle_No: tipo de dato varchar
Colonia: tipo de dato varchar
Ciudad: tipo de dato varchar
Estado: tipo de dato varchar
E_Mail: tipo de dato varchar
Teléfono: tipo de dato varchar
DDL DE LA TABLA CLIENTES
En esta tabla daremos de alta 10 clientes con sus respectivas claves drop table clientes; create table clientes ( clave_cliente number(10) not null primary key, rfc varchar (20), razon_social varchar(60), calle_no varchar(50), colonia varchar (20), ciudad varchar (20), estado varchar (20), e_mail varchar (60), telefono varchar (20) ); --------------------------------REGISTROS-------------------------------- insert into clientes(clave_cliente,rfc,razon_social,calle_no,colonia,ciudad,estado,e_mail,telefono) values (1000,'GESY34568','JULIADIDANI S.A.de C.V','CIELO AXUL 223','ARCOIRIX','DURANGO','DURANGO','[email protected]','6181585713'); insert into clientes(clave_cliente,rfc,razon_social,calle_no,colonia,ciudad,estado,e_mail,telefono) values (2000,'RESU34569','JULIADIDANI S.A.de C.V','GUACAMAYA 923','FAUNA','LA PAZ','BAJA CALIFORNA SUR','[email protected]','6181585714');
8
insert into clientes(clave_cliente,rfc,razon_social,calle_no,colonia,ciudad,estado,e_mail,telefono) values (3000,'HTRE34570','JULIADIDANI S.A.de C.V','JACARANDA 423','FLORIDA','MONTERREY','NUEVO LEON','[email protected]','6181585715'); insert into clientes(clave_cliente,rfc,razon_social,calle_no,colonia,ciudad,estado,e_mail,telefono) values (4000,'WSCT34571','JULIADIDANI S.A.de C.V','MEXICO 390','MILPAS','MORELIA','MICHOACAN','[email protected]','6181585716'); insert into clientes(clave_cliente,rfc,razon_social,calle_no,colonia,ciudad,estado,e_mail,telefono) values (5000,'HESA345755','JULIADIDANI S.A.de C.V','NIEBLA 407','CIELO NEGRO','ERMOSILLO','SONORA','[email protected]','6181585718'); insert into clientes(clave_cliente,rfc,razon_social,calle_no,colonia,ciudad,estado,e_mail,telefono) values (6000,'HESA34573','JULIADIDANI S.A.de C.V','MAR NEGRO 467','MARES','ERMOSILLO','SONORA','[email protected]','6181585718'); insert into clientes(clave_cliente,rfc,razon_social,calle_no,colonia,ciudad,estado,e_mail,telefono) values (7000,'HESA34574','JULIADIDANI S.A.de C.V','CIELO GRIS 125','NUBES','CHIHUAHUA','CHIHUAHUA','[email protected]','6181585719'); insert into clientes(clave_cliente,rfc,razon_social,calle_no,colonia,ciudad,estado,e_mail,telefono) values (8000,'HESA34575','JULIADIDANI S.A.de C.V','TORMENTA 623','GRANADOS','COLIMA','COLIMA','[email protected]','6181585720'); insert into clientes(clave_cliente,rfc,razon_social,calle_no,colonia,ciudad,estado,e_mail,telefono) values (9000,'HESA34576','JULIADIDANI S.A.de C.V','TERREMOTO 923','MORIBUNDOS','CULIACAN','SINALOA','[email protected]','6181585721'); insert into clientes(clave_cliente,rfc,razon_social,calle_no,colonia,ciudad,estado,e_mail,telefono) values (11000,'HESA34577','JULIADIDANI S.A.de C.V','OLAS TURBIAS 708','ARCOIRIX','JALAPA','VERACRUZ','[email protected]','6181585722');
9
Ejecución del DDL de la tabla clientes
La tabla se creo correctamente y podemos observar que ya contiene los 10 registros que insertamos.
10
4. CREACIÓN DE LA TABLA DE EMPLEADOS En esta tabla se almacenara información sobre los empleados de una empresa x
La tabla esta formada por los siguientes campos:
No_Empleado: este puede ser un campo numérico o varchar y será la llave
primaria de la tabla.
Paterno: es un campo tipo varchar
Materno: varchar
Nombre: varchar
Sexo: char
Fecha_Nacimiento: date
Sueldo: number
Puesto: puede ser numérico o varchar en él se almacena la clave del puesto
es llave foránea en esta tabla y primaria en la tabla de puestos.
DDL DE LA TABLA EMPLEADOS drop table empleados; create table empleados ( no_empleado varchar(10)not null primary key, paterno varchar(20) not null, materno varchar(60)not null, nombre varchar(50)not null, sexo char not null, fecha_nacimiento date, sueldo number(10)not null, puesto number(10)not null ); ----------------------------------INCERCION DE 10 REGISTROS--------------------- insert into empleados(no_empleado,paterno,materno,nombre,sexo,fecha_nacimiento,sueldo,puesto) values (18302,'GANDARA','LOPEZ','MARIA NICOLASA','F','12/03/11','700',120011 ); insert into empleados(no_empleado,paterno,materno,nombre,sexo,fecha_nacimiento,sueldo,puesto) values (18303,'RETANA','CHAVEZ','JUAN PABLO','M','15/06/1985','6000',120012); insert into empleados(no_empleado,paterno,materno,nombre,sexo,fecha_nacimiento,sueldo,puesto) values (18311,'DOLORES','DEL ORTO','MARIA','F','21/05/1991','1000',120012); insert into empleados(no_empleado,paterno,materno,nombre,sexo,fecha_nacimiento,sueldo,puesto)
11
values (18304,'PEREZ','LAZO','RITA','F','30/07/1990','1500',120013); insert into empleados(no_empleado,paterno,materno,nombre,sexo,fecha_nacimiento,sueldo,puesto) values (18305,'TRADO','HITTLER','BARTOLOMEO','M','15/05/1890','2500',1200190); insert into empleados(no_empleado,paterno,materno,nombre,sexo,fecha_nacimiento,sueldo,puesto) values (18306,'LEDEZMA','PEREZ','WACHI','M','21/09/1992','1800',120015); insert into empleados(no_empleado,paterno,materno,nombre,sexo,fecha_nacimiento,sueldo,puesto) values (18307,'GOMEZ','PERALTA','TOSHIBA FIDELINA','F','01/03/1989','9300',120017); insert into empleados(no_empleado,paterno,materno,nombre,sexo,fecha_nacimiento,sueldo,puesto) values (18308,'SANCHEZ','FERNANDEZ','LEOPOLDO','M','13/11/1986','2000',120018); insert into empleados(no_empleado,paterno,materno,nombre,sexo,fecha_nacimiento,sueldo,puesto) values (18309,'GRANADOS','BRIOS','PANDOLFO','M','10/12/1987','3000',12001200); insert into empleados(no_empleado,paterno,materno,nombre,sexo,fecha_nacimiento,sueldo,puesto) values (18310,'SARMIENTO','DORADO','ANTONIO','M','25/12/1990','3500',120013);
Ejecución del DDL de la tabla empleados
12
Tabla después de la inserción
5. CREACIÓN DE LA TABLA DE PUESTOS La tabla de puestos contiene los campos de puesto el cual representa la clave del
puesto y es la llave primaria de la tabla, el nombre del puesto, y el sueldo base.
DDL de la tabla de puestos drop table puestos; create table puestos ( puesto number(10)not null primary key, nombre varchar(50)not null, sueldo_base number(10)not null ); insert into puestos(puesto,nombre,sueldo_base) values (120011,'LIMPIEZA',500); insert into puestos(puesto,nombre,sueldo_base) values (120012,'SECRETARIO',1000); insert into puestos(puesto,nombre,sueldo_base) values (120013,'CAJERO',950); insert into puestos(puesto,nombre,sueldo_base) values (120014,'CARNICERO',800); insert into puestos(puesto,nombre,sueldo_base) values (120015,'VENDEDOR',750); insert into puestos(puesto,nombre,sueldo_base) values (120016,'CONTADOR',6000); insert into puestos(puesto,nombre,sueldo_base) values (120017,'GERENTE',7000);
13
insert into puestos(puesto,nombre,sueldo_base) values (120018,'SUPERVISOR',5500); insert into puestos(puesto,nombre,sueldo_base) values (12088190,'ADMINISTRADOR',6500); insert into puestos(puesto,nombre,sueldo_base) values (1300034,'PANADERO',1200); Ejecución del DDL de la tabla puestos
Después de la creación
14
6. CREACIÓN DE LA TABLA DE VENTAS Para la creación de la tabla de ventas es necesario crear antes una secuencia o
consecutivo el cual será la llave primaria de la tabla el código SQL para la creación
de la secuencia es el siguiente:
--consecutivo para la tabla de ventas
drop sequence sq_consecutivo_ventas;
create sequence sq_consecutivo_ventas --es un valor predefinido
MINVALUE 1
MAXVALUE 999999999999999999999999999
start with 1
increment by 1;
--DDL de la tabla de ventas
La tabla de ventas tiene los campos de consecutivo_ ventas el cual se creo
anteriormente este campo es la llave primaria de la tabla, la fecha tipo date, la
clave del cliente la cual es llave foránea referente a la tabla de clientes, el numero
del empleado el cual también es llave foránea con referencia a la tabla de
empleados y el total que es un campo numérico. Las llaves foráneas deben ser del
mismo tipo y del mimo tamaño que como se declararon en las tablas a las que se
hace referencia.
Al insertar en la tabla mandamos llamar el consecutivo que creamos ya que forma
parte de los campos de la tabla en el total ponemos cualquier valor o bien cero ya
que este campo se llenara automáticamente mas adelante. Insertamos 20 ventas.
drop table ventas;
create table ventas
(
consecutivo_ventas number not null primary key,
fecha date not null,
clave_cliente number(10)not null,
no_empleado number(10)not null,
total number not null
);
insert into ventas(consecutivo_ventas,fecha,clave_cliente,no_empleado,total)
values (sq_consecutivo_ventas.nextval,'09/09/11',1000,18302,0);
insert into ventas(consecutivo_ventas,fecha,clave_cliente,no_empleado,total)
15
values (sq_consecutivo_ventas.nextval,'10/05/12',2000,18303,0);
insert into ventas(consecutivo_ventas,fecha,clave_cliente,no_empleado,total)
values (sq_consecutivo_ventas.nextval,'15/06/12',3000,18311,0);
insert into ventas(consecutivo_ventas,fecha,clave_cliente,no_empleado,total)
values (sq_consecutivo_ventas.nextval,'21/05/12',4000,18304,0);
Ejecución del DDL de la tabla ventas
16
Tabla de ventas con registros:
7. CREACIÓN DE LA TABLA DE DETALLE_VENTAS En la tabla de detalle ventas se tienen los siguientes campos:
Consecutivo_ventas: el cual es una llave foránea referente a la tabla de ventas.
Clave_producto: es llave foránea referente a la tabla de productos.
Cantidad: es un campo numérico.
Precio: es un campo numérico.
Importe: es un campo numérico el cual es el resultado de la multiplicación de la
cantidad por el precio.
drop table detalle_venta;
create table detalle_venta ( consecutivo_ventas number not null, clave_producto number(10)not null, cantidad number(10)not null, precio number (10) not null, importe number (10) not null );
17
Después de que tenemos creada
la tabla es necesario crear un
procedimiento para realizar el
cálculo del importe.
DDL del procedimiento para el cálculo del importe
create or replace procedure pa_agregar_detalle_ventas
( v_consecutivo_ventas number,
v_clave_producto number,
v_cantidad number,
v_precio number
)
as
v_importe number;
v_total number;
begin
v_importe:= (v_cantidad * v_precio);
insert into detalle_venta (consecutivo_ventas,clave_producto,cantidad,precio,importe)
values(v_consecutivo_ventas,v_clave_producto,v_cantidad,v_precio,v_importe);
select sum(importe) into v_total
from detalle_venta
where consecutivo_ventas = v_consecutivo_ventas;
update ventas
18
set ventas.total = v_total-- variable
where ventas.consecutivo_ventas = v_consecutivo_ventas;
end;
Ejecución del procedimiento para agregar en la tabla de detalle venta
Después de ejecutar el procedimiento lo único que hace falta es mandarlo llamar
para poder insertar en la tabla de detalle venta empleando los consecutivos de la
tabla de ventas. Se insertaran tres detalles por venta y con el procedimiento se
actualizara el campo de total. El cual se calculo con la sumatoria de los importes.
Llamada al procedimiento para agregar en la tabla de detalle venta y
actualizar el total en ventas
begin
pa_agregar_detalle_ventas(115, 125690,2,22);
pa_agregar_detalle_ventas(115,120690,3,1050);
pa_agregar_detalle_ventas(115,235690,5,200);
pa_agregar_detalle_ventas(116,550088,9,200);
19
pa_agregar_detalle_ventas(116,553377,1,600);
pa_agregar_detalle_ventas(116,235690,2,200);
pa_agregar_detalle_ventas(117, 770088,1,3500);
pa_agregar_detalle_ventas(117,220022,2,58);
pa_agregar_detalle_ventas(117,330033,3,62);
pa_agregar_detalle_ventas(118,667799,2,800);
pa_agregar_detalle_ventas(118,220022,2,58);
pa_agregar_detalle_ventas(118,440033,5,60);
pa_agregar_detalle_ventas(119,550088,9,200);
pa_agregar_detalle_ventas(119,447799,2,40);
pa_agregar_detalle_ventas(119,667799,1,230);
pa_agregar_detalle_ventas(120, 6654321,1,5000);
pa_agregar_detalle_ventas(120,112277,2,60);
pa_agregar_detalle_ventas(120,223344,1,46);
pa_agregar_detalle_ventas(121,550088 ,1,45);
pa_agregar_detalle_ventas(121,33441277,1,2500);
pa_agregar_detalle_ventas(121,2244778800,1,65);
pa_agregar_detalle_ventas(121,551122007 ,1,600);
pa_agregar_detalle_ventas(121,661122005,3,22);
pa_agregar_detalle_ventas(121,66002244,1,500);
end;
20
Como podemos observar en base al consecutivo existente en ventas se
llena la tabla de detalle venta y el importe es calculado automático por
el procedimiento.
21
Después de esto la tabla de ventas se ha actualizado y en la columna del total
nos aparece la suma de los importes por cada detalle_venta teniendo en
cuenta que son tres detalles por venta.
8. CREACIÓN DE LA TABLA DE FACTURAS La tabla de facturas tiene los siguientes campos:
No de factura: este campo es la llave primaria de la tabla puede ser number o
varchar.
Fecha: la fecha representa un tipo de dato (date) en el cual almacenaremos la
fecha en que se expidió la factura.
Cantidad: representa un valor numérico
Consecutivo_ ventas: este campo es llave foránea referente a la tabla de ventas
Rfc: representa un valor varchar y es foránea de la tabla de clientes.
En el DDL de facturas insertaremos 20 registros de facturas, como se puede
observar en el código que se muestra a continuación.
22
DDL de la tabla de facturas
drop table facturas;
create table facturas
(
no_factura number primary key not null,
fecha date,
cantidad number(10),
consecutivo_ventas number,
rfc varchar (20)
);
--insercion de 20 registros
insert into facturas(no_factura,fecha,cantidad,consecutivo_ventas,rfc)
values (13001,'15/10/12',4,115,'GAEL0902D');
insert into facturas(no_factura,fecha,cantidad,consecutivo_ventas,rfc)
values (13009,'16/11/11',3,116,'HECA0934K');
insert into facturas(no_factura,fecha,cantidad,consecutivo_ventas,rfc)
values (13008,'25/12/11',2,117,'JAEH0602J');
insert into facturas(no_factura,fecha,cantidad,consecutivo_ventas,rfc)
values (13007,'01/10/12',1,118,'FART0760J');
insert into facturas(no_factura,fecha,cantidad,consecutivo_ventas,rfc)
values (13006,'03/11/11',5,119,'HESA910510');
insert into facturas(no_factura,fecha,cantidad,consecutivo_ventas,rfc)
values (13005,'02/12/11',10,120,'BEFA8123G');
insert into facturas(no_factura,fecha,cantidad,consecutivo_ventas,rfc)
values (13004,'25/12/11',12,121,'RORO0213H');
insert into facturas(no_factura,fecha,cantidad,consecutivo_ventas,rfc)
values (13003,'05/10/12',5,121,'YOUL7865G');
23
Ejecución del DDL de la tabla de facturas
Tabla Después de la ejecución del
DDL
9. CREACIÓN DE LA TABLA DE BITACORA Para la creación de la Tabla bitácora vamos a crear un consecutivo el cual será la
llave primaria de la tabla. El DDL de la creación del consecutivo es el siguiente.
--consecutivo bitacora drop sequence sq_consecutivo_bitacora; create sequence sq_consecutivo_bitacora --es un valor predefinido MINVALUE 1 MAXVALUE 9999999999999999999999999999 start with 1 increment by 1; Después de crear el consecutivo, creamos la tabla con los siguientes campos:
consecutivo_bitacora; el cual es el consecutivo que hicimos y es la llave primaria,
de la tabla, la fecha en que se realizo alguna operación, la tabla; representa la
tabla en la que se realizo la operación. Campo afectado;
24
DDL de la creación de la tabla de bitácora
drop table bitacora;
create table bitacora
(
consecutivo_bitacora number not null primary key,
fecha date not null,
tabla varchar(20)not null,
operacion char not null,
campo_afectado varchar(50) not null
);
Para llenar la tabla de bitácora necesitamos crear disparadores para cada tabla o
bien para cada operación que vallamos a realizar sobre las tablas. Por ejemplo
para insertar en la tabla de categorías y que a su vez se registre en la bitácora la
inserción, hacemos lo siguiente.
Disparador para insertar en bitácora.
create or replace trigger tr_bit_agregar_categorias
after insert on categorias –-indica que después de la inserción llene bitácora
for each row
declare
v_fecha date;
begin
select sysdate into v_fecha
from dual;
insert into bitacora(consecutivo_bitacora,fecha,tabla,operacion,campo_afectado)
values(sq_consecutivo_bitacora.nextval,v_fecha,'categorias','a',:new.id_categori
a);
end;
Ejecución del disparador para insertar en bitácora.
Para esto hacemos una inserción en categorías y se puede ver en bitácora.
insert into categorias(id_categoria,descripcion)
values(9004138,'DESORODANTE DE LIMON');
25
Tabla bitácora después de insertar en categorías.
Se puede ver que en la tabla bitácora nos almacena la fecha el consecutivo, la
tabla en la cual insertamos, la operación que es un alta, y el campo afectado es el
id_categoria.
PASO 2 CREACIÓN DE ÍNDICES:
Los índices de una base de datos representan una estructura de datos que
mejora la velocidad de las operaciones, permitiendo un rápido acceso a los
registros de una tabla. Al aumentar drásticamente la velocidad de acceso, se
suelen usar sobre aquellos campos sobre los cuales se vayan a realizar búsquedas
frecuentes. Los índices pueden ser creados usando una o más columnas,
preparando la base de datos tanto para búsquedas rápidas al azar como para
ordenaciones eficientes de los registros.
Al crear las llaves primarias automáticamente se crean índices primarios únicos
de cada tabla, pero es necesario crear otros índices para ello creamos los
siguientes para cada tabla:
Tabla Índices:
Categorías 1. Índice único por el campo Id_categoria. 2. Índice normal por el campo descripción.
Productos 3. Índice normal por nombre. 4. Indice normal por costo de producto. 5. Indice normal compuesto por los campos de
Id_categoria y clave_producto.
Clientes 6. Indice único por el campo RFC 7. Indice normal por el campo razón social 8. Indice normal compuesto por los campos
estado, ciudad y colonia.
Empleados 9. Indice normal compuesto por los campos de Apellido_paterno, materno y nombre.
10. Indice normal por fecha de nacimiento 11. Indice normal por sueldo 12. Indice normal por puesto
Puestos 13. Indice normal por nombre 14. Indice normal por sueldo_base
Ventas 15. Indice normal por fecha de venta
26
16. Indice normal por clave de cliente 17. Indice normal por no_empleado 18. Indice normal por total de venta
Detalle_Ventas 19. Indice normal por clave de producto 20. Indice normal por importe
Facturas 21. Indice normal compuesto por RFC de cliente y fecha factura
22. Indice normal por fecha de factura 23. Indice normal por consecutivo de no_de_venta
Bitacora 24. Indice normal por fecha 25. Indice normal compuesto por usuario, fecha y
tabla
Índices para la tabla de categorías
1. Índice único por el campo Id_categoria. Debido a que este campo es la llave
primaria de la tabla de categorías se ha creado automáticamente al crear la tabla.
2. DDL del Índice normal por el campo descripción
create index categorias_descripcion on categorías
(descripcion);
Ejecución del DDL del índice 2 de categorías
27
INDICES DE LA TABLA DE PRODUCTOS
3.DDL Indice normal por nombre
create index productos_nombre on productos(
nombre_producto
);
Ejecucion del DDL del índice 3 de productos
4.DDL Indice normal por costo de producto create index costo_producto on productos(costo);
28
Ejecucion del DDL del índice 4 de productos
5. DDL Indice normal compuesto por los campos de Id_categoria y clave_producto. create index productos_id_clave on productos(id_categoria,clave_producto); Ejecucion del DDL del índice 5 de productos
29
6.Índice único por el campo RFC. Debido a que este campo es la llave primaria de la tabla clientes se ha creado automáticamente al crear la tabla.
7.DDL Indice normal por el campo razón social create index clientes_razon on clientes(razon_social);
Ejecucion del DDL del índice 7 de clientes
8. DDL Índice normal compuesto por los campos estado, ciudad y colonia create index clientes_compuesto on clientes (estado,ciudad,colonia); Ejecucion del DDL del índice 8 de clientes
30
INDICES DE LA TABLA DE EMPLEADOS
9. DDL Indice normal compuesto por los campos de Apellido_paterno,
materno y nombre
create index empleados_amn on empleados(paterno,materno,nombre);
Ejecucion del DDL del índice 9 de empleados
10.DDL Indice normal por fecha de nacimiento create index empleados_compuesto on empleados(fecha_nacimiento); Ejecucion del DDL del índice 10 de empleados
31
11. DDL Indice normal por sueldo create index empleados_sueldo on empleados(sueldo); Ejecucion del DDL del índice 11 de empleados
12. DDL Indice normal por puesto create index empleados_puesto on empleados(puesto); Ejecucion del DDL del índice 12 de empleados
32
INDICES DE LA TABLA DE PUESTOS
13. DDL Indice normal por nombre
create index puestos_nombre on puestos(nombre); Ejecucion del DDL del índice 13 de puestos
14. DDL Indice normal por sueldo_base
create index puestos_sueldobase on puestos(sueldo_base); Ejecucion del DDL del índice 14 de puestos
33
INDICES DE LA TABLA DE VENTAS
15. DDL Indice normal por fecha de venta create index ventas_fecha_venta on ventas(fecha); Ejecucion del DDL del índice 15 de ventas
16. DDL Indice normal por clave de cliente create index ventas_clave on ventas(clave_cliente);
Ejecucion del DDL del índice 16 de ventas
34
17. DDL Indice normal por no_empleado create index ventas_no_empleado on ventas(no_empleado); Ejecucion del DDL del índice 17 de ventas
18. DDL Indice normal por total de venta create index ventas_totalv on ventas(total); Ejecucion del DDL del índice 18 de ventas
35
INDICES DE LA TABLA DE DETALLE_VENTA
19.DDL Indice normal por clave de producto create index detalle_venta_clave_producto on detalle_venta(clave_producto); Ejecucion del DDL del índice 19 detalle_venta
20.DDL Indice normal por importe create index detalle_importe on detalle_venta(importe); Ejecucion del DDL del índice 20 detalle_venta
36
INDICES DE LA TABLA DE FACTURAS
21. DDL Indice normal compuesto por RFC de cliente y fecha factura
create index facturas_rfcfecha on facturas(fecha,rfc); Ejecucion del DDL del índice 21 tabla facturas
22.DDL Indice normal por fecha de factura create index facturas_fecha on facturas(fecha); Ejecucion del DDL del índice 22 tabla facturas
37
23.DDL Indice normal por consecutivo de no_de_venta create index no_venta on facturas(consecutivo_ventas); Ejecucion del DDL del índice 23 tabla facturas
INDICES DE LA TABLA DE BITACORA
24.DDL Indice normal por fecha create index bitacora_fecha on bitacora(fecha); Ejecución del DDL del índice 24 tabla bitacora
38
25. DDL Indice normal compuesto por usuario, fecha y tabla create index bitacora_fecha_tabla on bitacora(fecha,tabla); Ejecucion del DDL del índice 25 tabla bitacora
PASO 3 CREACIÓN DE VISTAS Una vista es una alternativa para mostrar datos de varias tablas; es como una tabla virtual que
almacena una consulta. Los datos accesibles a través de la vista no están almacenados en la base de
datos. Las vistas permiten: simplificar la administración de los permisos de usuario: se pueden dar al
usuario permisos para que solamente pueda acceder a los datos a través de vistas, en lugar de
concederle permisos para acceder a ciertos campos, así se protegen las tablas base de cambios en su
estructura.
CREAR LAS SIGUIENTES VISTAS PARA CADA TABLA:
Tabla Vistas
Categorías 1. Vista de los campos Id_categoria y descripción
Productos 2. Vista de los campos clave producto, nombre y descripción
3. Vista de los campos clave de producto, costo, precio y existencia.
39
4. Vista de dos tablas (productos y categorías), de los campos clave de producto, nombre descripción, id_categoria y descripción de la categoría.
Clientes 5. Vista de los campos clave de cliente, razón social, ciudad y estado.
6. Vista de los campos clave de cliente, calle, colonia, teléfono email.
Empleados 7. Vista de los campos no_empleado, paterno, materno y nombre
8. Vista de los campos no_empleado, sexo y fecha de nacimiento
9. Vista de dos tablas (empleados y puestos) de los campos no_empleado, puesto y sueldo. Así como de la tabla puestos el nombre del puesto y el sueldo base del puesto.
Puestos 10. Vista de puesto, y nombre 11. Vista de puesto y sueldo base
Ventas 12. Vista de consecutivo venta, fecha venta y total 13. Vista de consecutivo venta, clave_cliente y fecha de
venta. 14. Vista de dos tablas (ventas con empleados):
Consecutivo venta, no_empleado, paterno materno y nombre
15. Vista de dos tablas (ventas con clientes): consecutivo venta, fecha venta, rfc o clave de cliente, razón social del cliente y total de la venta
Detalle_Ventas 16. Vista de consecutivo venta, clave_producto, cantidad, precio, importe
17. Vista de tres tablas (detalle_ventas, ventas y productos): consecutivo_ventas, fecha_venta, clave_producto,
nombre_producto, cantidad, precio, importe, total de
cada venta.
Facturas 18. Vista de número factura, fecha de factura, y consecutivo venta.
19. Vista de dos tablas (factura y clientes):no factura, rfc cliente ó clave cliente, razón social, fecha y total factura.
Bitácora 20. Vista con los campos de fecha, usuario, operación, tabla
VISTAS DE LA TABLA DE CATEGORIAS
1. DDL de la creación de la vista de los campos Id_categoria y descripción
--Vista de los campos Id_categoria y descripción
--aquí se crea la vista
drop view vis_categorias;
create view vis_categorias
as
select id_categoria,descripcion
from categorias;
40
--insertar
insert into categorias(id_categoria,descripcion)
values (123456000,'ELECTRONICA');
Ejecución del DDL de la vista 1 de categorias
Vista después de la inserción
VISTAS DE LA TABLA DE PRODUCTOS
1. DDL de la creación de la vista de los campos clave producto, nombre y descripción.
DDL de la vista 2 de la tabla de productos. --2. Vista de los campos clave producto, nombre y descripción
drop view vis_productos;
create view vis_productos
as
select clave_producto,nombre_producto,descripcion
from productos;
--insertar
41
insert into productos(clave_producto,nombre_producto,descripcion)
values(123478800,'GOMAS','GOMAS SABOR MANGO CON CHILE'); Ejecución del DDL de la vista 2 de productos
Después de insertar en la tabla de productos en la vista solo se extraen los datos
que se encuentren en los campos que pusimos en la vista.
2. DDL de la creación de la vista de los campos clave de producto, costo, precio y existencia. --3. Vista de los campos clave de producto, costo, precio y
existencia.
drop view vis_productos3;
create view vis_productos3
as
select clave_producto,costo,precio,existencia
from productos;
--insertar
insert into productos(clave_producto,costo,precio,existencia)
values(1256900,45,48,19);
42
Ejecución del DDL de la vista 3 de productos
Después de insertar en la tabla
productos se extraen solo los
campos seleccionados en la vista.
3. DDL de la Vista de dos tablas (productos y categorías), de los campos
clave de producto, nombre descripción, id_categoria y descripción de
la categoría.
--4. Vista de dos tablas (productos y categorías), de los campos
clave de producto, nombre descripción,
--id_categoria y descripción de la categoría.
drop view vis_productos_categorias;
create view vis_productos_categorias
as
select
clave_producto,nombre_producto,descripcion,categorias.descripcion_ca
tegoria,categorias.id_categoria
from productos,categorías
43
Después de ejecutar el DDL de la vista se extraen los campos seleccionados
de la tabla de productos se extraen los datos que se encuentran en el campo
de clave de producto, así como la descripción del producto y de la tabla de
categorías se extrae el id_categoria y la descripción de todas las categorías.
VISTAS DE LA TABLA DE CLIENTES
4. DDL de la creación de la vista de los campos clave de cliente, razón social, ciudad y estado.
La vista se puede ver de la siguiente manera.
44
5. DDL de la vista de los campos clave de cliente, calle, colonia, teléfono
email.
drop view vista_clientes;
create view vista_clientes
as
select clave_cliente,calle_no,colonia,telefono,e_mail
from clientes;
Ejecución del DDL de la vista 6 de clientes
45
VISTAS DE LA TABLA DE EMPLEADOS
6. DDL de la vista de los campos no_empleado, paterno, materno y
nombre. drop view VISTA7_EMPLEADOS;
create view VISTA7_EMPLEADOS
as
select no_empleado,paterno,materno,nombre
from empleados
Ejecución del DDL de la vista 7 de empleados
46
7. DDL de la vista de los campos no_empleado, sexo y fecha de nacimiento --VISTA 8
drop view VISTA8_EMPLEADOS;
create view VISTA8_EMPLEADOS
as
select no_empleado,sexo,fecha_nacimiento
from empleados
Ejecución del DDL de la vista 8 de empleados
47
8. DDL de la vista de dos tablas (empleados y puestos) de los campos no_empleado, puesto y sueldo. Así como de la tabla puestos el nombre
del puesto y el sueldo base del puesto. --VISTA 9 drop view VISTA9_EMPLEADOS; create view VISTA9_EMPLEADOS as select no_empleado,empleados.puesto,sueldo, puestos.nombre,puestos.sueldo_base from empleados,puestos
Ejecución del DDL de la vista 9 de empleados y puestos
VISTAS DE LA TABLA DE PUESTOS
9. DDL de la vista de puesto, y nombre --VISTA10
drop view VISTA10_PUESTOS;
create view VISTA10_PUESTOS
as
select puesto,nombre
from puestos
Ejecución del DDL de la vista 10 de puestos
48
10. DDL de la vista de puesto y sueldo base --VISTA11 drop view VISTA11_PUESTOS; create view VISTA11_PUESTOS as select puesto,sueldo_base from puestos
Ejecución del DDL de la vista 11 de puestos
VISTAS DE LA TABLA DE VENTAS
11. DDL de la vista de consecutivo venta, fecha venta y total drop view VISTA12_VENTAS;
create view VISTA12_VENTAS
as
select consecutivo_ventas,fecha,total
from ventas
Ejecución del DDL de la vista 12 de ventas
49
12. DDL de la vista de consecutivo_ventas, clave_cliente y fecha de venta. drop view vista13_ventas;
create view vista13_ventas
as
select consecutivo_ventas,clave_cliente,fecha
from ventas;
Ejecución del DDL de la vista 13 de ventas
13. DDL de la vista de dos tablas (ventas y empleados) consecutivo_ventas, no_empleado, paterno, materno y nombre. drop view VISTA14_VENTAS_EMP;
create view VISTA14_VENTAS_EMP
as
select
consecutivo_ventas,empleados.no_empleado,empleados.paterno,empleados.mater
no,empleados.nombre
from ventas,empleados;
Ejecución del DDL de la vista 14 de ventas y empleados
50
Vista después de la ejecución del DDL
14. DDL de la Vista de dos tablas (ventas con clientes): consecutivo venta, fecha venta, rfc o clave de cliente, razón social del cliente y total de la
venta. drop view VISTA15_VENTAS_CLI;
create view VISTA15_VENTAS_CLI
as
select
consecutivo_ventas,fecha,clientes.rfc,ventas.clave_cliente,clientes.razon_
social,ventas.total
from ventas,clientes;
Ejecución del DDL de la Vista 15 de ventas y clientes
51
Salida después de la Ejecución del DDL 15
VISTAS DE LA TABLA DE DETALLE_VENTAS
15. DDL de la Vista de consecutivo venta, clave_producto, cantidad, precio, importe.
drop view vista_detalle_venta; create view vista_detalle_venta as select clave_producto,cantidad,precio,importe from detalle_venta; Ejecución del DDL de la vista 16 de detalle_venta
52
16. Vista de tres tablas (detalle_ventas, ventas y productos):
consecutivo_ventas, fecha_venta, clave_producto, nombre_producto,
cantidad, precio, importe, total de cada venta.
drop view VISTA17_VENTAS_DV_PR;
create view VISTA17_VENTAS_DV_PR
as
select ventas.consecutivo_ventas,ventas.fecha,productos.clave_producto,
productos.nombre_producto,detalle_venta.cantidad,
detalle_venta.precio,detalle_venta.importe,ventas.total
from ventas,detalle_venta,productos;
Ejecución del DDL de la vista 17 de tres tablas
Después de la ejecución del DDL tenemos la siguiente vista.
53
VISTAS DE LA TABLA DE FACTURAS
17. DDL de la vista de los campos número_factura, fecha de factura, y
consecutivo venta.
--18. Vista de número_factura, fecha de factura,
--y consecutivo venta.
drop view vista18_facturas;
create view vista18_facturas
as
select no_factura,fecha,consecutivo_ventas
from facturas
Ejecución del DDL de la vista 18 de facturas
54
18. DDL de la vista de dos tablas (factura y clientes): no_factura, rfc cliente ó clave cliente, razón social, fecha y total factura. drop view vista19_facturas_clientes; create view vista19_facturas_clientes as select no_factura,clientes.rfc,fecha,clientes.razon_social from facturas,clientes Ejecución del DDL de la vista 19 de facturas y clientes.
VISTAS DE LA TABLA DE BITÁCORA
19. DDL de la vista con los campos de fecha, operación y tabla drop view vista20_bitacora; create view vista20_bitacora as select fecha,operacion,tabla from bitácora Ejecución del DDL de la vista 20 de bitácora.
55
PASO 4 CREAR PROCEDIMIENTOS Un procedimiento es un conjunto de comandos SQL que pueden almacenarse en el
servidor.
Los procedimientos pueden mejorar el rendimiento ya que se necesita enviar menos
información entre el servidor y el cliente.
CREAR LAS SIGUIENTES PROCEDIMIENTOS PARA CADA TABLA:
Tabla Procedimientos:
Categorias
1. Procedimiento para agregar nueva categoría: todos los campos.
2. Procedimiento para modifica una categoría existente: todos los campos excepto el id_categoría
3. Procedimiento para eliminar una categoría existente proporcionando el id_categoría, el registro a eliminar se borrará siempre y cuando ésta categoría no tenga referencia en la tabla de productos
Productos
4. Procedimiento para agregar nuevo producto de una categoría existente.
5. Procedimiento para modificar un producto existente todos los campos excepto la clave del producto.
6. Procedimiento para eliminar un producto existente: proporcionando la clave del producto se borrará el registro siempre y cuando éste producto no tenga referencia en la tabla de detalle_ventas.
Clientes
7. Procedimiento para agregar nuevo cliente con todos sus campos.
8. Procedimiento para modificar un cliente existente todos los campos excepto la clave de cliente y respetando la unicidad de la misma clave y del RFC.
9. Procedimiento para eliminar un cliente existente: proporcionando la clave del cliente se borrará el registro siempre y cuando éste cliente no tenga referencia en la tabla de ventas ni de facturas.
Empleados
10. Procedimiento para agregar nuevo empleado con todos sus campos.
11. Procedimiento para modificar un empleado existente modificando todos los campos excepto la clave de empleado y respetando la unicidad del no_empleado y la referencia del puesto
12. Procedimiento para eliminar un empleado existente: proporcionando el no_empleado se borrará el registro siempre y cuando éste empleado no tenga referencia en la tabla de ventas.
Puestos 13. Procedimiento para agregar nuevo puesto: todos los
campos. 14. Procedimiento para modifica un puesto existente:
56
todos los campos excepto la clave del puesto. 15. Procedimiento para eliminar un puesto existente
proporcionando el puesto, el registro a eliminar se borrará siempre y cuando éste puesto no tenga referencia en la tabla de empleados.
Ventas
16. Procedimiento para agregar nueva venta: todos los campos respetando llaves primarias y foráneas.
17. Procedimiento para modifica un venta existente: todos los campos excepto el consecutivo de ventas.
18. Procedimiento para eliminar una venta existente proporcionando el consecutivo, el registro a eliminar se borrará siempre y cuando ésta venta no tenga referencia en la tabla de detalle_ventas y con
facturas también.
Detalle_Ventas
19. Procedimiento para agregar un nuevo detalle_ventas.
Como esta tabla depende necesariamente de las ventas se
deben capturar al menos los campos de consecutivo,
clave_producto, y cantidad y precio. El campo de importe
debe ser generado a partir de la operación cantidad *
precio. En este procedimiento debe actualizarse el total de
la venta que corresponda con el consecutivo de venta
haciendo un update de la siguiente manera:
Update ventas
Set total = sum(importe)
Where consecutivo = 1000;
Siempre y cuando exista la venta consecutivo número
1000.
20. Procedimiento para actualizar o modificar un detalle de venta: Proporcionando el consecutivo de venta que no se puede modificar, la cantidad y el precio solamente, se debe modificar solo el importe y el total de la venta (tabla ventas)
Update ventas
Set total = sum(importe)
Where consecutivo = 1000;
Facturas
21. Procedimiento para agregar nueva factura: todos los campos respetando llaves primarias y foráneas.
22. Procedimiento para modifica una factura existente: todos los campos excepto el número de factura.
23. Procedimiento para eliminar una factura existente proporcionando el número de factura, el registro a eliminar se borrará indistintamente.
57
Bitacora 24. Se almacenan los registros automáticamente utilizando disparadores.
DDL de procedimiento para la tabla categoría 1. DDL del procedimiento para una nueva categoría con todos los campos. create or replace procedure pa_agregar_categoria ( v_id_categoria varchar, v_descripcion_categoria varchar ) as begin insert into categorias (id_categoria,descripcion_categoria) values ( v_id_categoria,v_descripcion_categoria); dbms_output.put_line('Registro agregado correctamente revisar tabla categorias'); end; El DDL para mandar llamar el procedimiento anterior es el siguiente: begin pa_agregar_categoria('89890','FARMACIA'); end;
Para verificar que se agrego el registro correctamente revisamos la tabla de categorías y podemos ver que nuestro registro se encuentra el dicha tabla.
58
2. DDL del procedimiento para modifica una categoría existente: todos los campos excepto el id_categoría.
create or replace
procedure pa_actualizar_categorias(
v_id_categoria varchar,
v_descripcion_categoria varchar
) as
begin
update categorias set descripcion_categoria=(v_descripcion_categoria)
where id_categoria=(v_id_categoria);
dbms_output.put_line('EL REGISTRO SE ACTUALIZO CORRECTAMENTE');
end; Para poder llevar a cabo el procedimiento anterior necesitamos del siguiente DDL. begin
pa_actualizar_categorias(335678,'PERFUMERIA Y COSMETICOS');
end;
Verificamos nuestra tabla y comprobemos que nuestro registro este actualizado.
59
3. DDL del procedimiento para eliminar una categoría existente proporcionando el id_categoría, el registro a eliminar se borrará siempre
y cuando ésta categoría no tenga referencia en la tabla de productos create or replace
procedure pa_eliminar_categoria
(
v_id_categoria varchar
)
as
begin
delete categorias where id_categoria=v_id_categoria;
dbms_output.put_line('EL REGISTRO SE ELIMINO CORRECTAMENTE');
end; El DDL que empleamos para poder ejecutar nuestro procedimiento es parecido a los anteriores. begin
pa_eliminar_categoria(335678);
end;
En la tabla correspondiente ya no debe existir el id 335678 perteneciente a la descripción de perfumería y farmacia.
60
DDL DE PROCEDIMIENTOS PARA LA TABLA DE PRODUCTOS 4. DDL del procedimiento para agregar nuevo producto.
create or replace procedure pa_agregar_producto
(
v_nombre_producto varchar,
v_clave_producto number,
v_descripcion varchar,
v_costo number,
v_precio number,
v_existencia number ,
v_id_categoria varchar
)
a
begin
insert into
productos(clave_producto,nombre_producto,descripcion,costo,precio,existenc
ia,id_categoria)
values(v_clave_producto,v_nombre_producto,v_descripcion,v_costo,v_precio,v
_existencia,v_id_categoria);
end; Para poder observar cambios necesitamos de lo siguiente; begin
pa_agregar_producto( 'desodorante',121413,'desodorante en aerosol para
dama',19,42,280 ,9004135);
end;
61
5. DDL del procedimiento para modificar un producto existente. create or replace procedure pa_modificar_producto
(
v_nombre_producto varchar,
v_clave_producto number,
v_descripcion varchar,
v_costo number,
v_precio number,
v_existencia number,
v_id_categoria varchar
)
as
begin
update productos set
nombre_producto=(v_nombre_producto),descripcion=(v_descripcion),costo=(v_c
osto),precio=(v_precio),existencia=(v_existencia),id_categoria=(v_id_categ
oria)
where clave_producto=v_clave_producto;
end;
DDL para ejecutar el procedimiento anterior. begin
pa_modificar_producto ('diesel', 120690, 'perfume extractos cítricos',
1100, 2700, 450, '335678');
end;
Enseguida vemos los cambios que se realizaron con los DDL anteriores.
62
6. DDL del procedimiento para eliminar un producto existente create or replace procedure pa_eliminar_producto (
v_clave_producto number
)
as
begin
delete from productos where clave_producto=v_clave_producto;
end; DDL para ejecutar la eliminación del producto. begin
pa_eliminar_producto(125690);
end;
La tabla modificada queda de la siguiente manera.
63
DDL de procedimientos para la tabla de clientes 7. DDL de procedimiento para agregar nuevo cliente con todos sus campos.
create or replace
procedure pa_agregar_clientes
(
v_clave_cliente number,
v_rfc varchar,
v_razon_social varchar,
v_calle_no varchar,
v_colonia varchar,
v_ciudad varchar,
v_estado varchar,
v_e_mail varchar,
v_telefono varchar
)
as
begin
insert into clientes
(clave_cliente,rfc,razon_social,calle_no,colonia,ciudad,estado,e_mail,tele
fono)
values (v_clave_cliente,v_rfc,v_razon_social, v_calle_no, v_colonia,
v_ciudad, v_estado, v_e_mail,v_telefono);
64
dbms_output.put_line('Registro agregado correctamente revisar tabla
categorias');
end; DDL para llamar el procedimiento de insertar clientes. begin
pa_agregar_clientes(133333,'HESA910510','WEBMASTERING','BENITO JUAREZ
100','BENITO JUAREZ','DURANGO','DURANGO','[email protected]','675-
123-34-50');
end;
La tabla queda de la siguiente manera.
8. DDL del procedimiento para modificar un cliente existente. create or replace
procedure pa_actualizar_clientes(
v_clave_cliente number,
v_rfc varchar,
v_razon_social varchar,
65
v_calle_no varchar,
v_colonia varchar,
v_ciudad varchar,
v_estado varchar,
v_e_mail varchar,
v_telefono varchar
) as
begin
update clientes set rfc=(v_rfc), razon_social=(v_razon_social),
calle_no=(v_calle_no), colonia=(v_colonia), ciudad=(v_ciudad),
estado=(v_estado), e_mail=(v_e_mail), telefono=(v_telefono)
where clave_cliente=(v_clave_cliente);
dbms_output.put_line('EL REGISTRO SE ACTUALIZO CORRECTAMENTE');
end; DDL para ejecutar el DDL anterior. begin
pa_actualizar_clientes(133333,'HESA910510','LABORATORIOS CLINICOS SA.de
C.V','BENIGNO MONTOYA 124','MURIENDO
LENTO','CHIHUAHUA','CHIHUAHUA','[email protected]','618-129-65-57');
end;
la tabla anteriormente estaba asi:
66
Al ejecutar los DDL anteriores nos queda como se muestra a continuación:
9. DDL del procedimiento para eliminar un cliente existente. create or replace
procedure pa_eliminar_clientes
(
v_clave_cliente varchar
)
as
begin
delete clientes where clave_cliente=v_clave_cliente;
dbms_output.put_line('EL REGISTRO SE ELIMINO CORRECTAMENTE');
end; El DDL para ejecutarlo es: begin
pa_eliminar_clientes(133333);
end;
67
La tabla antes y después de los DDL
DDL de los procedimientos de la tabla empleados 10. DDL para el procedimiento de agregar nuevo empleado con todos sus
campos. create or replace procedure pa_agregar_empleado
( v_no_empleado number,
v_paterno varchar,
v_materno varchar,
v_nombre varchar,
68
v_fecha_nacimiento date,
v_sueldo number,
v_sexo char,
v_puesto number
)
as
begin
insert into empleados( no_empleado, paterno, materno, nombre, sexo,
fecha_nacimiento, sueldo, puesto)
values(v_no_empleado,v_paterno,v_materno,v_nombre,v_sexo,v_fecha_nacimient
o,v_sueldo,v_puesto);
end; DDL para ejecutar el anterior. begin
pa_agregar_empleado( ( 1234, 'GOMEZ', 'PEREZ', 'LUIS', '12/09/1988', 2789,
'M', 89060);
end;
69
11. DDL del procedimiento para modificar un empleado existente.
create or replace
procedure pa_modificar_empleado
(
v_no_empleado number,
v_paterno varchar,
v_materno varchar,
v_nombre varchar,
v_fecha_nacimiento date,
v_sueldo number,
v_sexo char,
v_puesto number
) as
begin
update empleados set
paterno=(v_paterno),materno=(v_materno),nombre=(v_nombre),fecha_nacimiento
=(v_fecha_nacimiento),sueldo=(v_sueldo),sexo=(v_sexo),puesto=(v_puesto)
where no_empleado=(v_no_empleado);
dbms_output.put_line('EL REGISTRO SE ACTUALIZO CORRECTAMENTE');
end; DDL para ejecutar
70
12. DDL del procedimiento para eliminar un empleado existente.
create or replace
procedure pa_eliminar_empleado
(
v_no_empleado number
) as
begin
delete empleados where no_empleado=v_no_empleado;
dbms_output.put_line('EL REGISTRO SE ELIMINO CORRECTAMENTE');
end; DDL para ejecución.
71
Resultados.
DDL para los procedimientos de la tabla de puestos 13. Procedimiento para agregar nuevo puesto.
create or replace
procedure pa_agregar_puesto
(
v_puesto number,
v_nombre varchar,
v_sueldo_base number
)
as
begin
insert into puestos (puesto,nombre,sueldo_base)
values ( v_puesto,v_nombre,v_sueldo_base);
dbms_output.put_line('Registro agregado correctamente revisar tabla
categorias');
end; DDL para ejecutarlo.
72
14. Procedimiento para modifica un puesto existente.
create or replace
procedure pa_actualizar_puestos
(
v_puesto number,
v_nombre varchar,
v_sueldo_base number
) as
begin
update puestos set nombre=(v_nombre),sueldo_base=(v_sueldo_base)
where puesto=(v_puesto);
dbms_output.put_line('EL REGISTRO SE ACTUALIZO CORRECTAMENTE');
end;
DDL para ejecución.
73
15. Procedimiento para eliminar un puesto existente. create or replace
procedure pa_eliminar_puestos
(
v_puesto varchar
)
as
begin
delete puestos where puesto=v_puesto;
74
dbms_output.put_line('EL REGISTRO SE ELIMINO CORRECTAMENTE');
end;
DDL para los procedimientos de la tabla de ventas. 16. Procedimiento para agregar nueva venta.
create or replace procedure pa_agregar_venta
(
--v_consecutivo_ventas number,
v_fecha date,
v_clave_cliente number,
v_no_empleado number,
v_total number
75
)
as
begin
insert into
ventas(consecutivo_ventas,fecha,clave_cliente,no_empleado,total)
values(sq_consecutivo_ventas.nextval,v_fecha,v_clave_cliente,v_no_empleado
,v_total);
end;
Para ejecutar el DDL anterior se emplea otro como se muestra a continuación.
Los resultados se muestran a continuación.
17. Procedimiento para modifica una venta existente.
create or replace
procedure pa_actualizar_ventas(
v_consecutivo_ventas number,
76
v_fecha date,
v_clave_cliente number,
v_no_empleado number
) as
begin
update ventas set
fecha=(v_fecha),clave_cliente=(v_clave_cliente),no_empleado=(v_no_empleado
)
where consecutivo_ventas=(v_consecutivo_ventas);
dbms_output.put_line('EL REGISTRO SE ACTUALIZO CORRECTAMENTE');
end;
DDL y resultados de la ejecución.
18. Procedimiento para eliminar una venta existente.
create or replace
procedure pa_eliminar_ventas
( v_consecutivo_ventas varchar)
as
begin
delete ventas where consecutivo_ventas=v_consecutivo_ventas;
dbms_output.put_line('EL REGISTRO SE ELIMINO CORRECTAMENTE');
end
77
Ejecución del DDL y resultados.
DDL PARA PROCEDIMIENTOS DE LA TABLA DETALLE_VENTAS 19. Procedimiento para agregar un nuevo detalle_ventas.
create or replace procedure pa_agregar_detalle_ventas
( v_consecutivo_ventas number,
v_clave_producto number,
v_cantidad number,
v_precio number
)
as
v_importe number;
v_total number;
begin
v_importe:= (v_cantidad * v_precio);
insert into detalle_venta (consecutivo_ventas,clave_producto,cantidad,precio,importe) values(v_consecutivo_ventas,v_clave_producto,v_cantidad,v_precio,v_importe);
select sum(importe) into v_total
from detalle_venta
where consecutivo_ventas = v_consecutivo_ventas;
78
update ventas
set ventas.total = v_total-- variable
where ventas.consecutivo_ventas = v_consecutivo_ventas;
end;
Para mandar llamar este procedimiento se necesita lo siguiente.
begin
pa_agregar_detalle_ventas(115, 125690,2,22);
pa_agregar_detalle_ventas(115,120690,3,1050);
pa_agregar_detalle_ventas(115,235690,5,200);
pa_agregar_detalle_ventas(116,550088,9,200);
pa_agregar_detalle_ventas(116,553377,1,600);
pa_agregar_detalle_ventas(116,235690,2,200);
pa_agregar_detalle_ventas(117, 770088,1,3500);
pa_agregar_detalle_ventas(117,220022,2,58);
pa_agregar_detalle_ventas(117,330033,3,62);
79
pa_agregar_detalle_ventas(118,667799,2,800);
pa_agregar_detalle_ventas(118,220022,2,58);
pa_agregar_detalle_ventas(118,440033,5,60);
pa_agregar_detalle_ventas(119,550088,9,200);
pa_agregar_detalle_ventas(119,447799,2,40);
pa_agregar_detalle_ventas(119,667799,1,230);
pa_agregar_detalle_ventas(120, 6654321,1,5000);
pa_agregar_detalle_ventas(120,112277,2,60);
pa_agregar_detalle_ventas(120,223344,1,46);
pa_agregar_detalle_ventas(121,550088 ,1,45);
pa_agregar_detalle_ventas(121,33441277,1,2500);
pa_agregar_detalle_ventas(121,2244778800,1,65);
pa_agregar_detalle_ventas(121,551122007 ,1,600);
pa_agregar_detalle_ventas(121,661122005,3,22);
pa_agregar_detalle_ventas(121,66002244,1,500);
end;
Después de mandar llamar el código la tabla de detalle_ventas nos queda de la siguiente
manera.
80
Al ejecutar el DDL principal automáticamente se llena el campo de importe de la tabla de ventas, así nuestra tabla queda de la siguiente manera.
20. Procedimiento para actualizar o modificar un detalle de venta.
create or replace procedure pa_actualizar_detalle_ventas
( v_consecutivo_ventas number,
v_clave_producto number,
v_cantidad number,
v_precio number
)
as
v_importe number;
v_total number;
begin
v_importe:= (v_cantidad * v_precio);
update detalle_venta set clave_producto=v_clave_producto,
cantidad=v_cantidad, precio=v_precio, importe=v_importe
where consecutivo_ventas = v_consecutivo_ventas;
select sum(importe) into v_total
from detalle_venta
81
where consecutivo_ventas = v_consecutivo_ventas;
update ventas
set ventas.total = v_total-- variable
where ventas.consecutivo_ventas = v_consecutivo_ventas;
end; El procedimiento para ejecutar y los resultados se muestran a continuación.
DDL de los procedimientos de la tabla de facturas
21. Procedimiento para agregar nueva factura. create or replace procedure pa_agregar_factura
(
v_no_factura number,
v_fecha date,
v_rfc varchar,
v_consecutivo_ventas number
)
as
begin
insert into facturas(no_factura,fecha,consecutivo_ventas,rfc)
values(v_no_factura,v_fecha,v_consecutivo_ventas,v_rfc);
end; Para poder ejecutar este código es necesario realizar el siguiente. begin
pa_agregar_factura ( 9393, '04/09/2012','HESA34574',4658);
end;
82
22. Procedimiento para modifica una factura existente. create or replace procedure pa_agregar_factura
(
v_no_factura number,
v_fecha date,
v_rfc varchar,
v_consecutivo_ventas number
)
as
begin
delete from facturas where no_factura=v_no_factura;
update facturas set fecha=(v_fecha), rfc=(v_rfc),
consecutivo_ventas=(v_consecutivo_ventas)
where no_factura=(v_no_factura);
end; Ejecución y resultados. begin
pa_agregar_factura ( 13006,'12/04/2012','HESA910510',119);
end;
83
23. Procedimiento para eliminar una factura existente. create or replace
procedure pa_eliminar_factura
(
v_no_factura number
)
as
begin
delete facturas where no_factura=v_no_factura;
dbms_output.put_line('EL REGISTRO SE ELIMINO CORRECTAMENTE');
end; Ejecusion y resultados.
La tabla antes del DDL.
84
La tabla después del DDL
DDL para procedimiento de la tabla bitácora 24. Se almacenan los registros automáticamente utilizando disparadores. Al emplear disparadores la tabla de bitácora se irá actualizando después de agregar, modificar o eliminar algún elemento de las tablas creadas anteriormente. A continuación podemos observar cómo queda nuestra tabla después de haber realizado algunas operaciones en los campos.
PASO 5 CREAR FUNCIONES
Las Funciones de Bases de Datos permiten hacer operaciones sobre valores de una base de dato.
85
DDL para la función de la tabla categoría.
1. Función para contar cuantas categorías se tienen. create or replace function fn_cuantas_categorias
return number
as
vcategorias number;
begin
select count(*)
into vcategorias
from categorias;
return vcategorias;
end; Es necesario ejecutar y así saber la cantidad de categorías que se tienen. Para ello necesitamos lo siguiente. declare
cuantas_cat number;
begin
cuantas_cat :=fn_cuantas_categorias;
dbms_output.put_line('el numero total de categorias es: ' || cuantas_cat);
end; El resultado que obtendremos es el siguiente.
DDL para las funciones de la tabla productos 2. Función para desplegar el promedio de costos de todos los productos.
create or replace
function fn_cuantos_productos (v_id_categoria varchar)
return number
as
c_productos number;
begin
86
select count(existencia) into c_productos from productos where id_categoria=
v_id_categoria;
return c_productos;
end; ahora realizaremos la ejecución con el siguiente código. declare
cuantas number;
begin
cuantas :=fn_cuantos_productos (112277);
dbms_output.put_line('el numero total de productos es: ' || cuantas);
end; El resultado que se muestra es:
3. Función para conocer cuántos productos existen. create or replace function fn_suma_costo
return number
as
vcosto number;
begin
select sum(costo)
into vcosto
from productos;
return vcosto;
end;
la ejecusion y los resultados se muestran a continuación: declare
suma_cost number;
begin
suma_cost :=fn_suma_costo;
dbms_output.put_line('la suma de los costos es: ' || suma_cost);
end;
87
4. Función para desplegar el total de costos de todos los productos create or replace function fn_prom_cost_productos
return number
as
vcosto number;
vcantidad number;
vsuma number;
begin
select count(costo)
into vcantidad
from productos;
select sum(costo)
into vcosto
from productos;
vsuma:= vcosto/vcantidad;
return vsuma;
end;
nuestra ejecusion la realizaremos de la siguiente manera. declare
promedio_costo number;
begin
promedio_costo :=fn_prom_cost_productos;
dbms_output.put_line('el promedio de costos es: ' || promedio_costo);
end; el resultado que debe aparecer es el siguiente:
88
DDL para realizar la fincion de la tabla clientes 5. Función para saber cuántos clientes hay. create or replace
function fn_cuantos_clientes
return number
as
cuantos number;
begin
select count(*)
into cuantos
from clientes;
return cuantos;
end; para poder tener el resultado correcto necesitamos de algo como lo siguiente. declare
cantidad number;
begin
cantidad :=fn_cuantos_clientes;
dbms_output.put_line('LA CANBTIDAD DE CLIENTES ES DE: ' || cantidad);
end;
6. Función para conocer el nombre completo de un cliente.
89
create or replace function fn_nombre_empleados(v_sno_empleado number)
return varchar
as
v-materno varchar;
v_paterno varchar;
v_nombre varchar;
begin
select paterno,materno,nombre into v_total
from empleados
where v_no_empleado=no_empleado;
dbms_output.put_line('nombre completo '||v_paterno1||'
'||v_materno||' '||v_nombre);
returm 'm';
end; DDL para ejecutar y resultados. declare
nombre number;
begin
nombre:=fn_nombre_empleados(18302);
end;
DDL para realizar la fincion de la tabla empleados
7. Función para conocer cuántos empleados ganan o tienen un sueldo mayor
o superior a un proporcionado. El sueldo se proporciona como argumento en la función y ésta devuelve cuántos empleados ganan igual o superior. create or replace function fn_cuantos_empleados(v_sueldo number)
return number
as
agnioventa number;
v_total number;
90
begin
select count (suedo) into v_total
from empleados
where v_total=<v_sueldo;
dbms_output.put_line('los empleados con menor sueldo son
'||v_total);
select count (sueldo) into v_total
from empleados
where v_total=>v_sueldo;
dbms_output.put_line('los empleados con mayor sueldo son
'||v_totall);
return 0;
end; DDL para la ejecución.
declare
cantidadtotal number;
begin
cantidadtotal:=fn_cuantos_empleados(2700);
end;
8. Función para conocer los años cumplidos de un empleado. create or replace function fn_cuantos_agnios_emp(v_no_empleado varchar)
return number
as
v_fecha_nacimiento number; --año nacimiento
agnio_ac number; --año actual
edad number;
begin
agnio_ac :=2012;
select extract(YEAR FROM fecha_nacimiento) --convierte la fecha de nac. en
caracter
into v_fecha_nacimiento
from empleados
91
where no_empleado=v_no_empleado;
edad := (agnio_ac - v_fecha_nacimiento);
return edad;
end;
para poder ejecutarla necesitamos lo siguiente. begin
dbms_output.put_line(fn_cuantos_agnios_emp('18309'));
end;
9. Función para conocer cuántos empleados son del sexo Masculino ó del sexo femenino. La función debe recibir el parámetro del sexo para conocer cuántos
empleados hay de cada sexo según sea el caso. create or replace
function fn_sexo_empleados(vsexo char)
return number
as
vempleados number;
begin
select count(*)
into vempleados
from empleados
where sexo = vsexo;
return vempleados;
end; El siguiente código lo emplearemos para ejecuterlo. declare
cuantos number;
begin
cuantos := fn_sexo_empleados ('M');
dbms_output.put_line('Alumnos hombres son '|| cuantos);
cuantos := fn_sexo_empleados ('F');
92
dbms_output.put_line('Alumnos mujeres son '|| cuantos);
end;
DDL para realizar la fincion de la tabla puestos 10. Función para conocer Cuántos puestos hay create or replace
function fn_cuantos_puestos
return number
as
cuantos_puestos number;
begin
select count(*)
into cuantos_puestos
from puestos;
return cuantos_puestos;
end; lo siguiente no s permitirá ejecutar y saber el resultado. declare
cuant_puestos number;
begin
cuant_puestos :=fn_cuantos_puestos;
dbms_output.put_line('EL NUMERO TOTAL DE PUESTOS ES: ' || cuant_puestos);
end;
DDL para realizar la fincion de la tabla ventas 11. Función para conocer el total de todas las ventas que se hicieron de un año en
particular.
93
create or replace function fn_total_ventasagnio(v_agnio number)
return number
as
agnioventa number;
v_total number;
begin
select to_number(substr(to_char(fecha, 'dd/mm/yyyy'),7,4)) --convierte
la fecha de nac. en caracter
into agnioventa
from ventas
where agnioventa=v_agnio;
select sum(total) into v_total from ventas
where agnioventa=v_agnio;
return v_total;
end;
DDL para ejecutar y resultados. declare
cantidadtotal number;
begin
cantidadtotal:=fn_total_ventasagnio(2012);
dbms_output.put_line('total de las ventas en el año: '||cantidadtotal);
end;
12. Función para conocer el total de ventas de un cliente en particular. create or replace function fn_cuantas_ventas(v_clave_cliente varchar) return number
as
v_total number;
begin
select sum(total) into v_total from ventas where
clave_cliente=v_clave_cliente;
return v_total;
end;
94
A continuacion se muestra el código de ejecución y los resultados declare
cuantas_cat1 number;
begin
cuantas_cat1 :=fn_cuantas_ventas(1000);
dbms_output.put_line('EL NUMERO TOTAL DE LAS VENTAS ES: ' ||
cuantas_cat1);
end;
DDL para realizar la fincion de la tabla detalle_ventas 13. Función para conocer de un producto cuantas veces se ha vendido. create or replace function fn_cuantas_veces(v_clave_producto number)
return number
as
v_total1 number;
begin
select count(cantidad) into v_total1 from detalle_venta where
clave_producto=v_clave_producto;
return v_total1;
end; En seguida se encuentra la ejecución y los resultados declare
cuantas_cat2 number;
begin
cuantas_cat2 :=fn_cuantas_veces(120690);
dbms_output.put_line('el numero total vendido del producto es: '
|| cuantas_cat2);
end;
95
DDL para realizar la fincion de la tabla facutras 14. Función que devuelve cuántas facturas son de un día en particular y el total
de ellas. create or replace function fn_total_facturasdia(v_fecha date)
return numeric
as
v_dia date;
cantidad number;
begin
select sum(total)
into v_dia
from ventas
where fecha = v_fecha;
dbms_output.put_line('cantidad total: '||v_dia);
select count(no_factura)
into cantidad
from facturas
where fecha = v_fecha;
dbms_output.put_line('total de factura: '||cantidad);
return 0;
end; lo siguiente es para ejecutar. declare
cuantos date;
begin
cuantos:=fn_total_facturasdia(21/05/1990);
dbms_output.put_line(cuantos);
end;
96
DDL para realizar la fincion de la tabla facutras 15. Función que devuelve cuantas operaciones existen o se han hecho sobre una
tabla en particular. create or replace function fn_cuantas_funciones(v_tabla varchar)
return number
as
v_total1 number;
begin
select count(operacion) into v_total1 from bitacora where tabla=v_tabla;
return v_total1;
end; ejecutaremos para observar los resultados declare
cuantas number;
begin
cuantas :=fn_cuantas_funciones('CATEGORIAS');
dbms_output.put_line('EL NUMERO TOTAL DE OPERACIONES DE LA TABLA ES: '
|| cuantas);
end;
PASO 6 CREAR DISPARADORES Crear tres disparadores para cada tabla.
Para cada tabla cuando se registre una alta almacenar el movimiento
en la tabla bitácora. A Alta para insert
97
Para cada tabla cuando se registre una alta almacenar el movimiento
en la tabla bitácora. B Alta para delete
Para cada tabla cuando se registre una alta almacenar el movimiento
en la tabla bitácora. M Modificación para update.
Tabla Disparadores
Categorías 1. Cuando se registre un nuevo registro almacenar en bitácora. 2. Cuando se elimine un registro registrar en bitácora 3. Cuando se modifique o actualice un registro almacenar en
bitácora.
Productos 4. Cuando se registre un nuevo registro almacenar en bitácora. 5. Cuando se elimine un registro registrar en bitácora 6. Cuando se modifique o actualice un registro almacenar en
bitácora.
Clientes 7. Cuando se registre un nuevo registro almacenar en bitácora. 8. Cuando se elimine un registro registrar en bitácora 9. Cuando se modifique o actualice un registro almacenar en
bitácora.
Empleados 10. Cuando se registre un nuevo registro almacenar en bitácora. 11. Cuando se elimine un registro registrar en bitácora 12. Cuando se modifique o actualice un registro almacenar en
bitácora.
Puestos 13. Cuando se registre un nuevo registro almacenar en bitácora. 14. Cuando se elimine un registro registrar en bitácora 15. Cuando se modifique o actualice un registro almacenar en
bitácora.
Ventas 16. Cuando se registre un nuevo registro almacenar en bitácora. 17. Cuando se elimine un registro registrar en bitácora 18. Cuando se modifique o actualice un registro almacenar en
bitácora.
Detalle_Ventas 19. Cuando se registre un nuevo registro almacenar en bitácora. 20. Cuando se modifique o actualice un registro almacenar en
bitácora.
Facturas 21. Cuando se registre un nuevo registro almacenar en bitácora. 22. Cuando se elimine un registro registrar en bitácora 23. Cuando se modifique o actualice un registro almacenar en
bitácora.
Bitácora
DISPARADORES DE LA TABLA DE CATEGORÍAS
Un disparador (o trigger) es un tipo especial de procedimiento
almacenado asociado a una tabla que se ejecuta al realizar una operación “básica”
(insert, un delete o un update) sobre ésta. La operación básica que despierta al
98
trigger es conocida como sentencia disparadora. La ejecución del disparador puede
ser antes (before) o después (after) de llevar a cabo la sentencia disparadora.
A continuación crearemos disparadores para que después de la sentencia se
actualice la tabla de bitácora.
1. DDL del disparador1: Cuando se inserte un nuevo registro en la tabla de
categorías almacenar en bitácora. create or replace trigger tr_bit_agregar_categorias
after insert on categorias
for each row
declare
v_fecha date;
begin
select sysdate into v_fecha
from dual;
insert into
bitacora(consecutivo_bitacora,fecha,tabla,operacion,campo_afectado)
values(sq_consecutivo_bitacora.nextval,v_fecha,'categorias','a',:new.id_ca
tegoria);
end;
Ejecución del DDL del disparador1 insertar
99
Para poder observar el funcionamiento del disparador es necesario realizar una inserción en la tabla de categorías y posteriormente revisar la tabla de bitácora.
Como se muestra a continuación.
Primero insertamos una nueva categoría.
Y posteriormente revisamos la tabla de bitácora y queda de la siguiente manera. En donde el registro que agregamos a la tabla categorías esta marcado con el recuadro amarillo.
100
2. DDL del disparador 2: Cuando se actualice o modifique un registro
existente de la tabla de categorías almacenar en bitácora. --DISPARADOR PARA MODIFICAR CATEGORIAS Y LLENAR BITACORA create or replace trigger tr_bit_modificar_categoria after update on categorias for each row declare v_fecha date; begin select sysdate into v_fecha from dual; insert into bitacora(consecutivo_bitacora,fecha,tabla,operacion,campo_afectado) values(sq_consecutivo_bitacora.nextval,v_fecha,'CATEGORIAS','M',:old.id_categoria); dbms_output.put_line('SE HA MODIFICADO EN CATEGORIAS CHECAR LA BITACORA'); end; Ejecución del DDL del disparador2 modificar
101
Después de esto
realizamos un update sobre la tabla de categorías y empleando
la salida del dbms nos indica que chequemos la bitácora.
Revisamos la bitácora y se encuentra registrada la operación M que representa el update que realizamos sobre la tabla de categorías.
102
3. DDL del disparador 3: Cuando se elimine registro existente de la tabla de categorías almacenar en bitácora. create or replace
TRIGGER TR_BIT_ELIMINAR_CATEGORIAS
after delete on categorias
for each row
declare
v_fecha date;
begin
select sysdate into v_fecha
from dual;
insert into
bitacora(consecutivo_bitacora,fecha,tabla,operacion,campo_afectado)
values(sq_consecutivo_bitacora.nextval,v_fecha,'CATEGORIAS','B',:old.id_ca
tegoria);
end;
Ejecución del DDL del disparador 3 eliminar
Al realizar una operación delete sobre la tabla de
categorías se registra en bitácora. Por ejemplo
eliminaremos la categoría que tiene el id_ categoría
marcado en azul.
103
Después de realizar una baja de categorías se registra en la bitácora
Resultado en la bitácora después de la
operación delete.
DISPARADORES DE LA TABLA DE PRODUCTOS
4. DDL del disparador4: Cuando se inserte un nuevo registro en la tabla de productos almacenar en bitácora.
--DISPARADOR PARA INSERTAR EN PRODUCTOS Y LLENAR BITACORA
create or replace trigger tr_bit_agregar_productos
after insert on productos
for each row
declare
v_fecha date;
104
begin
select sysdate into v_fecha
from dual;
insert into bitacora(consecutivo_bitacora,fecha,tabla,operacion,campo_afectado)
values(sq_consecutivo_bitacora.nextval,v_fecha,'PRODUCTOS','A',:new.clave_produc
to);
dbms_output.put_line('SE HA INSERTADO EN PRODUCTOS CHECAR LA BITACORA');
end;
Ejecución del DDL del disparador 4 insertar
Realizamos una inserción en productos
begin
insert into
productos(clave_producto,nombre_producto,descripcion,costo,precio,existencia,id_
categoria)
values(777888999,'PAN CALCETIN','PAN DE DULCE ',4,5,50,'1100779');
end;
Y se puede observar en la tabla de bitácora
5. DDL del disparador5: Cuando se modifique un registro en la tabla de
productos almacenar en bitácora. --DISPARADOR PARA MODIFICAR PRODUCTOS Y LLENAR BITACORA
create or replace trigger tr_bit_modificar_productos
after update on productos
105
for each row
declare
v_fecha date;
begin
select sysdate into v_fecha
from dual;
--select sq_consecutivo_bitacora.nextval,
--sq_consecutivo_bitacora.currval
--from dual;
insert into
bitacora(consecutivo_bitacora,fecha,tabla,operacion,campo_afectado)
values(sq_consecutivo_bitacora.nextval,v_fecha,'CLIENTES','M',:old.
clave_producto);
dbms_output.put_line('SE HA MODIFICADO EN PRODUCTOS CHECAR LA
BITACORA');
end; Ejecución del disparador 5 modificar
106
Update sobre la tabla de productos
Bitácora después del update sobre la tabla de productos.
6. DDL del disparador 6: Cuando se elimine un registro en la tabla de
productos almacenar en bitácora. --5. Cuando se elimine un registro registrar en bitácora
create or replace
TRIGGER TR_BIT_ELIMINAR_PRODUCTOS
after delete on productos
for each row
declare
107
v_fecha date;
begin
select sysdate into v_fecha
from dual;
insert into
bitacora1(consecutivo_bitacora,fecha,tabla,operacion,campo_afectado)
values(sq_consecutivo_bitacora.nextval,v_fecha,'PRODUCTOS','B',:old.clave_
producto);
end;
Ejecución del DDL del disparador 6 eliminar delete productos where clave_producto=330033; Tabla de bitácora después de la operación delete
DISPARADORES DE LA TABLA DE CLIENTES
7. DDL del disparador 7: Cuando se inserte un registro en la tabla de
clientes almacenar en bitácora. Como hemos visto en los procedimientos anteriores realizamos una inserción en la tabla de clientes y observamos el resultado en la tabla de
bitácora.
108
create or replace trigger tr_bit_agregar_clientes
after insert on clientes
for each row
declare
v_fecha date;
begin
select sysdate into v_fecha
from dual;
insert into
bitacora(consecutivo_bitacora,fecha,tabla,operacion,campo_afectado)
values(sq_consecutivo_bitacora.nextval,v_fecha,'CLIENTES','A',:new.clave_c
liente);
end;
Realizamos una inserción y en bitácora podemos ver el resultado.
8. DDL del disparador 8: Cuando se modifique un registro en la tabla de clientes almacenar en bitácora.
create or replace trigger tr_bit_modificar_clientes
after update on clientes
for each row
109
declare
v_fecha date;
begin
select sysdate into v_fecha
from dual;
insert into
bitacora(consecutivo_bitacora,fecha,tabla,operacion,campo_afectado)
values(sq_consecutivo_bitacora.nextval,v_fecha,'CLIENTES','M',:old.clave_c
liente);
dbms_output.put_line('SE HA MODIFICADO EN CLIENTES CHECAR LA BITACORA');
end;
Después de realizar un update sobre la tabla de clientes podemos ver que
se sigue llenando la tabla de bitácora ya que cada vez que realizamos una operación el disparador se activa y llena automáticamente la bitácora.
9. DDL del disparador 9: Cuando se elimine un registro en la tabla de
clientes almacenar en bitácora
create or replace
TRIGGER TR_BIT_ELIMINAR_CLIENTES
after delete on clientes
110
for each row
declare
v_fecha date;
begin
select sysdate into v_fecha
from dual;
insert into
bitacora(consecutivo_bitacora,fecha,tabla,operacion,campo_afectado)
values(sq_consecutivo_bitacora.nextval,v_fecha,'CLIENTES','B',:old.clave_c
liente);
end;
Delete de un cliente
delete clientes where clave_cliente=5555566666;
Después de realizar un delete sobre la tabla la bitácora queda de la
siguiente manera.
DISPARADORES DE LA TABLA DE EMPLEADOS
10. DDL del disparador 10: Cuando se inserte un registro en la tabla de empleados almacenar en bitácora.
111
--DISPARADOR PARA INSERTAR EN EMPLEADOS Y LLENAR BITACORA
create or replace trigger tr_bit_agregar_empleados
after insert on empleados
for each row
declare
v_fecha date;
begin
select sysdate into v_fecha
from dual;
insert into
bitacora(consecutivo_bitacora,fecha,tabla,operacion,campo_afectado)
values(sq_consecutivo_bitacora.nextval,v_fecha,'EMPLEADOS','A',:new.no_emp
leado);
dbms_output.put_line('SE HA INSERTADO EN EMPLEADOS CHECAR LA BITACORA');
end;
Después de realizar una inserción sobre la tabla de empleados la bitácora
queda de la siguiente manera.
11. DDL del disparador 11: Cuando se modifique un registro existente de la tabla de empleados almacenar en bitácora. --DISPARADOR PARA MODIFICAR EMPLEADOS Y LLENAR BITACORA
112
create or replace trigger tr_bit_modificar_empleados
after update on empleados
for each row
declare
v_fecha date;
begin
select sysdate into v_fecha
from dual;
insert into
bitacora(consecutivo_bitacora,fecha,tabla,operacion,campo_afectado)
values(sq_consecutivo_bitacora.nextval,v_fecha,'EMPLEADOS',
'M',:old.no_empleado);
dbms_output.put_line ('SE HA MODIFICADO EN EMPLEADOS CHECAR LA BITACORA');
end;
Después de realizar la operación update sobre la tabla de empleados la
bitácora se ve de la siguiente manera.
12. DDL del disparador 12: Cuando se elimine un registro en la tabla de
empleados almacenar en bitácora
create or replace
TRIGGER TR_BIT_ELIMINAR_EMPLEADOS
113
after delete on empleados
for each row
declare
v_fecha date;
begin
select sysdate into v_fecha
from dual;
insert into
bitacora1(consecutivo_bitacora,fecha,tabla,operacion,campo_afectado)
values(sq_consecutivo_bitacora.nextval,v_fecha,'EMPLEADOS','B',:old.no_emp
leado);
end;
Ejecución del DDL del disparador 12 eliminar empleados
delete empleados where no_empleado=222333444;
Bitácora después del delete en empleados
DISPARADORES DE LA TABLA DE PUESTOS
13. DDL del disparador 13: Cuando se inserte un registro en la tabla de puestos almacenar en bitácora.
--DISPARADOR PARA INSERTAR EN PUESTOS Y LLENAR BITACORA
114
create or replace trigger tr_bit_agregar_puestos
after insert on puestos
for each row
declare
v_fecha date;
begin
select sysdate into v_fecha
from dual;
insert into
bitacora(consecutivo_bitacora,fecha,tabla,operacion,campo_afectado)
values(sq_consecutivo_bitacora.nextval,v_fecha,'PUESTOS','A',:new.puesto);
dbms_output.put_line('SE HA INSERTADO EN PUESTOS CHECAR LA BITACORA');
end;
Después de realizar un insert sobre la tabla de puestos la bitácora
queda de la siguiente manera.
14. DDL del disparador 14: Cuando se modifique un registro existente de la tabla de puestos almacenar en bitácora. --DISPARADOR PARA MODIFICAR PUESTOS Y LLENAR BITACORA
create or replace trigger tr_bit_modificar_puesto
after update on puestos
115
for each row
declare
v_fecha date;
begin
select sysdate into v_fecha
from dual;
insert into
bitacora(consecutivo_bitacora,fecha,tabla,operacion,campo_afectado)
values(sq_consecutivo_bitacora.nextval,v_fecha,'PUESTOS','M',:old.puesto);
dbms_output.put_line('SE HA MODIFICADO EN PUESTOS CHECAR LA BITACORA');
end;
Después de modificar un registro de puestos la bitácora queda como se muestra a continuación:
update puestos set nombre=('FERRETERO'),sueldo_base=(850)
where puesto=112233445;
15. DDL del disparador 15: Cuando se elimine un registro en la tabla de
puestos almacenar en bitácora
create or replace
116
TRIGGER TR_BIT_ELIMINAR_PUESTOS
after delete on puestos
for each row
declare
v_fecha date;
begin
select sysdate into v_fecha
from dual;
insert into
bitacora(consecutivo_bitacora,fecha,tabla,operacion,campo_afectado)
values(sq_consecutivo_bitacora.nextval,v_fecha,'PUESTOS','B',:old.puesto);
end;
Operación delete sobre la tabla de puestos
delete puestos where puesto=1122334455;
Bitácora después de eliminar en la tabla de puestos
DISPARADORES DE LA TABLA DE VENTAS
117
16. DDL del disparador 16: Cuando se inserte un registro en la tabla de ventas almacenar en bitácora. --DISPARADOR PARA INSERTAR EN VENTAS Y LLENAR BITACORA
create or replace trigger tr_bit_agregar_ventas
after insert on ventas
for each row
declare
v_fecha date;
begin
select sysdate into v_fecha
from dual;
insert into
bitacora(consecutivo_bitacora,fecha,tabla,operacion,campo_afectado)
values(sq_consecutivo_bitacora.nextval,v_fecha,'VENTAS','A',:new.consecuti
vo_ventas);
dbms_output.put_line ('SE HA INSERTADO EN VENTAS CHECAR LA BITACORA');
end;
Hacemos una inserción en la tabla de ventas de la siguiente manera.
--LLAMA TR_INSERT_BITACORA_VENTAS
begin
insert into
ventas(consecutivo_ventas,fecha,clave_cliente,no_empleado,total)
values (sq_consecutivo_ventas.nextval,'15/12/12',3000,18302,0);
end;
Después de esto la tabla de bitácora queda de la siguiente manera:
118
17. DDL del disparador 17: Cuando se modifique un registro existente de la tabla de ventas almacenar en bitácora.
--DISPARADOR PARA MODIFICAR VENTAS Y LLENAR BITACORA
create or replace trigger tr_bit_modificar_ventas
after update on ventas
for each row
declare
v_fecha date;
begin
select sysdate into v_fecha
from dual;
--select sq_consecutivo_bitacora.nextval,
--sq_consecutivo_bitacora.currval
--from dual;
insert into
bitacora(consecutivo_bitacora,fecha,tabla,operacion,campo_afectado)
values(sq_consecutivo_bitacora.nextval,v_fecha,'
VENTAS','M',:old.consecutivo_ventas);
dbms_output.put_line('SE HA MODIFICADO EN VENTAS CHECAR LA BITACORA');
end;
Operación update para la tabla de ventas update ventas set
fecha=('18/09/2012'),clave_cliente=(11000),no_empleado=(18310),total=(300)
where consecutivo_ventas=134 ;
Resultado en la Bitácora
119
18. DDL del
disparador 18:
Cuando se
elimine un registro existente de la tabla de ventas almacenar en bitácora.
create or replace
TRIGGER TR_BIT_ELIMINAR_VENTAS
after delete on ventas
for each row
declare
v_fecha date;
begin
select sysdate into v_fecha
from dual;
insert into
bitacora(consecutivo_bitacora,fecha,tabla,operacion,campo_afectado)
values(sq_consecutivo_bitacora.nextval,v_fecha,'VENTAS','B',:old.consecuti
vo_ventas);
end;
Delete de la tabla de ventas
Delete ventas where consecutivo_ventas= (134);
Bitácora después de la operación delete.
120
DISPARADORES DE LA TABLA DE DETALLE_ VENTA
19. DDL del disparador 19: Cuando se inserte un registro en la tabla de detalle_ventas almacenar en bitácora. create or replace trigger tr_bit_agregar_detalle_vent
after insert on detalle_venta
for each row
declare
v_fecha date;
begin
select sysdate into v_fecha
from dual;
insert into
bitacora(consecutivo_bitacora,fecha,tabla,operacion,campo_afectado)
values(sq_consecutivo_bitacora.nextval,v_fecha,'DETALLE_VENTA','A',:new.co
nsecutivo_ventas);
dbms_output.put_line('SE HA INSERTADO EN CATEGORIAS CHECAR LA BITACORA');
end;
Mandamos llamar el disparador de la siguiente manera
--LLAMA TR_INSERT_BITACORA_DETALLE
begin
pa_agregar_detalle_ventas(115,235690,2,200);
end;
La salida en la bitácora es:
121
20. DDL del disparador 20: Cuando se actualice un registro de la tabla de
detalle_ventas almacenar en bitácora. --DISPARADOR PARA MODIFICAR detalle_venta Y LLENAR BITACORA
create or replace trigger tr_bit_modificar_detalle_vent
after update on detalle_venta
for each row
declare
v_fecha date;
begin
select sysdate into v_fecha
from dual;
insert into
bitacora(consecutivo_bitacora,fecha,tabla,operacion,campo_afectado)
values(sq_consecutivo_bitacora.nextval,v_fecha,'DETALLE
VENTA','M',:old.consecutivo_ventas);
dbms_output.put_line('SE HA MODIFICADO EN DETALLE_VENTA CHECAR LA
BITACORA');
end;
Operación update sobre la tabla detalle_venta. update detalle_venta set clave_producto=(550088),cantidad=(2),precio=(200) where consecutivo_ventas=115;
Bitácora después del update
122
21. DDL del disparador 21: Cuando se elimine un registro de la tabla de
detalle_ventas almacenar en bitácora. create or replace
TRIGGER TR_BIT_ELIMINAR_DETALLE_VENT
after delete on detalle_venta
for each row
declare
v_fecha date;
begin
select sysdate into v_fecha
from dual;
insert into
bitacora(consecutivo_bitacora,fecha,tabla,operacion,campo_afectado)
values(sq_consecutivo_bitacora.nextval,v_fecha,'DETALLE
VENTAS','B',:old.consecutivo_ventas);
end;
Operación delete para detalle_ventas delete detalle_venta where consecutivo_ventas=129;
Bitácora después de la operación delete
123
DISPARADORES DE LA TABLA DE FACTURAS
22. DDL del disparador 22: Cuando se inserte un registro en la tabla de
facturas almacenar en bitácora.
--DISPARADOR PARA INSERTAR EN FACTURAS Y LLENAR BITACORA
create or replace trigger tr_bit_agregar_facturas
after insert on facturas
for each row
declare
v_fecha date;
begin
select sysdate into v_fecha
from dual;
insert into
bitacora(consecutivo_bitacora,fecha,tabla,operacion,campo_afectado)
values(sq_consecutivo_bitacora.nextval,v_fecha,'FACTURAS','A',:new.no_fact
ura);
dbms_output.put_line('SE HA INSERTADO EN FACTURAS CHECAR LA BITACORA');
end;
124
Operación insert sobre la tabla facturas --LLAMA TR_INSERT_BITACORA_FACTURAS
begin
insert into facturas(no_factura,fecha,consecutivo_ventas,rfc)
values(555111666,'30/08/1993',176,'GACR56789N');
end;
Bitácora después de insertar en facturas
23. DDL
del disparador 23: Cuando se modifique un registro en la tabla de facturas almacenar en bitácora.
--DISPARADOR PARA MODIFICAR FACTURAS Y LLENAR BITACORA create or replace trigger tr_bit_modificar_facturas after update on facturas for each row declare v_fecha date; begin select sysdate into v_fecha from dual; --select sq_consecutivo_bitacora.nextval, --sq_consecutivo_bitacora.currval --from dual; insert into bitacora(consecutivo_bitacora,fecha,tabla,operacion,campo_afectado) values(sq_consecutivo_bitacora.nextval,v_fecha,'FACTURAS','M',:old.no_factura); dbms_output.put_line('SE HA MODIFICADO EN FACTURAS CHECAR LA BITACORA'); end;
125
Operación update sobre facturas update facturas set fecha=('16/09/2012'),consecutivo_ventas=(171),rfc=('MAN89r45') where no_factura= 555111666;
Bitácora después del update
24. DDL del disparador 24: Cuando se elimine un registro en la tabla de facturas almacenar en bitácora. create or replace
TRIGGER TR_BIT_ELIMINAR_FACTURAS
after delete on facturas
for each row
declare
v_fecha date;
begin
select sysdate into v_fecha
from dual;
insert into
bitacora(consecutivo_bitacora,fecha,tabla,operacion,campo_afectado)
values(sq_consecutivo_bitacora.nextval,v_fecha,'FACTURAS','B',:old.
no_factura);
end;
126
Operación delete sobre facturas delete facturas where no_factura=555111664;
Bitácora después del delete
Finalmente la tabla de bitácora queda de la siguiente manera y esta se
actualiza cada que realizamos un insert un update o delete.
127
CONCLUSIONES
Durante el desarrollo de esta práctica pudimos implementar tanto la creación de
tablas a si como la creación de vistas, índices, procedimientos, funciones y
disparadores, todo esto en conjunto nos permite llevar un mejor control sobre
nuestras bases de datos especialmente cuando estas contienen gran cantidad de
información en las cuales se requiere realizar consultas rápidas. Con la creación
de las vistas pudimos observar que se pueden extraer campos de distintas tablas
esto por si requerimos información que involucre mas de una tabla o bien extraer
solo algunos campos de la tabla base en la cual haya muchos campos. En
nuestra opinión la realización de esta practica nos sirve mucho ya que se puede
relacionar no solo con otras materias si no con un ámbito real de trabajo y al final
de cuentas es lo mas importante ya que cualquier conocimiento que logremos
adquirir tiene mas valor si este nos puede servir en el ámbito laboral. El tener
128
conocimiento sobre el manejo de las bases de datos es de gran ayuda ya que en la
actualidad la mayor parte de la información que se maneja si no es que toda se
administra a través de las bases de datos lo cual nos abre un espacio en el cual
podríamos laborar.
BIBLIOGRAFÍA: http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=449#.UKp30OQsC70 http://www.paginasprodigy.com.mx/evaristopacheco/taller/disparadores.html http://www.oracleya.com.ar/temarios/descripcion.php?cod=255&punto=97 http://www.lsi.us.es/docencia/get.php?id=5784