DUVIDAS COM PROCEDURE MYSQL

FORMIGINHA 02/01/2012 22:26:56
#392309
Boa Noite galera!
Novamente venho pedir ajuda a vcs...

seguinte...

quero fazer uma PRC que retorne o seguinte resultado:

_______________________
| Mes | Valor |
----------------------------------
| Janeiro | 1.000,00 |
| Fevereiro | 1.000,00 |
| Março | 1.000,00 |
| Abril | 1.000,00 |
| Maio | 1.000,00 |
| Junho | 1.000,00 |
| Julho | 1.000,00 |
| Agosto | 1.000,00 |
e assim até Dezembro

fiz esse select ele retorna exatamente o que preciso:

select MONTHNAME(tr.Vencimento) Mes,
(select sum(tra.Valor_Parcela)
from tab_receber tra
where MONTH(tra.Vencimento) = MONTH(tr.vencimento)
and YEAR(tra.vencimento)=YEAR(tr.vencimento))
from tab_receber tr
where YEAR(tr.vencimento)=2011
group by MONTHNAME(tr.Vencimento)
order by MONTH(tr.Vencimento)

POREM, esse select demora uns 20min para executar.... entao decidir uma fazer uma PRC...

BEGIN

DECLARE i INT DEFAULT 1;

while i < 12 do
select MONTHNAME(tr.Vencimento) Mes,
(select sum(tra.Valor_Parcela)
from tab_receber tra
where MONTH(tra.Vencimento) = i
and YEAR(tra.vencimento)= 2011
) Valor
from tab_receber tr
where MONTH(tr.vencimento)= i
and YEAR(tr.vencimento)= 2011
group by MONTHNAME(tr.Vencimento)
order by MONTH(tr.Vencimento);
SET i = i + 1;
end while;
END

essa PRC tbm retorna os dados que preciso, porem cada mes separado, devido ao While...

eu preciso que mostre o resultado como relatorio (tipo quando executa o select normal).

ai pensei nessa solução :

DECLARE i INT DEFAULT 1;
for
select MONTH(tr.Vencimento) Mes,
from tab_receber tr
where YEAR(tr.vencimento)= 2011
group by MONTHNAME(tr.Vencimento)
order by 1
into i;
do
begin
select sum(tra.Valor_Parcela) as Valor
from tab_receber tra
where MONTH(tra.Vencimento) = i
and YEAR(tra.vencimento)= 2011;
end;

porem no mysql não consigo executar, deve ter algum erro de sintax.. no firebird funciona.
alguem sabe como fazer um For Select no MYSQL ?

aguardo... t+
LROSSI 03/01/2012 08:37:55
#392322
no mysql vc chama a procedure dessa forma:

call <nome procedure> (<param1>, <param2>);

EX: call ProcessaConsulta();

se estiver dando erro, posta a msg ai pra podermos ajudar.
MGALDINO 03/01/2012 17:24:58
#392346
Uma opção que acredito que vai funcionar é...
Continue com seu primeiro while ... e de um insert em uma tabela temporaria, no final, de como retorno a tabela Temporaria.

--Cria Tabela Temporaria

Seu Select...
While ...
Begin
Insere na tabela temporaria...
end

--Retorno de Sua Procedure.. Tabela Temporaria
Select * From TempTabela









FOXMAN 03/01/2012 18:46:59
#392348
Formiguinha acho que se utilizar uma instrução direta possa funcionar....

Veja se funciona algo ae
Citação:


SELECT MONTHNAME(VENCIMENTO) AS MES,SUM(VALOR_PARCELA) AS VALOR
FROM TAB_RECEBER
WHERE YEAR(VENCIMENTO)=2011
GROUP BY MONTHNAME(VENCIMENTO)
ORDER BY MONTH(VENCIMENTO)



Manda essa tabela com os dados para meu email, ou via MP para eu dar uma olhada....



FORMIGINHA 04/01/2012 10:52:29
#392372
LRossi, a chamada da PRC eu já havia feito, porem como eu disse acima... o retorno da PRC não vem todos os dados uma lista.. o resultado vem 1 em cada pagina de resultado... hj anoite eu posto prints pra vc entender melhor...

Magaldino, gostei da sua alternativa.. mas a PRC já nao seria como uma tabela temporario o retorno do seu resultado ??

FoxMann.. a base é grande pra mim postar.. posso postar aki o DDL e vc insere dados para testes, pode ser ?
KERPLUNK 04/01/2012 11:28:31
#392373
Você tem algumas possibilidades aí:
1 - Criar uma procedure específica para a soma por mês(que seria o parâmetro da função) e usá-la como campo da sua consulta
2 - Criar um cubo de dados(uma view) com os dados que vc quer. Views, costumam ser mais rápidas
3 - Fazer a soma de dados por subquery:
Select * From (Select Month(Vencimento) As Venc, (Select Sum(Valor_Parcela) From Tab_Receber Where Month(Vencimento) = Venc)) Group By Venc
MGALDINO 04/01/2012 15:47:40
#392407
Citação:

:
LRossi, a chamada da PRC eu já havia feito, porem como eu disse acima... o retorno da PRC não vem todos os dados uma lista.. o resultado vem 1 em cada pagina de resultado... hj anoite eu posto prints pra vc entender melhor...

Magaldino, gostei da sua alternativa.. mas a PRC já nao seria como uma tabela temporario o retorno do seu resultado ??

FoxMann.. a base é grande pra mim postar.. posso postar aki o DDL e vc insere dados para testes, pode ser ?



Então minha ideia foi voce criar uma tabela temporia é ja que seus resultado então sendo cada um em uma linha, era dar insert nessa tabela temporaria e no final [Ô]Select * From #Temporaria[Ô].

é uma solução mais simples porem um processamento maior, melhor seria vincular isso tudo em uma unico select.
FORMIGINHA 04/01/2012 22:17:04
#392427
Boa Noite...

consegui o resultado que eu precisava, mas acho q ainda da pra ficar melhor.... veja como fiz:

CREATE DEFINER='root'@'%.%.%.%' PROCEDURE 'Prc_Rel_Fat_Bol'(IN 'Ano' INT)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT [ô][ô]
BEGIN

DECLARE mes INT DEFAULT 1;
DECLARE i INT DEFAULT 0;
DECLARE vl decimal(10,2);
DECLARE cont INT DEFAULT 1;

declare laco cursor
for select MONTH(tr.Vencimento) Mes
from tab_receber tr
where YEAR(tr.vencimento)= Ano
group by MONTHNAME(tr.Vencimento)
order by MONTH(tr.Vencimento);

DECLARE CONTINUE HANDLER FOR NOT FOUND SET i = 1;

open laco;

repeat
fetch laco into mes;

if not i then
delete from tmp_faturamento;

while cont <= 12 do
insert into tmp_faturamento(mes, valor) values (cont, (select sum(tra.Valor_Parcela)
from tab_receber tra
where MONTH(tra.Vencimento) = cont
and YEAR(tra.vencimento)= Ano));
SET cont = cont + 1;
end while;

END IF;


UNTIL mes END REPEAT;
CLOSE laco;

END


Alguem propoe alguma melhoria ?

t+
Tópico encerrado , respostas não são mais permitidas