Professional Documents
Culture Documents
Practica 1: Creacin de Base de datos en Oracle Profesor: Pizarro Gurrola Rubn Integrantes:
Nombre N Control
Bentez favela Julieta Anah Galindo Payan Daniela Hernndez Simental Adilene Zamira
Antes de empezar con la creacin de nuestra base de datos es necesario crear un usuario llamado admin con su correspondiente contrasea con privilegios de DBA que por lo menos pueda crear tablas, ndices, vistas, funciones, procedimientos, disparadores, secuencias etc.
1. CREACIN DE LA TABLA CATEGORIAS La tabla de categoras esta formada por dos columnas; la columna de id categora el cual ser la llave primaria o bien el ndice nico de la tabla este puede ser varchar ya que no se realizaran operaciones aritmticas con este campo, la otra columna es la descripcin de la categora el tipo es varchar y en esta columna se especifican los tipos de categoras que se manejaran en la empresa en nuestro caso insertamos las categoras de: ropa interior, perfumera, zapatera, joyera, lnea blanca, farmacia, cosmticos, cereales, lcteos, carnes fras, panadera y dulcera DDL DE CATEGORIAS
drop table categorias; create table categorias ( id_categoria varchar (10) not null primary key, descripcion varchar (50) not null ); --insercin 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)
values (200456781, 'CARNES FRIAS'); insert into categorias(id_categoria,descripcion) values (1100779, 'PANADERIA'); insert into categorias(id_categoria,descripcion) values (11007779, 'DULCERIA');
2. CREACIN 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. Descripcin: en este campo almacenaremos una breve descripcin del producto Costo: este campo representa un valor numrico (es el gasto econmico que genera la fabricacin de un producto). Existencia: es un campo numrico, en este se almacena cuanta cantidad de un producto se tiene en el inventario. Id_categoria: este campo es una llave fornea categoras este referente a la tabla de hace referencia a que categora pertenece cualquier
producto que se agregue a esta tabla, no se puede agregar un producto que no pertenezca a alguna de las categoras que agregamos a categoras. DDL DE LA TABLA PRODUCTOS En esta tabla insertaremos 50 productos los cuales estarn relacionados con la tabla de categoras 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,ex istencia,id_categoria) values (125690,'leche','leche deslactosada',20,22,34,10023459); insert into productos(clave_producto,nombre_producto,descripcion,costo,precio,ex istencia,id_categoria) values (120690,'DIESEL','PERFUME FLORAL, RUTAL',1100,1050,8,335678); insert into productos(clave_producto,nombre_producto,descripcion,costo,precio,ex istencia,id_categoria) values (235690,'CREMA','CREMA ANTI ACNE',150,200,74,8823456); insert into productos(clave_producto,nombre_producto,descripcion,costo,precio,ex istencia,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,ex istencia,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,ex istencia,id_categoria) 5
3. CREACIN DE LA TABLA DE CLIENTES Esta tabla contiene informacin 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 numrico o varchar RFC: este es de tipo varchar ya que el rfc contiene letras y nmeros Razon_Social: tipo de dato varchar (es la denominacin 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 Telfono: 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,te lefono) values (1000,'GESY34568','JULIADIDANI S.A.de C.V','CIELO AXUL 223','ARCOIRIX','DURANGO','DURANGO','ABUELITO@HOTMAIL.COM','6181585713'); insert into clientes(clave_cliente,rfc,razon_social,calle_no,colonia,ciudad,estado,e_mail,te lefono) values (2000,'RESU34569','JULIADIDANI S.A.de C.V','GUACAMAYA 923','FAUNA','LA PAZ','BAJA CALIFORNA SUR','QUEBRADO@HOTMAIL.COM','6181585714');
insert into clientes(clave_cliente,rfc,razon_social,calle_no,colonia,ciudad,estado,e_mail,te lefono) values (3000,'HTRE34570','JULIADIDANI S.A.de C.V','JACARANDA 423','FLORIDA','MONTERREY','NUEVO LEON','SABUESO@HOTMAIL.COM','6181585715'); insert into clientes(clave_cliente,rfc,razon_social,calle_no,colonia,ciudad,estado,e_mail,te lefono) values (4000,'WSCT34571','JULIADIDANI S.A.de C.V','MEXICO 390','MILPAS','MORELIA','MICHOACAN','PALOMOTAS@HOTMAIL.COM','6181585716'); insert into clientes(clave_cliente,rfc,razon_social,calle_no,colonia,ciudad,estado,e_mail,te lefono) values (5000,'HESA345755','JULIADIDANI S.A.de C.V','NIEBLA 407','CIELO NEGRO','ERMOSILLO','SONORA','TILOKOS@HOTMAIL.COM','6181585718'); insert into clientes(clave_cliente,rfc,razon_social,calle_no,colonia,ciudad,estado,e_mail,te lefono) values (6000,'HESA34573','JULIADIDANI S.A.de C.V','MAR NEGRO 467','MARES','ERMOSILLO','SONORA','TOSTITOS@HOTMAIL.COM','6181585718'); insert into clientes(clave_cliente,rfc,razon_social,calle_no,colonia,ciudad,estado,e_mail,te lefono) values (7000,'HESA34574','JULIADIDANI S.A.de C.V','CIELO GRIS 125','NUBES','CHIHUAHUA','CHIHUAHUA','LEFFIO@HOTMAIL.COM','6181585719'); insert into clientes(clave_cliente,rfc,razon_social,calle_no,colonia,ciudad,estado,e_mail,te lefono) values (8000,'HESA34575','JULIADIDANI S.A.de C.V','TORMENTA 623','GRANADOS','COLIMA','COLIMA','BARROCO@HOTMAIL.COM','6181585720'); insert into clientes(clave_cliente,rfc,razon_social,calle_no,colonia,ciudad,estado,e_mail,te lefono) values (9000,'HESA34576','JULIADIDANI S.A.de C.V','TERREMOTO 923','MORIBUNDOS','CULIACAN','SINALOA','DULCESITOS@HOTMAIL.COM','6181585721'); insert into clientes(clave_cliente,rfc,razon_social,calle_no,colonia,ciudad,estado,e_mail,te lefono) values (11000,'HESA34577','JULIADIDANI S.A.de C.V','OLAS TURBIAS 708','ARCOIRIX','JALAPA','VERACRUZ','REDANDBLUE@HOTMAIL.COM','6181585722');
La tabla se creo correctamente y podemos observar que ya contiene los 10 registros que insertamos.
4. CREACIN DE LA TABLA DE EMPLEADOS En esta tabla se almacenara informacin sobre los empleados de una empresa x La tabla esta formada por los siguientes campos: No_Empleado: este puede ser un campo numrico o varchar y primaria de la tabla. Paterno: es un campo tipo varchar Materno: varchar Nombre: varchar Sexo: char Fecha_Nacimiento: date Sueldo: number Puesto: puede ser numrico o varchar en l se almacena la clave del puesto es llave fornea 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 )
ser la llave
10
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);
11
5. CREACIN 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.
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); Ejecucin del DDL de la tabla puestos
Despus de la creacin
13
6. CREACIN DE LA TABLA DE VENTAS Para la creacin de la tabla de ventas es necesario crear antes una secuencia o consecutivo el cual ser la llave primaria de la tabla el cdigo SQL para la creacin de la secuencia es el siguiente:
14
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);
15
7. CREACIN DE LA TABLA DE DETALLE_VENTAS En la tabla de detalle ventas se tienen los siguientes campos: Consecutivo_ventas: el cual es una llave fornea referente a la tabla de ventas. Clave_producto: es llave fornea referente a la tabla de productos. Cantidad: es un campo numrico. Precio: es un campo numrico. Importe: es un campo numrico el cual es el resultado de la multiplicacin 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 );
16
Despus
update ventas
17
Despus 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);
18
end;
19
Como podemos observar en base al consecutivo existente en ventas se llena la tabla de detalle venta y el importe es calculado automtico por el procedimiento.
20
Despus 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. CREACIN 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 numrico Consecutivo_ ventas: este campo es llave fornea referente a la tabla de ventas Rfc: representa un valor varchar y es fornea de la tabla de clientes. En el DDL de facturas insertaremos 20 registros de facturas, como se puede observar en el cdigo que se muestra a continuacin.
21
); --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');
22
9. CREACIN DE LA TABLA DE BITACORA Para la creacin de la Tabla bitcora vamos a crear un consecutivo el cual ser la llave primaria de la tabla. El DDL de la creacin 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; Despus 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 operacin, la tabla; representa la tabla en la que se realizo la operacin. Campo afectado;
23
DDL de la creacin de la tabla de bitcora 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 bitcora necesitamos crear disparadores para cada tabla o bien para cada operacin que vallamos a realizar sobre las tablas. Por ejemplo para insertar en la tabla de categoras y que a su vez se registre en la bitcora la insercin, hacemos lo siguiente.
24
PASO 2 CREACIN DE
Los
NDICES:
una estructura de datos que
mejora la velocidad de las operaciones, permitiendo un rpido acceso a los registros de una tabla. Al aumentar drsticamente la velocidad de acceso, se suelen usar sobre aquellos campos sobre los cuales se vayan a realizar bsquedas frecuentes. Los ndices pueden ser creados usando una o ms columnas, preparando la base de datos tanto para bsquedas rpidas al azar como para ordenaciones eficientes de los registros. Al crear las llaves primarias automticamente se crean ndices primarios nicos de cada tabla, pero es necesario crear otros ndices para ello creamos los siguientes para cada tabla:
Tabla
Categoras Productos 1. 2. 3. 4. 5.
ndices:
ndice nico por el campo Id_categoria. ndice normal por el campo descripcin. ndice normal por nombre. Indice normal por costo de producto. Indice normal compuesto por los campos de Id_categoria y clave_producto. 6. Indice nico por el campo RFC 7. Indice normal por el campo razn social 8. Indice normal compuesto por los campos estado, ciudad y colonia. 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 13.Indice normal por nombre 14.Indice normal por sueldo_base 15.Indice normal por fecha de venta
Clientes
Empleados
Puestos Ventas
25
Detalle_Ventas Facturas
Bitacora
16.Indice normal por clave de cliente 17.Indice normal por no_empleado 18.Indice normal por total de venta 19.Indice normal por clave de producto 20.Indice normal por importe 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 24.Indice normal por fecha 25.Indice normal compuesto por usuario, fecha y tabla
create index categorias_descripcion on categoras (descripcion); Ejecucin del DDL del ndice 2 de categoras
26
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);
27
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
28
6.ndice nico por el campo RFC. Debido a que este campo es la llave primaria de la tabla clientes se ha creado automticamente al crear la tabla.
7.DDL Indice normal por el campo razn 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
29
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
30
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
31
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
32
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
33
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
34
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
35
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
36
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
24.DDL Indice normal por fecha create index bitacora_fecha on bitacora(fecha); Ejecucin del DDL del ndice 24 tabla bitacora
37
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
Vistas
1. Vista de los campos Id_categoria y descripcin 2. Vista de los campos clave producto, nombre y descripcin 3. Vista de los campos clave de producto, costo, precio y existencia.
38
Clientes
Empleados
Puestos Ventas
Detalle_Ventas
4. Vista de dos tablas (productos y categoras), de los campos clave de producto, nombre descripcin, id_categoria y descripcin de la categora. 5. Vista de los campos clave de cliente, razn social, ciudad y estado. 6. Vista de los campos clave de cliente, calle, colonia, telfono email. 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. 10. Vista de puesto, y nombre 11. Vista de puesto y sueldo base 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, razn social del cliente y total de la venta 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. 18. Vista de nmero factura, fecha de factura, y consecutivo venta. 19. Vista de dos tablas (factura y clientes):no factura, rfc cliente clave cliente, razn social, fecha y total factura. 20. Vista con los campos de fecha, usuario, operacin, tabla
Facturas
Bitcora
39
1. DDL de la creacin de la vista de los campos clave producto, nombre y descripcin. DDL de la vista 2 de la tabla de productos. --2. Vista de los campos clave producto, nombre y descripcin drop view vis_productos; create view vis_productos as select clave_producto,nombre_producto,descripcion from productos; --insertar 40
insert into productos(clave_producto,nombre_producto,descripcion) values(123478800,'GOMAS','GOMAS SABOR MANGO CON CHILE'); Ejecucin del DDL de la vista 2 de productos
Despus 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 creacin de la vista de los campos clave de producto, costo, precio y existencia. --3. Vista de los campos clave de producto, existencia. drop view vis_productos3; create view vis_productos3 as select clave_producto,costo,precio,existencia from productos; costo, precio y
41
Ejecucin del DDL de la vista 3 de productos Despus 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 categoras), de los campos clave de producto, nombre descripcin, id_categoria y descripcin de la categora. --4. Vista de dos tablas (productos y categoras), de los campos clave de producto, nombre descripcin, --id_categoria y descripcin de la categora.
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,categoras
42
Despus 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 descripcin del producto y de la tabla de categoras se extrae el id_categoria y la descripcin de todas las categoras.
4. DDL de la creacin de la vista de los campos clave de cliente, razn social, ciudad y estado.
43
5. DDL de la vista de los campos clave de cliente, calle, colonia, telfono email. drop view vista_clientes; create view vista_clientes as select clave_cliente,calle_no,colonia,telefono,e_mail from clientes; Ejecucin del DDL de la vista 6 de clientes
44
45
46
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
9.
--VISTA10 drop view VISTA10_PUESTOS; create view VISTA10_PUESTOS as select puesto,nombre from puestos
47
48
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;
49
14. DDL de la Vista de dos tablas (ventas con clientes): consecutivo venta, fecha venta, rfc o clave de cliente, razn 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;
50
cantidad,
drop view vista_detalle_venta; create view vista_detalle_venta as select clave_producto,cantidad,precio,importe from detalle_venta; Ejecucin del DDL de la vista 16 de detalle_venta
51
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;
52
17. DDL de la vista de los campos nmero_factura, fecha de factura, y consecutivo venta.
--18. Vista de nmero_factura, --y consecutivo venta. fecha de factura,
drop view vista18_facturas; create view vista18_facturas as select no_factura,fecha,consecutivo_ventas from facturas
53
18. DDL de la vista de dos tablas (factura y clientes): no_factura, rfc cliente clave cliente, razn 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 Ejecucin del DDL de la vista 19 de facturas y clientes.
19. DDL de la vista con los campos de fecha, operacin y tabla drop view vista20_bitacora; create view vista20_bitacora as select fecha,operacion,tabla from bitcora Ejecucin del DDL de la vista 20 de bitcora.
54
Un procedimiento es un conjunto de comandos SQL que pueden almacenarse en el Los procedimientos pueden mejorar el rendimiento ya que se necesita enviar menos informacin entre el servidor y el cliente. CREAR LAS SIGUIENTES PROCEDIMIENTOS PARA CADA TABLA: Tabla Procedimientos: 1. Procedimiento para agregar nueva categora: todos los campos. 2. Procedimiento para modifica una categora existente: todos los campos excepto el id_categora 3. Procedimiento para eliminar una categora existente proporcionando el id_categora, el registro a eliminar se borrar siempre y cuando sta categora no tenga referencia en la tabla de productos 4. Procedimiento para agregar nuevo producto de una categora 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. 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. 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. 13.Procedimiento para agregar nuevo puesto: todos los campos. 14.Procedimiento para modifica un puesto existente:
Categorias
Productos
Clientes
Empleados
Puestos
55
Ventas
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. 16.Procedimiento para agregar nueva venta: todos los campos respetando llaves primarias y forneas. 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 tambin. 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 operacin 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)
Detalle_Ventas
Where consecutivo = 1000; Siempre y cuando exista la venta consecutivo nmero 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; 21.Procedimiento para agregar nueva factura: todos los campos respetando llaves primarias y forneas. 22.Procedimiento para modifica una factura existente: todos los campos excepto el nmero de factura. 23.Procedimiento para eliminar una factura existente proporcionando el nmero de factura, el registro a eliminar se borrar indistintamente.
Facturas
56
Bitacora
automticamente
DDL de procedimiento para la tabla categora 1. DDL del procedimiento para una nueva categora 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 categoras y podemos ver que nuestro registro se encuentra el dicha tabla.
57
2. DDL del procedimiento para modifica una categora existente: todos los campos excepto el id_categora.
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;
58
3. DDL del procedimiento para eliminar una categora existente proporcionando el id_categora, el registro a eliminar se borrar siempre y cuando sta categora 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;
59
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 dama',19,42,280 ,9004135); end;
en
aerosol
para
60
'perfume extractos
ctricos',
Enseguida vemos los cambios que se realizaron con los DDL anteriores.
61
62
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);
63
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','WEBMASTERING@HOTMAIL.COM','675123-34-50'); end;
64
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','CABEZA@HOTMAIL.COM','618-129-65-57'); end;
65
66
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,
67
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;
68
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
69
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 ejecucin.
70
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 categorias'); end; DDL para ejecutarlo.
revisar
tabla
71
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 ejecucin.
72
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;
73
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
74
17. Procedimiento para modifica una venta existente. create or replace procedure pa_actualizar_ventas( v_consecutivo_ventas number,
75
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;
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
76
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;
77
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.
78
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; Despus de mandar llamar el cdigo la tabla de detalle_ventas nos queda de la siguiente manera.
79
Al ejecutar el DDL principal automticamente 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;
80
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 continuacin.
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 cdigo es necesario realizar el siguiente. begin pa_agregar_factura ( 9393, '04/09/2012','HESA34574',4658); end;
81
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; Ejecucin y resultados. begin pa_agregar_factura ( 13006,'12/04/2012','HESA910510',119); end;
82
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.
83
DDL para procedimiento de la tabla bitcora 24. Se almacenan los registros automticamente utilizando disparadores. Al emplear disparadores la tabla de bitcora se ir actualizando despus de agregar, modificar o eliminar algn elemento de las tablas creadas anteriormente. A continuacin podemos observar cmo queda nuestra tabla despus 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.
84
DDL para la funcin de la tabla categora. 1. Funcin para contar cuantas categoras 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 categoras 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. Funcin 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
85
select count(existencia) into c_productos from productos where id_categoria= v_id_categoria; return c_productos; end; ahora realizaremos la ejecucin con el siguiente cdigo. 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:
86
87
88
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;
begin select count (suedo) into v_total from empleados where v_total=<v_sueldo; dbms_output.put_line('los empleados '||v_total); select count (sueldo) into v_total from empleados where v_total=>v_sueldo; dbms_output.put_line('los empleados '||v_totall); return 0; end; DDL para la ejecucin.
con
menor
sueldo
son
con
mayor
sueldo
son
90
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. Funcin para conocer cuntos empleados son del sexo Masculino del sexo
femenino. La funcin debe recibir el parmetro del sexo para conocer cuntos empleados hay de cada sexo segn 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 cdigo 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');
91
DDL para realizar la fincion de la tabla ventas 11. Funcin para conocer el total de todas las ventas que se hicieron de un ao en
particular.
92
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 ao: '||cantidadtotal); end;
12.
Funcin 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 clave_cliente=v_clave_cliente; return v_total; end;
where
93
A continuacion se muestra el cdigo de ejecucin y los resultados declare cuantas_cat1 number; begin cuantas_cat1 :=fn_cuantas_ventas(1000); dbms_output.put_line('EL NUMERO TOTAL DE LAS VENTAS cuantas_cat1); end;
ES:
'
||
DDL para realizar la fincion de la tabla detalle_ventas 13. Funcin 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 ejecucin 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;
94
DDL para realizar la fincion de la tabla facutras 14. Funcin que devuelve cuntas facturas son de un da 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;
95
DDL para realizar la fincion de la tabla facutras 15. Funcin 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 tres disparadores para cada tabla. Para cada tabla cuando se registre una alta almacenar el movimiento en la tabla bitcora. A Alta para insert
CREAR DISPARADORES
96
Para cada tabla cuando se registre una alta almacenar el movimiento en la tabla bitcora. B Alta para delete Para cada tabla cuando se registre una alta almacenar el movimiento en la tabla bitcora. M Modificacin para update. Tabla Categoras Disparadores
1. Cuando se registre un nuevo registro almacenar en bitcora. 2. Cuando se elimine un registro registrar en bitcora 3. Cuando se modifique o actualice un registro almacenar en bitcora. 4. Cuando se registre un nuevo registro almacenar en bitcora. 5. Cuando se elimine un registro registrar en bitcora 6. Cuando se modifique o actualice un registro almacenar en bitcora. 7. Cuando se registre un nuevo registro almacenar en bitcora. 8. Cuando se elimine un registro registrar en bitcora 9. Cuando se modifique o actualice un registro almacenar en bitcora. 10. Cuando se registre un nuevo registro almacenar en bitcora. 11. Cuando se elimine un registro registrar en bitcora 12. Cuando se modifique o actualice un registro almacenar en bitcora. 13. Cuando se registre un nuevo registro almacenar en bitcora. 14. Cuando se elimine un registro registrar en bitcora 15. Cuando se modifique o actualice un registro almacenar en bitcora. 16. Cuando se registre un nuevo registro almacenar en bitcora. 17. Cuando se elimine un registro registrar en bitcora 18. Cuando se modifique o actualice un registro almacenar en bitcora. 19. Cuando se registre un nuevo registro almacenar en bitcora. 20. Cuando se modifique o actualice un registro almacenar en bitcora. 21. Cuando se registre un nuevo registro almacenar en bitcora. 22. Cuando se elimine un registro registrar en bitcora 23. Cuando se modifique o actualice un registro almacenar en bitcora.
Productos
Clientes
Empleados
Puestos
Ventas
Detalle_Ventas
Facturas
Bitcora
DISPARADORES DE LA TABLA DE CATEGORAS
Un
disparador
(o trigger)
es
un
tipo
especial
de procedimiento
almacenado asociado a una tabla que se ejecuta al realizar una operacin bsica (insert, un delete o un update) sobre sta. La operacin bsica que despierta al 97
trigger es conocida como sentencia disparadora. La ejecucin del disparador puede ser antes (before) o despus (after) de llevar a cabo la sentencia disparadora. A continuacin crearemos disparadores para que despus de la sentencia se actualice la tabla de bitcora. 1. DDL del disparador1: Cuando se inserte un nuevo registro en la tabla de categoras almacenar en bitcora.
create or replace 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; trigger tr_bit_agregar_categorias after insert on categorias
98
Para poder observar el funcionamiento del disparador es necesario realizar una insercin en la tabla de categoras y posteriormente revisar la tabla de bitcora. Como se muestra a continuacin. Primero insertamos una nueva categora.
Y posteriormente revisamos la tabla de bitcora y queda de la siguiente manera. En donde el registro que agregamos a la tabla categoras esta marcado con el recuadro amarillo.
99
2. DDL del disparador 2: Cuando se actualice o modifique existente de la tabla de categoras almacenar en bitcora. --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;
un registro
insert into bitacora(consecutivo_bitacora,fecha,tabla,operacion,campo_afectado) values(sq_consecutivo_bitacora.nextval,v_fecha,'CATEGORIAS','M',:old.i d_categoria); dbms_output.put_line('SE HA MODIFICADO EN CATEGORIAS CHECAR LA BITACORA'); end; Ejecucin del DDL del disparador2 modificar
100
Despus de esto realizamos un update sobre la tabla de categoras y empleando la salida del dbms nos indica que chequemos la bitcora.
Revisamos la bitcora y se encuentra registrada la operacin M que representa el update que realizamos sobre la tabla de categoras.
101
3. DDL del disparador 3: Cuando se elimine registro existente de la tabla de categoras almacenar en bitcora.
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;
Al realizar una operacin delete sobre la tabla de categoras se registra en bitcora. Por ejemplo eliminaremos la categora que tiene el id_ categora marcado en azul.
102
4. DDL del disparador4: Cuando se inserte un nuevo registro en la tabla de productos almacenar en bitcora.
--DISPARADOR PARA INSERTAR EN PRODUCTOS Y LLENAR BITACORA create or replace for each row declare v_fecha date; trigger tr_bit_agregar_productos
103
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;
Ejecucin del DDL del disparador 4 insertar Realizamos una insercin 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;
5. DDL del disparador5: Cuando se modifique un registro en la tabla de productos almacenar en bitcora. --DISPARADOR PARA MODIFICAR PRODUCTOS Y LLENAR BITACORA create or replace trigger tr_bit_modificar_productos after update on productos 104
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; Ejecucin del disparador 5 modificar
105
6. DDL del disparador 6: Cuando se elimine un registro en la tabla de productos almacenar en bitcora.
--5. Cuando se elimine un registro registrar en bitcora create or replace TRIGGER TR_BIT_ELIMINAR_PRODUCTOS
106
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;
Ejecucin del DDL del disparador 6 eliminar delete productos where clave_producto=330033; Tabla de bitcora despus de la operacin delete
7. DDL del disparador 7: Cuando se inserte un registro en la tabla de clientes almacenar en bitcora. Como hemos visto en los procedimientos anteriores realizamos una insercin en la tabla de clientes y observamos el resultado en la tabla de bitcora. 107
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;
8. DDL del disparador 8: Cuando se modifique un registro en la tabla de clientes almacenar en bitcora.
create or replace trigger tr_bit_modificar_clientes after update on clientes for each row
108
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;
Despus de realizar un update sobre la tabla de clientes podemos ver que se sigue llenando la tabla de bitcora ya que cada vez que realizamos una operacin el disparador se activa y llena automticamente la bitcora.
9. DDL del disparador 9: Cuando se elimine un registro en la tabla de clientes almacenar en bitcora
create or replace TRIGGER TR_BIT_ELIMINAR_CLIENTES after delete on clientes
109
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;
10. DDL del disparador 10: Cuando se inserte un registro en la tabla de empleados almacenar en bitcora.
110
--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;
Despus de realizar una insercin sobre la tabla de empleados la bitcora queda de la siguiente manera.
11. DDL del disparador 11: Cuando se modifique un registro existente de la tabla de empleados almacenar en bitcora.
--DISPARADOR PARA MODIFICAR EMPLEADOS Y LLENAR BITACORA
111
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;
Despus de realizar la operacin update sobre la tabla de empleados la bitcora se ve de la siguiente manera.
12. DDL del disparador 12: Cuando se elimine un registro en la tabla de empleados almacenar en bitcora
create or replace TRIGGER TR_BIT_ELIMINAR_EMPLEADOS
112
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;
13. DDL del disparador 13: Cuando se inserte un registro en la tabla de puestos almacenar en bitcora.
--DISPARADOR PARA INSERTAR EN PUESTOS Y LLENAR BITACORA
113
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;
Despus de realizar un insert sobre la tabla de puestos la bitcora queda de la siguiente manera.
14. DDL del disparador 14: Cuando se modifique un registro existente de la tabla de puestos almacenar en bitcora.
--DISPARADOR PARA MODIFICAR PUESTOS Y LLENAR BITACORA create or replace trigger tr_bit_modificar_puesto after update on puestos
114
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;
15. DDL del disparador 15: Cuando se elimine un registro en la tabla de puestos almacenar en bitcora
create or replace
115
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;
116
16. DDL del disparador 16: Cuando se inserte un registro en la tabla de ventas almacenar en bitcora.
--DISPARADOR PARA INSERTAR EN VENTAS Y LLENAR BITACORA create or replace 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; trigger tr_bit_agregar_ventas after insert on ventas
117
17. DDL del disparador 17: Cuando se modifique un registro existente de la tabla de ventas almacenar en bitcora.
--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;
Resultado en la Bitcora
118
la tabla de ventas
Delete de la tabla de ventas Delete ventas where consecutivo_ventas= (134); Bitcora despus de la operacin delete.
119
19. DDL del disparador 19: Cuando se inserte un registro en la tabla de detalle_ventas almacenar en bitcora.
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;
120
20. DDL del disparador 20: Cuando se actualice un registro de la tabla de detalle_ventas almacenar en bitcora.
--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;
121
21. DDL del disparador 21: Cuando se elimine un registro de la tabla de detalle_ventas almacenar en bitcora.
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;
122
22. DDL del disparador 22: Cuando se inserte un registro en la tabla de facturas almacenar en bitcora.
--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;
123
23. DDL del disparador 23: Cuando se modifique un registro en la tabla de facturas almacenar en bitcora.
--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;
124
24. DDL del disparador 24: Cuando se elimine un registro en la tabla de facturas almacenar en bitcora. 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; 125
Finalmente la tabla de bitcora queda de la siguiente manera y esta se actualiza cada que realizamos un insert un update o delete.
126
CONCLUSIONES Durante el desarrollo de esta prctica pudimos implementar tanto la creacin de tablas a si como la creacin 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 informacin en las cuales se requiere realizar consultas rpidas. Con la creacin de las vistas pudimos observar que se pueden extraer campos de distintas tablas esto por si requerimos informacin que involucre mas de una tabla o bien extraer solo algunos campos de la tabla base en la cual haya muchos campos. En nuestra opinin la realizacin 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 127
conocimiento sobre el manejo de las bases de datos es de gran ayuda ya que en la actualidad la mayor parte de la informacin que se maneja si no es que toda se administra a travs de las bases de datos lo cual nos abre un espacio en el cual podramos laborar. BIBLIOGRAFA:
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
128