1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Ajuda em PL/SQL Oracle

Discussão em 'Programação' iniciada por freakdahouse, 18 de Dezembro de 2008. (Respostas: 7; Visualizações: 877)

  1. freakdahouse

    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
     
  2. Granadafeup

    Granadafeup Power Member

    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)
     
  3. Tomb4000

    Tomb4000 Power Member

    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.
     
  4. solidforms

    solidforms Power Member

    :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.
     
  5. Tomb4000

    Tomb4000 Power Member

    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.
     
  6. solidforms

    solidforms Power Member

    hum, tinha a sensação que so insere se fosse um after insert. Mas olha, ja aprendi mais uma coisita xD.

    Cumps ;).
     
  7. Karski

    Karski Power Member

    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.
     
  8. freakdahouse

    freakdahouse Power Member

    Brigadão pessoal, foram grande ajuda :D, já tou a ver como se utiliza os triggers :P
     

Partilhar esta Página