Jump to content
Sign in to follow this  
Del Castro

Ajuda Trigger em PL/SQL Oracle

Recommended Posts

Del Castro

Boas noites, estou com um problema a ao criar um trigger na minha base de dados em oracle

Basicamente o que se pretende que este trigger faça é que ao inserir um novo dado na tabela carrinho compras verifice se o valor está a ultrapassar os 99euros, e se tal acontecer dar um mensagem de erro ou aviso.

Tenho o seguinte código:

create or replace
TRIGGER trg_limitecc99
    before insert or update of id_sessao, id_pedido ON carrinhocompras 
for each row
DECLARE too_much EXCEPTION;         
valor number;
BEGIN 

        select sum(c.preco + b.preco) into valor
                            from Carrinhocompras cc 
                            inner join pedido p on p.id_pedido=cc.id_pedido
                            inner join conteudo c on c.id_conteudo=p.id_conteudo
                            inner join bilhetes b on b.id_bilhete=p.id_bilhete
                            where cc.id_sessao=:new.id_sessao;
        
    if valor is null  then
        select sum(c.preco) into valor
                            from Carrinhocompras cc 
                            inner join pedido p on p.id_pedido=cc.id_pedido
                            inner join conteudo c on c.id_conteudo=p.id_conteudo
                            where cc.id_sessao=:new.id_sessao;
    end if;
    
    if valor is null then
        select sum(b.preco) into valor
                            from Carrinhocompras cc 
                            inner join pedido p on p.id_pedido=cc.id_pedido
                            inner join bilhetes b on b.id_bilhete=p.id_bilhete
                            where cc.id_sessao=:new.id_sessao;    
    end if;
        
    IF valor>99 THEN 
        RAISE too_much; 
    END IF; 

EXCEPTION 
    WHEN too_much THEN 
        RAISE_APPLICATION_ERROR (-20001,'Valor do Carrinho ultrapassa valor limite de 99€'); 
END;

Os selects estao testados e estao a devolver valores do tipo number mas parece que sempre que introduzo um valor em que o trigger devia levantar a excepção, ele não actua.

Se alguem puder dar aqui uma olhada, uma vez que comecei a trabalhar neste ambiente á pouco tempo, agradecia alguma ajuda para ver se falta algo.

Obrigado pela atenção...

Share this post


Link to post
Share on other sites
M6

Creio que não necessitas de tantos selects.

Basta trocares os NULL por 0 no primeiro e o SUM nunca te dará NULL.

Quando ao erro de lógica vais ter de fazer debug para compreender onde está o bug.

Dado que é um trigger creio que não podes usar o DBMS_OUTPUT, dado que não tens STDOUT, mas podes criar uma tabela para debug onde vais escrevendo o que estás a fazer e o valor da variável valor, é o clássico "debug à lá printf"...


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
nruivo

Só uma pequena chamada de atenção:

O trigger que tens desenhado é um BEFORE, ou seja vai disparar antes de inserir na tabela, pelo que o valor actual não é somado ao que já existe no carrinho de compras.

Para evitares os erros com os NULLS sem fazeres grandes alterações podes sempre usar a função NVL().

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.