miércoles, 11 de enero de 2012

Clase 7 - Miercoles 11 de Enero de 2012


TRIGGER
-------



Ejemplo de Creacion de trigger


CREATE [OR REPLACE] TRIGGER <trigger_name>    
  {BEFORE|AFTER} {INSERT|DELETE|UPDATE} ON <table_name>  
  [REFERENCING [NEW AS <new_row_name>] [OLD AS <old_row_name>]]
  [FOR EACH ROW [WHEN (<trigger_condition>)]]    
<trigger_body>



Ejercicio
---------


Creacion de tablas

CREATE TABLE T4 (a INTEGER, b CHAR(10));
CREATE TABLE T5 (c CHAR(10), d INTEGER);


Creacion de trigger asociado a la tablas T4 - T5
-------------------------------------------------

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;



Insertar informacion en tabla T4 para ejecutar trigger
-----------------------------------------------------

INSERT INTO T4 VALUES (4,5)




revisar tabla que fue poblada por trigger "trig1"
-------------------------------------------------

select * from t5;




Creacion Trigger 2
------------------


CREATE TRIGGER TopeDeManejoPropiedadEmpleado
BEFORE INSERT OR UPDATE ON Propiedad
FOR EACH ROW
DECLARE
  vcontP NUMBER;
BEGIN
SELECT COUNT(*) INTO vcontP
FROM Propiedad
WHERE numEmpleado = new.numEmpleado;
IF vcontP = 100
Raise_application_error(-2000, (‘Empleado ‘|| new.numEmpleado|| ‘ ya administra 100 propiedades’);
END IF
END




Creacion Trigger 3
-------------------


create table Person (age int);

CREATE TRIGGER PersonCheckAge
AFTER INSERT OR UPDATE OF age ON Person
FOR EACH ROW
BEGIN
IF (:new.age < 0) THEN
RAISE_APPLICATION_ERROR(-20000, 'no negative age allowed');

END IF;
END;

RUN;


Si intentamos ejecutar la inserción:

insert into Person values (-3);




Desactivando el trigger
-------------------------

Alter trigger PersonCheckAge disable;




Para ver una lista de los triggers definidos usar:
--------------------------------------------------

select trigger_name
from user_triggers;





Para eliminar un trigger se utiliza
------------------------------------
Drop trigger «nombre_trigger»;



Para desactivar un trigger se utiliza
-------------------------------------
Alter trigger «nombre_trigger» disable;



Para activar un trigger se utiliza
----------------------------------
Alter trigger «nombre_trigger» enable;



Para activar todos los trigger de una tabla se utiliza
------------------------------------------------------
Alter table «nombre_tabla» enable all triggers;

viernes, 6 de enero de 2012

Clase 6 - Viernes 6 de Enero de 2012

------------------------------------
:::: CREAR UN PROCEDIMIENTO :::
------------------------------------


CREATE OR REPLACE Procedure Bono2012(pNumEmpleado in Empleado.numempleado%type, pBono numeric:= 0.01)
Is
vSalario empleado.salario%Type;
vTotpropiedad numeric;

Begin

SELECT SALARIO into vSalario /* seguarda el salario en una variable */
FROM EMPLEADO
Where numempleado = pNumEmpleado;

/* Obtiene la cantidad de propiedades del empleado */
select count(*) into vTotpropiedad
From PROPIEDAD
Where numempleado = pNumEmpleado;


if vTotpropiedad >= 5 then
update EMPLEADO Set salario = salario * (1 + pBono)
Where numempleado = pNumEmpleado;

dbms_output.put_line('Empleado: ' || pNumEmpleado || ' Bono: ' || pBono || ' Aumento: ' || vSalario * pBono);
else
dbms_output.put_line('Empleado: ' || pNumEmpleado || ' no obtubo bono...');
end if;

End Bono2012;

*****************************************************************************
-> DEFINICIONES:

Parametro real: Es el valor que paso a mi funcion o procedimiento.
Ejemplo --> Bono2012('SL21')

Parametro formal: Es con el que defino la funcion o procedimiento
Ejemplo --> Bono2012(pNumEmpleado in Empleado.numempleado%type, pBono numeric:= 0.01)


*****************************************************************************


-> EJECUTAR PROCEDIMIENTO.
1.-
Begin
Bono2012('SL21'); /* sino se ingresa monto de bono se asume que es 0.01
end;

2.-
Begin
Bono2012('SL21', 006);
end;

3.-
Begin
Bono2012(pNumEmpleado =>'SL21');
end;


-> EJECUTAR PROCEDIMIENTO EN DISTINTOORDEN DE PARAMETROS.

1.-
Begin
Bono2012(pBono => 0.06, pNumEmpleado =>'SL21');
end;

2.-
Begin
Bono2012('SL21',pBono => 0.05);
end;


*****************************************************************************
*****************************************************************************
*****************************************************************************

------------------------------------
:::: CREAR UNA FUNCION :::
------------------------------------


create or replace function contar_propiedades(pNumEmpleado empleado.NumEmpleado%Type)
Return numeric IS

CantProp numeric;

Begin

Select Count(*) into CantProp
From Propiedad
Where NumEmpleado = pNumEmpleado;


Return CantProp;

Exception
When No_Data_Found Then
Return 0;
When others then
Return 0;

End contar_propiedades;


-> EJECUTAR UNA FUNCION:

1.- Select contar_propiedades('SL21') from dual;
2.-
Begin
dbms_output.put_line('la cantidad de propiedades es: ') || contar_propiedades('SL21');
End;


----> Crear function para sumar los digitos de un numero <------

Create or replace function suma_digitos(pnumero in numeric) return numeric is

num_aux numeric;
suma numeric;
Begin
num_aux:= pnumero;
While num_aux > 0 loop
suma:= + mod(num_Aux,10);
num_aux := trunc(num_aux / 10);
end loop;

Return suma;
End;