miércoles, 11 de enero de 2012

Clase 11/01/2012 Triggers

eca : Evento, condicion, Accion

El Evento que dispara la regla especificada, en Oracle puede ser:
Una instrucción INSERT, UPDATE, DELETE
Una instrucción CREATE, ALTER o DROP
Un arranque de la BD o detención de la instancia
Un inicio o fin de sesión por parte del usuario
Un mensaje de Error


Un trigger es un procedimiento. (pero especial)
- a diferencia que no resibe un parametro
- se ejecuta solo

propbando un triger

---primero creamos 2 tablas t4 y t5
CREATE TABLE T4 (a INTEGER, b CHAR(10));
CREATE TABLE T5 (c CHAR(10), d INTEGER);

---Creamos el trigger
CREATE TRIGGER trig1
AFTER INSERT ON T4
REFERENCING NEW AS newRow
FOR EACH ROW
WHEN (newRow.a <= 10)
BEGIN
INSERT INTO T5 VALUES(:newRow.b, :newRow.a);
END trig1;


---luego agregamos valores a la tabla t4
insert into t4 values(7,'asd')

Ahora segun las condiciones del triger revisamos la tabla t5 y revisamos que se agregaron los mismos valores

viernes, 6 de enero de 2012

clase viernes 06 de enero del 2012

TRABAJAMOS CREANDO PROCEDIMIENTO Y FUNCIONES

para aquellos empleados que tengan mas de 5 propiedades se le agrega un bono segun el parametro.
pare eso creamos lo sig.




-- creamos el procedimiento
create or replace procedure bono2012 (pNumempleado in empleado.NUMEMPLEADO%type, pBono numeric:= 0.01)

is
-- declaramos las variables a ocupar
vSalario empleado.salario%type;
vTotprop numeric;

begin

select salario into vSalario --selecionamos el salario y lo guardamos en vsalrio
from empleado
where numempleado = pNumempleado;

select count(*) into vTotprop -- contamos las propiedades de los empleados y lo guardamos en vTotprop
from propiedad
where numempleado = pNumempleado;

if vTotprop >= 5 then -- vemos si vtotpro es mayor o igual a 5
update empleado
set salario = salario + salario*pBono

where numempleado =pNumempleado; --- aca terminamos de actualizar los valores de los empleados segun el bono

dbms_output.put_line ('empleado'||pnumempleado||'bono'||pBono||'aumento'||vSalario*pBono); -- imprimimos el resultado

else
dbms_output.put_line ('empleado'||pNumempleado||'no aplico bono'); -- imprimimos si no hay resultados

end if;

end bono2012; -- cerramos procedimiento


APLICAMOS BONO A EMPLEADO SL21
begin
bono2012('SL21',pBono => 0.05);

end;





CREAMOS FUNCION CUENTA PROPIEDADES
create or replace function cuentapropiedades (pNumepleado empleado.numempleado%type)

return number
is
vTotprop numeric; -- declaramos variable VTotprop

begin
select count(*) into vTotprop
from propiedad
where numepleado = pNumempleado;
return vTotprop;


exception
when no_data_found then
return 0;
when others then
return 0;

end



LLAMAMOS A LA FUNCION

SELECT cuantapropiedades('SL21') FROM dual




--- CREAMOS FUNCION DONDE AL INGRESAR UN NUMERO ENTREGA LA SUMA DE LOS RESTOS
create or replace function sumadijito(pNumero in number)
return number
is

num_aux number;
suma number;

begin
num_aux :=pNumero;
suma := 0;
while num_aux > 0 loop
suma :=suma + mod(num_aux,10);
num_aux := trunc (num_aux/10);
end loop;
return suma;
end;

LLAMAMOS A LA FUNCION
select sumadijito(125) from dual -- ingresamos el numero 125 entregando como resultado 8

procedimiento 2 parametros entradas pbono y empleado

create or replace procedure bono2012 (pnumempleado IN empleado.NUMEMPLEADO%type, pbono numeric:= 0.01)
is
 vsalario empleado.salario%type;
 vtotprop numeric;
begin
select salario into vsalario
from empleado
where numempleado = pnumempleado;
select count (*) into vtotprop
from propiedad
where numempleado = pnumempleado;
if vtotprop >= 5 then
update empleado
set salario = salario + salario * pbono
where numempleado = pnumempleado;
dbms_output.put_line ('empleado '|| pnumempleado || 'bono' || pbono || 'aumento' || vsalario * pbono);
else 
dbms_output.put_line ('empleado' || pnumempleado || 'no aplico bono');
end if;
end;