Ajuda em PL/SQL Oracle

freakdahouse

Power Member
Boas,

Tou com uma certa dificuldade em criar um trigger, é o seguinte:

Preciso de um trigger que impeça que um cliente possa ter mais do que 3 encomendas em estado aberto na empresa.

Tenho as seguintes tabelas, Encomendas (com cod encomenda,cod cliente, estado ), cliente ( cod cliente) que acho necessarias para o trigger, claro que cada uma tem mais dados, mas parecem-me os mais relevantes estes para isto.

Tks
 
Basta fazer um trigger na Encomendas.

Declaras o trigger antes do evento Insert
Fazes uma query para devolver o numero de linhas na tabela Encomendas, para um determinado user id
Se for 3 ou mais não permites a inserção (fazes um raise error por exemplo)
 
sim correcto.
se quiseres evitar o erro do raise, podes declarar tu a tua excepção e fazer um rollback.
algo assim:

Código:
create or replace
trigger nome_coiso
before insert on Encomendas
for each row
declare
num INTEGER;
minha_ex EXCEPTION;
begin
   select count(*) into num from Encomendas where cod_cliente= :NEW.cod_cliente;
   if ( num>3) then
      raise minha_ex;
   end if;
EXCEPTION
   WHEN minha_ex then
      ROLLBACK TO SAVEPOINT teu_save_point;
end;

tendo em atencao que antes de inserires tens que criar um savepoint com o nome que deres aqui.

Outra forma seria antes de inserires verificares quantos existem na tabela, penso que seria até a melhor forma.
 
:offtopic: Oracle é horrivel lol :007:. Então se me disseres que estás a usar o Forms Builder para desenvolver a interface gráfica atiro-me para o chão a chorar de pena.:D:offtopic:.

Hum, a resposta acima esta correcta mas talvez ficasse mais "elegante" se criasses por exemplo uma função que recebia como parametro um idCliente e retornava a contagem. Penso que é possível porque, se bem me lembro, fiz uma semelhante num trabalho. Desta forma atribuías o valor retornado pela função a uma variável e o resto ficava igual ;).

Não sei se o rollback produz algum efeito nessa situação :).

Cumps.
 
se nao tiver rollback, os números são sempre inseridos. assim também são inseridos, mas o rollback "retira-os", claro se a contagem for >3, alias no exemplo ate esta mal, terá que ser >2 :D.
 
Se o trigger fosse um "After Insert" não podias estar a ler da tabela para onde estás a escrever, visto que incorrias num Erro de Table is Mutating.
 
Back
Topo