DUVIDAS COM PROCEDURE MYSQL
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+
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+
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.
call <nome procedure> (<param1>, <param2>);
EX: call ProcessaConsulta();
se estiver dando erro, posta a msg ai pra podermos ajudar.
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
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
Formiguinha acho que se utilizar uma instrução direta possa funcionar....
Veja se funciona algo ae
Manda essa tabela com os dados para meu email, ou via MP para eu dar uma olhada....
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....
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 ?
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 ?
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
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
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.
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+
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