procedimientos y triggers

53
Procedimientos en MYSQL. 1. Procedimiento que inserta un nuevo empleado. create procedure insertar_empleado (in id_empleado int, nombre varchar(30), a_paterno varchar(30), a_materno varchar(30), salario float(10,2), telefono varchar(15), puesto varchar(15), id_jefe int, id_departamento int, comision float(10,2), fecha_contratacion date, email varchar(20), fecha_nto date, sexo varchar(1)) begin insert into empleados values(id_empleado, nombre, a_paterno, a_materno, salario, telefono, puesto, id_jefe, id_departamento, comision, fecha_contratacion, email, fecha_nto, sexo, id_jefe, id_departamento); end / mysql> call insertar_empleado (3, 'dayana', 'gomez', 'alcaraz', 1500, '74758963', 'Empleada', 18, 13, 150, '2014/12/12', '[email protected]', '1994/02/08', 'F'); -> / Query OK, 1 row affected (0.04 sec)

Upload: irving-ascencio

Post on 12-Dec-2015

20 views

Category:

Documents


3 download

DESCRIPTION

Procedimientos y triggers

TRANSCRIPT

Page 1: Procedimientos y Triggers

Procedimientos en MYSQL.1. Procedimiento que inserta un nuevo empleado.

create procedure insertar_empleado (in id_empleado int, nombre varchar(30), a_paterno varchar(30), a_materno varchar(30), salario float(10,2), telefono varchar(15), puesto varchar(15), id_jefe int, id_departamento int, comision float(10,2), fecha_contratacion date, email varchar(20), fecha_nto date, sexo varchar(1)) begin insert into empleados values(id_empleado, nombre, a_paterno, a_materno, salario, telefono, puesto, id_jefe, id_departamento, comision, fecha_contratacion, email, fecha_nto, sexo, id_jefe, id_departamento);end/

mysql> call insertar_empleado (3, 'dayana', 'gomez', 'alcaraz', 1500, '74758963', 'Empleada', 18, 13, 150, '2014/12/12', '[email protected]', '1994/02/08', 'F'); -> /Query OK, 1 row affected (0.04 sec)

Page 2: Procedimientos y Triggers

2. Procedimiento que devuelve el total de una factura.

mysql> create procedure total_factura (in idventa int, out factura float) -> begin -> select total_pagar into factura from ventas where id_venta=idventa; -> set @factura=factura; -> end -> /Query OK, 0 rows affected (0.00 sec)

mysql> call total_factura (3, @factura); -> /Query OK, 0 rows affected (0.00 sec)

mysql> select @factura/

Page 3: Procedimientos y Triggers

3. Procedimiento que devuelve el monto de lo que ha comprado un cliente en un periodo determinado.

mysql> create procedure monto_comprado( in fechacompra date, out cantidadcompra float) -> begin -> select sum(total_pagar) into cantidadcompra from ventas ven join clientes cli on ven.id_cliente=cli.id_cliente where fechacompra>=fechacompra; -> set @cantidad=cantidadcompra; -> end -> /Query OK, 0 rows affected (0.00 sec)

mysql> call monto_comprado('2015-04-13', @cantidad)/Query OK, 0 rows affected (0.00 sec)

mysql> select @cantidad/

Page 4: Procedimientos y Triggers

4. Procedimiento que devuelve el nombre del empleado que m�s vende en el mes.

mysql> create view mes as select emp.nombre, fecha_hora_venta, sum(total_pagar)venta from empleados emp join ventas ven on emp.id_empleado = ven.id_empleado group by emp.nombre/Query OK, 0 rows affected (0.08 sec)

mysql> create procedure empleado_mas_vende_mes(in fechaventa date, fecha_venta date, out empleado varchar(30)) -> begin -> select venta, emp.nombre into empleado from empleados emp join mes m on emp.id_empleado=m.id_empleado where fecha_hora_venta>=fechaventa and fecha_hora_venta<=fecha_venta group by nombre having venta=(select max(venta) from mes); -> set @empleado_mas_vende_mes=empleado; -> end/Query OK, 0 rows affected (0.00 sec)mysql> call empleado_mas_vende_mes('2015-01-01', '2015-05-05', @empleado_mas_vende_mes); -> /Query OK, 0 rows affected (0.00 sec)

Page 5: Procedimientos y Triggers

5. Procedimiento que calcula la n�mina de los empleados considerando salario m�s comisiones de venta.

mysql> create procedure calcula_nomina() -> begin -> select id_empleado, salario+comision calcula_nomina from empleados; -> end -> /Query OK, 0 rows affected (0.00 sec)

mysql> call calcula_nomina/

Page 6: Procedimientos y Triggers

6. Transacci�n de ventas. Mysql>start transaction;

Donde se venderan 3 articulos a un cliente nuevo

Page 7: Procedimientos y Triggers

1) Insertar cliente

Mysql> insert into clientes values(50, ‘hdfhgdd’, ‘juan’, ‘perez’, ‘gonzalez’, ‘7475895623’, ‘quinta’, ‘64’, ‘chilpancingo’, ‘mexico’, ‘[email protected]’, ‘1994/02/12’, ‘2014/06/07’, ‘Fisica’, ‘M’);

Savepoint insertar_cliente;

2) Insertar en Ventas

Mysql> insert into ventas values(1, ‘2015/02/02’, 0, 0, ‘contado’, 23, 50);

Rollback to insertar_cliente;

Page 8: Procedimientos y Triggers

Creamos savepoint

Mysql> savepoint insertar_ventas;

Page 9: Procedimientos y Triggers

3) Insertar en detalle ventas

mysql> insert into detalle_ventas values (1, 2, 1);

mysql> insert into detalle_ventas values (1, 3, 2);

mysql> insert into detalle_ventas values (1, 4, 3);

Creamos savepoint insertar detalle_ventas;

Mysql>savepoint inserter_detalle_ventas;

Page 10: Procedimientos y Triggers

4) Obtener el total de la venta.

mysql> select sum(cantidad_vendida*precio_venta) from detalle_ventas d join productos p on d.id_producto =p.id_producto where id_venta=1;

Page 11: Procedimientos y Triggers

5) Actualizar el total_venta

mysql> update ventas set total_pagar=( select sum(cantidad_vendida*precio_venta) from detalle_ventas d join productos p on d.id_producto =p.id_producto where id_venta=1) where id_venta=1;

Page 12: Procedimientos y Triggers

Creamos savepoint actualizar total venta

Mysql> savepoint actualizar_total_venta

6) Actualizar la cantidad de inventario.

Page 13: Procedimientos y Triggers

mysql> update productos set cantidad=cantidad-(select cantidad_vendida from detalle_ventas where id_producto = 2 and id_venta=1) where id_producto=2;

7) Obtener el iva

Page 14: Procedimientos y Triggers

select total_pagar *.16 iva from ventas where id_venta=1;mysql> set @iva=0;select total_pagar *.16 iva from ventas where id_venta=1;mysql> update ventas set iva= @iva where id_venta=1;select* from ventas where id_venta=1;

Creamos savepoint obtener_iva

Page 15: Procedimientos y Triggers

Mysql> savepoint obtener_iva;

8) Asignar comisiónset @comision=0;

Page 16: Procedimientos y Triggers

select total_pagar *.10 into @comision from ventas where id_venta=1;select @comision;select comision from empleados;select comision from empleados where id_empleado=20;update empleados set comision= comision+@comision where id_empleado=( select id_empleado from ventas where id_venta=1);

Creamos savepoint Obtener_comision.Mysql> obtener_comision;

Page 17: Procedimientos y Triggers

Terminar la transacción;Mysql> commit;

7. Realizar un ejemplo de un procedimiento que llame a otro procedimiento (ejemplo libre).

mysql> create procedure dentro (in idempleado int) -> begin -> update empleados set comision=comision+200 where id_empleado=idempleado; -> call calcula_nomina(); -> end -> /Query OK, 0 rows affected (0.03 sec)

mysql> call dentro(22)/

Page 18: Procedimientos y Triggers

8. En Oracle o Postgresql ejemplificar una funci�n.Creamos una función para saber si un producto es costoso o economico

SQL> create or replace function f_costoso (avalor number)

2 return varchar2

3 is

4 valorretornado varchar2(20);

5 begin

6 valorretornado:='';

7 if avalor<=20 then

8 valorretornado:='economico';

9 else valorretornado:='costoso';

Page 19: Procedimientos y Triggers

10 end if;

11 return valorretornado;

12 end;

13 /

Function created.

Page 20: Procedimientos y Triggers

SQL> select nombre_producto, precio_venta, f_costoso(precio_venta) from productos;

Page 21: Procedimientos y Triggers

Procedimientos en ORACLE.1. Procedimiento que inserta un nuevo empleado.

SQL> create or replace procedure insertar_empleado (in id_empleado int, nombre varchar2(30), a_paterno varchar2(30), a_materno varchar2(30), salario float(10,2), telefono varchar2(15), puesto varchar2(15), id_jefe int, id_departamento int,comision float(10,2), fecha_contratacion date, email varchar2(20), fecha_nto date, sexo varchar(1)) 2 as 3 begin 4 insert into empleados values(id_empleado, nombre, a_paterno, a_materno, salario, telefono, puesto, id_jefe, id_departamento, comision, fecha_contratacion, email, fecha_nto, sexo); 5 end; 6 /Procedure createdmysql> exec insertar_empleado (3, 'dayana', 'gomez', 'alcaraz', 1500, '74758963', 'Empleada', 18, 13, 150, '2014/12/12', '[email protected]', '1994/02/08', 'F'); -> /PL/SQL procedure successfully completed.

Page 22: Procedimientos y Triggers
Page 23: Procedimientos y Triggers

2. Procedimiento que devuelve el total de una factura.SQL> create or replace procedure total_factura (idventa in int) 2 as 3 factura number; 4 begin 5 select total_pagar into factura from ventas where id_ventas=idventa; 6 dbms_output.put_line('==> El total de la factura es:'|| factura); 7 end total_factura; 8 /

Procedure created.

SQL> variable factura numberSQL> exec total_factura (4)

Page 24: Procedimientos y Triggers

3. Procedimiento que devuelve el monto de lo que ha comprado un cliente en un periodo determinado.

SQL> create or replace procedure monto_comprado(fechacompra in date) 2 as 3 cantidadcomprada number; 4 begin 5 select sum(total_pagar) into cantidadcomprada from ventas ven join clientes cli on ven.id_cliente=cli.id_cliente where fechacompra>=fechacompra; 6 dbms_output.put_line('==> Monto comprado por el cliente:'|| cantidadcomprada); 7 end monto_comprado; 8 /

Procedure created.

SQL> variable cantidadcomprada numberSQL> exec monto_comprado('18-04-15')==> Monto comprado por el cliente:2510

PL/SQL procedure successfully completed.

Page 25: Procedimientos y Triggers

4. Procedimiento que devuelve el nombre del empleado que m�s vende en el mes.

SQL> create or replace procedure empleado_masvende 2 as

3 nom varchar2(100);4 begin5 select nombre into nom from empleados join ventas on

empleado.id_empleado=ventas.id_empleado group by empleados.nombre having sum(ventas.total_pagar)>=(select max(total_pagar)) from ventas group by ventas.id_empleado);

6 dbms_output.put_line(‘ El empleado que mas vende es:’|| nom);7 end empleado_masvende;8 /

Procedure created

SQL> set serveroutput onSQL> exec empleado_masvende

Page 26: Procedimientos y Triggers

5. Procedimiento que calcula la n�mina de los empleados considerando salario m�s comisiones de venta.

SQL> create or replace procedure calcula_nomina (idempleado in int) 2 as 3 nomina number; 4 begin 5 select salario+comision into nomina from empleados where id_empleado=idempleado; 6 dbms_output.put_line('==> El total de la nomina es:'|| nomina); 7 end calcula_nomina; 8 /

Procedure created.

SQL> set serveroutput onSQL> variable nomina numberSQL> exec calcula_nomina(18)==> El total de la nomina es:22010.55

PL/SQL procedure successfully completed.

Page 27: Procedimientos y Triggers

6. Transacci�n de ventas. Iniciamos la transacción en Oracle insertando nuevo cliente.

Donde se venderan 3 articulos a un cliente nuevo

1) Insertar cliente

SQL> insert into clientes values(50, 'hdfhgdd', 'juan', 'perez', 'gonzalez', '7475895623', 'quinta', '64', 'chilpancingo', 'mexico', '[email protected]', '12/02/1994', '07/06/2014', 'Fisica', 'M');

Savepoint insertar_cliente;

Creamos un savepoint

Savepoint insertar_cliente;

Page 28: Procedimientos y Triggers

2) Insertar en Ventas

SQL> insert into ventas values(7, '20/02/2015', 0, 0, 'contado', 23, 50);

Creamos savepoint

SQL> savepoint insertar_ventas;

Page 29: Procedimientos y Triggers

3) Insertar en detalle ventas

SQL> insert into detalle_ventas values (7, 2, 1);

SQL> insert into detalle_ventas values (7, 3, 2);

SQL> insert into detalle_ventas values (7, 4, 3);

Creamos savepoint insertar detalle_ventas;

SQL>savepoint inserter_detalle_ventas;

Page 30: Procedimientos y Triggers

4) Obtener el total de la venta.

SQL> select sum(cantidad_vendida*precio_venta) from detalle_ventas d join productos p on d.id_producto =p.id_producto where id_venta=7;

5) Actualizar el total_venta

SQL> update ventas set total_pagar=( select sum(cantidad_vendida*precio_venta) from detalle_ventas d join productos p on d.id_producto =p.id_producto where id_ventas=7) where id_ventas=7;

Page 31: Procedimientos y Triggers

Creamos savepoint actualizar total venta

SQL> savepoint actualizar_total_venta

6) Actualizar la cantidad de inventario.

SQL> update productos set cantidad=cantidad-(select cantidad_vendida from detalle_ventas where id_producto = 2 and id_ventas=7) where id_producto=2;

Page 32: Procedimientos y Triggers
Page 33: Procedimientos y Triggers

SQL> update productos set cantidad=cantidad-(select cantidad_vendida from detalle_ventas where id_producto = 3 and id_ventas=7) where id_producto=3;

Page 34: Procedimientos y Triggers

SQL> update productos set cantidad=cantidad-(select cantidad_vendida from detalle_ventas where id_producto = 4 and id_ventas=7) where id_producto=4;

Page 35: Procedimientos y Triggers

Creamos un savepoint actualizar_inventario

SQL> savepoint actualizar_inventario

7) Obtener el ivaupdate ventas set iva=total_pagar *.16 where id_ventas=7;

Creamos savepoint obtener_iva

Page 36: Procedimientos y Triggers

SQL> savepoint obtener_iva;

8) Asignar comisión

SQL> update empleados set comision=comision+(select total_pagar*.10 from ventas where id_ventas=7) where id_empleado=(select id_empleado from ventas where id_ventas=7);

Page 37: Procedimientos y Triggers

Creamos savepoint Obtener_comision.SQL> savepoint obtener_comision;

Terminar la transacción;SQL> commit;

7. Realizar un ejemplo de un procedimiento que llame a otro procedimiento (ejemplo libre).SQL> create or replace procedure dentro (idempleado in int) 2 as 3 begin 4 update empleados set comision=comision+200 where id_empleado=idempleado; 5 begin 6 calcula_nomina(idempleado); 7 end calcula_nomina; 8 end dentro; 9 /

Procedure created.

Page 38: Procedimientos y Triggers

8. En Oracle o Postgresql ejemplificar una funci�n.Creamos una función para saber si un producto es costoso o economico

SQL> create or replace function f_costoso (avalor number)

2 return varchar2

3 is

4 valorretornado varchar2(20);

5 begin

6 valorretornado:='';

7 if avalor<=20 then

8 valorretornado:='economico';

9 else valorretornado:='costoso';

10 end if;

11 return valorretornado;

12 end;

13 /

Function created.

Page 39: Procedimientos y Triggers
Page 40: Procedimientos y Triggers

SQL> select nombre_producto, precio_venta, f_costoso(precio_venta) from productos;

Page 41: Procedimientos y Triggers

Triggers.TRIGGER EN ORACLE AGENDA DE EMPLEADOS ELIMINADOS

SQL> create table empleados_historial(id_empleado int, nombre varchar2(30), sala

rio number(10,2), telefono varchar2(20), usuario varchar2(20), fecha_borrado date);

Table created.

create trigger eliminar_empleados after delete on empleados

for each row

begin

insert into empleados_historial values(:old.id_empleado, :old.nombre, :old.salario, :old.telefono, user, sysdate);

end;

/

SQL> delete empleados where id_empleado=24;

1 row deleted.

SQL> select * from empleados_historial;

Page 42: Procedimientos y Triggers

0. TRIGER EN MYSQL AGENDA DE EMPLEADOS ELIMINADOS1. Mysql> create table empleados_historial(id_empleado int, nombre varchar2(30), sala2. rio number(10,2), telefono varchar2(20), usuario varchar2(20), fecha_borrado date);3. Table created.4. create trigger eliminar_empleados after delete on empleados5. for each row6. begin7. insert into empleados_historial values(old.id_empleado, old.nombre, old.salario,

old.telefono, user, current_date);8. end;9. /

Page 43: Procedimientos y Triggers

1.- crear una bitácora sobre las modificaciones que se realizan en los salarios y comisiones de los empleados

SQL> create table modificaciones(id_empleado int, salario number(10,2), comision number(38), usuario varchar2(30));

Table created.

SQL> create or replace trigger modificar after update of salario, comision on empleados

2 for each row

3 begin

4 insert into modificaciones values(:old.id_empleado, :old.salario, :old.comision, user);

5 end;

6 /

Trigger created.

SQL> update empleados set salario=2500 where id_empleado=45;

1 row updated.

SQL> select * from modificaciones;

Page 44: Procedimientos y Triggers
Page 45: Procedimientos y Triggers

2.- Realizar un trigger que cuando se venda (inserción en detalle de ventas) se actualice el total de ventas

SQL> create or replace trigger actualiza after insert on detalle_ventas

2 for each row

3 begin

4 update ventas set total_pagar=(select sum(cantidad_vendida*precio_venta) fr

om productos join detalle_ventas on detalle_ventas.id_productos=productos.id_pro

ductos where detalle_ventas.id_ventas=:new.id_ventas) where id_ventas=:new.id_ve

ntas;

5 end;

6 /

Page 46: Procedimientos y Triggers
Page 47: Procedimientos y Triggers

3.-verificar que los empleados sean mayores de edad

SQL> create or replace trigger empleado_mayor before update or insert of fecha_n

to on empleados

2 for each row

3 declare

4 edad number;

5 begin

6 select months_between(SYSDATE, :new.fecha_nto)/12 into edad from dual;

7 if edad<18 then

8 raise_application_error(-20130,'El empleado es Menor de Edad');

9 end if;

10 end;

11 /

Trigger created.

SQL> update empleados set fecha_nto='05/12/1999';

Page 48: Procedimientos y Triggers

4.- evitar que se repita la inserción de un producto (en el nombre)

SQL> create or replace trigger repita_nombre before update or insert of nombre_p

roducto on productos

2 for each row

3 begin

4 for x in (select nombre_producto from productos)

5 loop

6 if upper(:new.nombre_producto)=upper(x.nombre_producto) then

7 raise_application_error(-20110,'El nombre del producto se ha repetido intentelo nuevamente');

8 end if;

9 end loop;

10 end;

11 /

Trigger created.

SQL> insert into productos (id_producto, nombre_producto) values (14, 'Playeras');