Em Qui, 2013-05-16 às 11:24 -0300, Erison Gmail escreveu:
> Bom dia amigos,
> Venho através deste pedir ajuda com documentação, e exemplos

[.. corte ..]

> Já fiz algumas outras funções mas estou com dificuldade em trabalhar com
> laços e resultados de consultas dentro da função
> 
> Exemplo,  selecionar todas as notas de uma turma, e para cada aluno fazer a
> media dele, e depois ao final a media da turma...


Talvez porque você esteja utilizando um martelo para pregar um parafuso.
Se o seu problema for um parafuso, a sua chave-de-fenda seria o SQL.


A maioria dos desenvolvedores acabam pensando na resolução dos problema
de maneira imperativa, mas quando você tem em sua mala de ferramentas
outros paradigmas é possível abrir mão dos 'for/while/if' e partir para
uma linguagem declarativa onde não importa "como" você quer e sim "o
quê" você quer.


Não sei quais são os padrões de trabalho que são impostos para você
nesta sua tarefa, entretanto, uma excelente alternativa seria utilizar
SQL.


Isto é um exemplo de algo que poderia funcionar para você:


alunos
------
cod     nome
1       JOAO
2       PEDRO
3       MARIA
4       MARCIA


turmas
------
sigla   nome
POR     PORTUGUES
MAT     MATEMATICA


alunos_matriculados
-------------------
cod_aluno       sigla_turma
1               POR
2               POR
3               POR
1               MAT
2               MAT
3               MAT
4               MAT


notas
-----
prova   cod_aluno       sigla_turma     valor
1       1               POR             10
1       2               POR             7
1       3               POR             9
2       1               POR             8
2       2               POR             8
2       3               POR             10
1       1               MAT             6
1       2               MAT             7
1       3               MAT             8
1       4               MAT             8


Uma consulta que poderia trazer alguns dados interessantes seria:

---
select 
        aluno.nome,
        turma.nome,
        nota.prova,
        avg(nota.valor) as media,
        max(nota.valor) as maior_nota_turma,
        min(nota.valor) as menor_nota_turma
from alunos_matriculados 
join alunos aluno 
  on (alunos_matriculados.cod_aluno = aluno.cod)
join turmas turma 
  on (alunos_matriculados.sigla_turma = turma.sigla)
join notas nota using (cod_aluno, sigla_turma)
group by aluno.nome, turma.nome, nota.prova;
---


Faça uns testes com SQL antes de partir para uma solução imperativa e
você terá menos problemas.


Veja que você poder fazer um laço no resultado dessa consulta [1] se
quiser.


[1]
http://www.postgresql.org/docs/current/static/plpgsql-control-structures.html#PLPGSQL-RECORDS-ITERATING


[]s
-- 
Dickson S. Guedes
mail/xmpp: [email protected] - skype: guediz
http://guedesoft.net - http://www.postgresql.org.br
http://www.rnp.br/keyserver/pks/lookup?search=0x8F3E3C06D428D10A

Attachment: signature.asc
Description: This is a digitally signed message part

_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a