- Este tópico contém 4 respostas, 2 vozes e foi atualizado pela última vez 14 anos, 9 meses atrás por
Anônimo.
-
AutorPosts
-
27 de maio de 2011 às 3:03 pm #99409
Anônimo
Boas malta sou novo por aqui ,
Estou com umas duvidas na resoluçao de uns exercicios , e depois de visualizar este vosso forum 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 ..Exercicio 1 :
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.Ficaria algo assim ?!
CREATE OR REPLACE TRIGGER DespesasTBEFORE 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/
Exercicio 2 :
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.Exercicio 3 :
Criar função “CALCULAR_DIVIDA” que aceite o código do proprietário e devolva o valor em divida do mesmo.Exercicio 4 :
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. [/i][/u]27 de maio de 2011 às 5:09 pm #99416Ishii
ParticipanteOlá,
Basicamente tem uns pontos no código a serem revisados…
1) Criar a variável saldoactual no corpo da trigger;
2) A conta correta seria:UPDATE Condominio
set saldo_conta:=saldo_conta-:new.valor
WHERE condominio.cod_condominio:=NEW.cod_condominio;
Pois o campo Despesa.valor deve atualizar o saldo, correto?
3) Melhor revisar a codificação, pois podem ocorrer erros na compilação.
No mais, coloque os erros que por ventura ocorram aqui para que possamos te ajudar!
[]s Ishii
27 de maio de 2011 às 5:39 pm #99420Anônimo
Obrigado pela sua ajuda Ishii ,
A variavel criei em Declare a seguir a Exception :
saldoactual NUMBER;
pode ser assim ou seria algo saldoactual%ROWTYPE ?!
Já agora deixo aqui as tentativas de resolução do exercicio 2 e 3 .
Exercicio 2 :
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.
CREATE OR REPLACE PROCEDURE EX2(Codigo IN NUMBER, Mes IN NUMBER, ANO IN NUMBER)IS
CURSOR C_ApartamentosComCondominio (COD NUMBER) IS SELECT COD_Espaco,Cod_proprietario,valor_mensalidade from Apartamentos where cod_condomino=COD;BEGIN
OPEN C_ApartamentosComCondominio(Codigo); FETCH C_ApartamentosComCondominio INTO CondominoApartamento; WHILE C_ApartamentosComCondominio%FOUND THEN INSERT INTO FACTURA VALUES (CondominoApartamento.Cod_ESpaco, Mes, Ano, CondominoApartamento.Cod_proprietario, CondominoApartamento. valor_mensalidade, LAST_DAY(TO_DATE(ANO & '/' & MES &'/01','YYYY/MM/DD')),NULL); FETCH C_ApartamentosComCondominio INTO CondominoApartamento; END LOOP; CLOSE C_ApartamentosComCondominio;END;
/
Exercicio 3 :
Criar função “CALCULAR_DIVIDA” que aceite o código do proprietário e devolva o valor em divida do mesmo.
Assumi que o significado do pagamento não existir é o campo data_pagamento ser null …..
CREATE OR REPLACE FUNCTION CALCULAR_DIVIDA (COD in Number)RETURN NUMBER
IS
BEGIN
SELECT SUM(VALOR) into Valor FROM FACTURA WHERE COD_PRORIATARIO=COD and data_pagamento is null RETURN (Valor);END CALCULAR_DIVIDA;
/
[/code]27 de maio de 2011 às 6:05 pm #99421Ishii
ParticipanteOlá,
Está correto: saldoactual NUMBER;
Com relação a procedure e a function, aparentemente, (pois não testei…) estão ok. Somente o teste poderá validar mesmo isso.
[]s Ishii
27 de maio de 2011 às 8:26 pm #99422Anônimo
Obrigado ! Neste computador não possuo instalado o oracle deixo aqui as tabelas , caso seja util ..
create table Apartamento (cod_espaco NUMBER(2) primary key, num_apartamento NUMBER(5), num_metros_quadrados NUMBER(10), foreign key (cod_condominio) references Condominio(cod_condominio), foreign key (cod_proprietario) references Proprietario(cod_proprietario), valor_mensalidade NUMBER(12)); create table Condominio (cod_condominio NUMBER(2) primary key, morada VARCHAR(), edificio VARCHAR(10), local VARCHAR(10), NIB NUMBER(10), saldo_conta NUMBER(10)); create table Proprietario (cod_proprietario NUMBER(2) primary key, nome VARCHAR(), telefone VARCHAR(10)); create table Factura (cod_espaco NUMBER(2) primary key, mes NUMBER(), ano NUMBER(), local VARCHAR(10), NIB NUMBER(10), foreign key (cod_proprietario) references Proprietario(cod_proprietario), foreign key (cod_espaco) references Apartamento(cod_espaco), valor NUMBER(), data_limite_pagamento DATE(), data_pagamento DATE()); create table Despesa (cod_despesa NUMBER(2) primary key, foreign key (cod_condominio) references Condominio(cod_condominio), valor NUMBER(), data DATE(1), tipo_despesa VARCHAR()); -
AutorPosts
- Você deve fazer login para responder a este tópico.