Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

JohnyMoraes

[Resolvido] Como executar uma query dentro de uma string em store

Recommended Posts

Bom dia.

 

Como posso executar, dentro de uma stored, uma query que tenha sido armazenada em uma string ?

Tentei usar o Execute, mas me retorna erro.

 

Meu exemplo:

 

 

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_ChequesDevolvidos`(vDataInicio date, vDataFim date, vFiltroData bit)
BEGIN
/*
 RETORNA QUANTIDADE DE CHEQUES CADASTRADOS, SOMA DOS CHEQUES CADASTRADOS, QUANTIDADE DE CHEQUES DEVOLVIDOS, SOMA DOS CHEQUES DEVOLVIDOS  
 AGRUPADOS POR SEMANA NO PERÍODO DE TEMPO PASSADO POR PARÂMETRO.
*/
  DECLARE vSQL varchar(3000);

  SET vSQL = 'SELECT MES_ANO_CADASTRADOS,
         SEMANA_CADASTRADOS, 
         QTD_CADASTRADOS, 
         SOMA_CADASTRADOS,              
         MES_ANO_DEVOLVIDOS,
         SEMANA_DEVOLVIDOS,
         QTD_DEVOLVIDOS,
         SOMA_DEVOLVIDOS 
  FROM
   (
   SELECT CONCAT(MONTH(CHEQUE_DTCADASTRO), ''/'', YEAR(CHEQUE_DTCADASTRO)) as ''MES_ANO_CADASTRADOS'',
          CONCAT(YEAR(CHEQUE_DTCADASTRO), ''/'',WEEK(CHEQUE_DTCADASTRO)) as ''SEMANA_CADASTRADOS'', 
          COUNT(*) as ''QTD_CADASTRADOS'', 
          SUM(CHEQUE_VALOR) as ''SOMA_CADASTRADOS''
   FROM cheques';

   if vFiltroData=1 then
      SET vSQL = CONCAT(vSQL,' WHERE CHEQUE_DTCADASTRO BETWEEN vDataInicio AND vDataFim');
   end if;   

   SET vSQL = CONCAT(vSQL,' GROUP BY WEEK(CHEQUE_DTCADASTRO)
   )c left join 
   (
   SELECT CONCAT(MONTH(CHEQUE_DTDEVOLUCAO), ''/'', YEAR(CHEQUE_DTDEVOLUCAO)) as ''MES_ANO_DEVOLVIDOS'', 
          CONCAT(YEAR(CHEQUE_DTDEVOLUCAO), ''/'', WEEK(CHEQUE_DTDEVOLUCAO)) as ''SEMANA_DEVOLVIDOS'', 
          COUNT(*) as ''QTD_DEVOLVIDOS'',
          SUM(CHEQUE_VALOR) as ''SOMA_DEVOLVIDOS''
   FROM cheques');        

   if vFiltroData=1 then
       SET vSQL = CONCAT(vSQL,' WHERE CHEQUE_DTDEVOLUCAO BETWEEN vDataInicio AND vDataFim');
   end if;    

   SET vSQL = CONCAT(vSQL,'GROUP BY WEEK(CHEQUE_DTDEVOLUCAO)
   )a
   on c.SEMANA_CADASTRADOS = a.SEMANA_DEVOLVIDOS
   ORDER BY c.MES_ANO_CADASTRADOS;');    

   EXECUTE vSQL;    

END

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolvi da seguinte maneira:

 

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_ChequesDevolvidos`(strDataInicio varchar(18), strDataFim varchar(18), vFiltroData bool)
BEGIN
/*
 RETORNA QUANTIDADE DE CHEQUES CADASTRADOS, SOMA DOS CHEQUES CADASTRADOS, QUANTIDADE DE CHEQUES DEVOLVIDOS, SOMA DOS CHEQUES DEVOLVIDOS  
 AGRUPADOS POR SEMANA NO PERÍODO DE TEMPO PASSADO POR PARÂMETRO.
*/
   DECLARE vDataInicio DATE;     
   DECLARE vDataFim DATE;          

   /*     
   RECEBE A DATA NO FORMATO dd/mm/yyyy (02/10/2010) E TRANSFORMA NO PADRÃO DO MYSQL yyyy/mm/dd (2010/10/02)
   */    
   SET vDataInicio = STR_TO_DATE(strDataInicio, '%d/%m/%Y');  
   SET vDataFim = STR_TO_DATE(strDataFim, '%d/%m/%Y');    


   SET @st_select = 'SELECT MES_ANO_CADASTRADOS,
         SEMANA_CADASTRADOS, 
         QTD_CADASTRADOS, 
         SOMA_CADASTRADOS,              
         MES_ANO_DEVOLVIDOS,
         SEMANA_DEVOLVIDOS,
         QTD_DEVOLVIDOS,
         SOMA_DEVOLVIDOS,           
         ANOSEMANA_CADASTRADOS
   FROM
   (
   SELECT CONCAT(IF(MONTH(CHEQUE_DTCADASTRO)<=9,CONCAT(0,MONTH(CHEQUE_DTCADASTRO)),MONTH(CHEQUE_DTCADASTRO)), ''/'', YEAR(CHEQUE_DTCADASTRO)) as ''MES_ANO_CADASTRADOS'',
          CONCAT(YEAR(CHEQUE_DTCADASTRO), ''/'',WEEK(CHEQUE_DTCADASTRO)) as ''SEMANA_CADASTRADOS'', 
          COUNT(*) as ''QTD_CADASTRADOS'', 
          SUM(CHEQUE_VALOR) as ''SOMA_CADASTRADOS'',           
          YEARWEEK(CHEQUE_DTCADASTRO) as ''ANOSEMANA_CADASTRADOS''
   FROM cheques';

   if vFiltroData then
      SET @st_select = CONCAT(@st_select,' WHERE CHEQUE_DTCADASTRO BETWEEN "', vDataInicio, '" AND "',vDataFim,'"');
   end if;   

   SET @st_select = CONCAT(@st_select,' GROUP BY YEARWEEK(CHEQUE_DTCADASTRO)
   )c left join 
   (
   SELECT CONCAT(IF(MONTH(CHEQUE_DTDEVOLUCAO)<=9,CONCAT(0,MONTH(CHEQUE_DTDEVOLUCAO)),MONTH(CHEQUE_DTDEVOLUCAO)), ''/'', YEAR(CHEQUE_DTDEVOLUCAO)) as ''MES_ANO_DEVOLVIDOS'', 
          CONCAT(YEAR(CHEQUE_DTDEVOLUCAO), ''/'', WEEK(CHEQUE_DTDEVOLUCAO)) as ''SEMANA_DEVOLVIDOS'', 
          IF(FORMAT(COUNT(*),0)>0,COUNT(*),0) as ''QTD_DEVOLVIDOS'',
          SUM(CHEQUE_VALOR) as ''SOMA_DEVOLVIDOS''
   FROM cheques');        

   if vFiltroData then
       SET @st_select = CONCAT(@st_select,' WHERE CHEQUE_DTDEVOLUCAO BETWEEN "', vDataInicio, '" AND "',vDataFim,'"');
   end if;    

   SET @st_select = CONCAT(@st_select,' GROUP BY YEARWEEK(CHEQUE_DTDEVOLUCAO)
   )a
   on c.SEMANA_CADASTRADOS = a.SEMANA_DEVOLVIDOS
   ORDER BY c.SEMANA_CADASTRADOS;');    

   prepare st_select from @st_select;
   execute st_select;     
   DEALLOCATE PREPARE st_select;
END;

 

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.