Triggers - Funcoes e Procedimentos - Duvidas

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
overkillpt
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Qua, 25 Mai 2011 6:55 pm
Localização: Portugal

Boas ,

Estou com umas duvidas na resoluçao de um exercicio , e depois de visualizar este site resolvi em perguntar se me podem ajudar ou explicar como faço isto .

Tenho as tabelas :

Apartamento (cod_espaço, cod_condomino FK , num_apartamento, valor_mensalidade, num_metros_quadrados, cod_proprietario FK)
-----------------------------------------------------------------------------------
Condominio (cod_condominio, morada_edificio, local, NIB, saldo_conta)
-------------------------------------------------------------------------------------
Proprietário (cod_proprietario, nome, telefone)
-------------------------------------------------------------------------------------
Factura (cod_espaço FK, mês, ano, cod_proprietario FK, valor, data_limite_pagamento, data_pagamento)
-------------------------------------------------------------------------------------
Despesa (cod_despesa, cod_condominio FK, valor, data, tipo_despesa)
-------------------------------------------------------------------------------------
Já as criei em SQL Plus e até aqui tudo bem , mas agora vêm o mais dificil :

Crie um trigger sobre a tabela DESPESAS que:
a) Não permita efectuar uma despesa (da tabela DESPESAS) se o valor do saldo da conta (tabela CONDOMINIO) não chegar para cobrir a despesa. Utilizar excepções.
b) Actualizar o saldo da conta se a despesa de concretizar.


Criar um procedimento que aceite o código, mês e ano para as facturas de todos os apartamentos do respectivo condomínio no mês e ano em apreço. Data limite de pagamento ficaram será o ultimo dia do mês , data de pagamento ficara nula ate ao acto da entrega.


Criar função “CALCULAR_DIVIDA” que aceite o código do proprietário e devolva o valor em divida do mesmo.

Criar um procedimento que utilize a função para escrever para a tabela mensagem o nome dos proprietários e os valores em divida dos mesmos.

Criar um trigger para forçar a inserção ou actualização do número de metros na tabela apartamento

Alguém me pode explicar ou ajudar com este exercicio ?!

Obrigado
overkillpt
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Qua, 25 Mai 2011 6:55 pm
Localização: Portugal

O 1º Trigger seria assim ?!

Selecionar tudo

CREATE OR REPLACE TRIGGER DespesasT

BEFORE INSERT OR UPDATE ON Despesa

FOR EACH ROW

DECLARE

                excepcao EXCEPTION;

BEGIN

                SELECT saldo_conta INTO saldoactual FROM Condominio

                               WHERE condominio.cod_condominio:=NEW.cod_condominio

 

                IF (NEW.valor > saldoactual)

                               RAISE excepcao;

                END IF;

                UPDATE Condominio

                set saldo_conta:=saldo_conta-saldoactual

                WHERE condominio.cod_condominio:=NEW.cod_condominio;

                EXCEPTION

                               WHEN excepcao THEN

                                               RAISE_APPLICATION_ERROR(-20000,'O Saldo da Conta não permite a compra');

               END/
diego_amoroso
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Qua, 07 Jul 2010 2:53 pm
Localização: Americana - SP
Diego Amoroso
Programador pl/sql
diego.amoroso@yahoo.com.br

Boa tarde,
Segue abaixo algumas respostas, não testei pois estou escrevendo direto aqui na tela, qualquer coisa, responde aee, rs =]
As que não fiz é porque não entendi o que você queria, hehe! falou!

CREATE OR REPLACE TRIGGER trg_despesas
BEFORE INSERT OR UPDATE ON despesa
FOR EACH ROW
DECLARE
v_saldo_atual number;
BEGIN
SELECT saldo_conta
INTO v_saldo_atual
FROM condominio
WHERE cod_condominio = :new.cod_condominio;

IF (new.valor > v_saldo_atual)
raise_application_error(-20100, 'Saldo insuficiente!');
END IF;

UPDATE condominio
SET saldo_conta := saldo_conta - v_saldo_atual
WHERE cod_condominio = :new.cod_condominio;

EXCEPTION
WHEN NO_DATA_FOUND THEN
raise_application_error(-20100, 'Valor não encontrado!');
END;


CREATE OR REPLACE FUNCTION fnc_calcular_divida(p_codigo number)
RETURN NUMBER IS
v_valor number;
BEGIN
--Irá trazer o valor da fatura que não foi pago ainda
SELECT NVL(SUM(valor), 0)
INTO v_valor
FROM factura
WHERE cod_proprietario = p_codigo
AND data_pagamento IS NULL;

RETURN v_valor;
END;


CREATE OR REPLACE TRIGGER trg_apartamento
BEFORE INSERT OR UPDATE ON Apartamento
FOR EACH ROW
BEGIN
IF :new.num_metros_quadrados IS NULL THEN
RAISE_APPLICATION_ERROR(-20100, 'Obrigatório informar os metros quadrados!');
END IF;
END;
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante