sábado, 16 de enero de 2010

Oracle - Trigger y algunas cosas básicas

No es case sensitive.
No existe el: on update cascade.
Para crear una tabla:

create table Producto(
id number not null constraint d_pk primary key,
precio number,
stock number);

/*otra tabla*/
create table Pedidos(
idprod number not null,
unidades number,
foreign key (idprod) references producto(id));


Insertando a las tablas:

/*insertando a la tabla producto*/
insert into Producto values(1,350,10);

/*insertando a la tabla pedidos*/
insert into Pedidos values(1,8);


Haciendo Select en las tablas:

select * from Pedidos order by idprod asc;
select * from Producto order by id asc;
/*Esta última consulta nos mostrará el valor '10' en el campo 'stock' aún cuando ya
se ha hecho el pedido de '8' productos.*/


Lo ideal sería que cuando se hagan pedidos el numero de estos sea restado al campo 'stock' de la tabla Producto.

En ese caso podemos crear un trigger en el que especificaremos que cada vez que se haga un 'insert', un 'update' o un 'delete', el valor en el campo 'stock' de la tabla Poducto se actualize.

Creando el trigger 'calculastock':

create o replace trigger calculastock
after insert or delete or update
on Pedidos
for each row
begin
if(inserting or updating)
then
update Producto
set stock = stock - :new.unidades
where Producto.id = :new.idprod;
end if;
if(updating or deleting)
then
update Producto
set stock = stock + :old.unidades
where Producto.id = :old.idprod;
end if;
end;


Las variables 'old' y 'new' no necesitan declararse, son tipo tipo %ROWTYPE , y contienen una copia del registro 'antes'(old) y 'después'(new) de la acción sql(insert, update,delete).

2 comentarios: