Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

_MANEL_

Ajuda em SQL, function, trigger, Store Procedure

Recommended Posts

_MANEL_

Boas. tou com um pequeno problema. tenho um trabalhito para fazer mas não pesco nada de SQL... se alguem pudesse ajudar agradecia muito ^^

Tendo esta BD:

asbdsk8.jpg

preciso de fazer isto: 

  • Uma Function que receba o Identificador do Aluno e Retorne a sua média
  • Uma Store Procedure que, com base no Identificador do Aluno e num Determinado Valor (Ex:
    9,5), retorne as Disciplinas superadas em função da classificação (Valor passado)
  • Um Trigger que seja disparada sempre que é colocada uma nova classificação / Actualização ou
    Eliminação.
    (Deverá actualizar a média do Aluno na Tabela Aluno e o contador de Classificações Lançadas na
    Tabela Disciplina)

Cumprimentos

Share this post


Link to post
Share on other sites
_MANEL_

bem. até agora fiz isto:

Create Function 
CalcularMedia(@Identificador int)
Returns 
float
As
Begin
Declare @avg float(8)
Select @avg=Media from Alunos Where IDAluno=@Identificador
Return @avg
End

Create Procedure DisciplinasSuperadas
@Identificador int, @valor_nota int
As
Select
	d.Descricao
From
	Classificacoes AS c INNER JOIN
	Disciplinas AS d ON c.IDDisciplina = d.IDDisciplina
Where
	c.IDClassificacao > @valor_nota
	AND c.IDAluno = @Identificador
	AND Data < GETDATE()

mas o trigger está-me a dar voltas à cabeça... não estou mesmo a conseguir fazer.

algum pro pode dar uma ajudinha?? :P

Share this post


Link to post
Share on other sites
nelsonpaixao

Oi manel,

apenas um pequeno conselho evita o campo média na tabela alunos como o diabo a cruz!!!

Sabes porque? porque é assim; tu tens procedimentos de edição (tipo adicionar/modificar/eliminar registos) e de relatório (obter dados e processa-los de alguma maneira).

Logo, se tu quiseres a média desencadeias uma SP qualquer que te das notas do teu aluno, ora a média não precisas de guardar na base de dados o que precisas de guardar são as notas ok?

Já vistes porque razão há-de guardar na base de dados a média se todas as vezes que adicionas uma nova nota vais ter de alterar a média também, adicionares apenas a nova nota basta-te para em qualquer altura obteres a media.

Se não tas a ver ainda o que digo vais ver por ti depois quando fizeres bases de dados mais complicados e tiveres de voltar ao inicio de quando em vez.

Mantem isso do id em cada tabela,a tabela classificações parace ok, o resto não tou a ver assim nada para dizer mas tambem não tenho assim a estrutura duma base de dados de escola.

Investe na estrutura importante, hás-de ter store_procedures + lógicas.

Boa sorte

Share this post


Link to post
Share on other sites
jsWizard

Ora bem.. isto não é bem uma ajuda, é mais um comentário :)

O Nelson não está totalmente correcto, mas anda lá perto! :P

Não precisas realmente de guardar a média por aluno porque é algo que podes sempre calcular "on the fly" com o registo das notas.

Portanto, uma query deste género deve dar o resultado pretendido:

SELECT a.idaluno, a.nome, avg(b.classificacao)
FROM alunos a LEFT JOIN classificacoes b ON a.idaluno = b.idaluno
WHERE a.idaluno = @aluno_xpto
GROUP BY a.idaluno, a.nome;

Ora, o uso da função de calculo da média tem o seu "custo" a nível de computação por parte da base de dados.. se estivesse-mos a falar de queries a retornar milhares ou milhões de resultados, poderias então pensar em optimizar esse calculo para poderes ter tempos de resposta mais curtos.

E aí então, poderias pensar em colocar esse calculo num trigger para te manter a média por aluno já calculada. Apesar de redundante, esse campo da média (é redundante porque pode ser calculado a qualquer altura), podia então fazer sentido. Já que o tal trigger iria manter a média já calculada sempre que houvesse uma alteração/inserção/eliminação de alguma nota de um determinado aluno. E como esse trigger ia estar a lidar com poucos registos (só com os de um determinado aluno), esse calculo iria ser muito mais rápido, e daí o ganho de performance.

Espero ter-me explicado bem.

Este processe de ter campos redundantes (já calculados) é conhecido por processo de desnormalização de uma base de dados.

Podes ler mais algumas coisas sobre isto, por exemplo, aqui:

http://database-programmer.blogspot.com/2008/04/denormalization-patterns.html

Espero ter ajudado, ou pelo menos, iluminado ou despertado a curiosidade :)

Inté!

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

×

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.