Ir para conteúdo
Fórum Script Brasil
  • 0

Laço no MySQL


Joca Baldini

Pergunta

Galera, sou iniciante no uso do MySQL e estou com um problema. Para ficar mais claro já aviso que uso o MySQL e Java.

O meu problema está nos relatório que geramos no nosso sistema. Os relatórios são feitos a partir de um comando feito em uma página .java que executa querys chamando métodos de algum DAO para gerar o resultado, depois insere os dados necessários nas colunas do relatório.

No relatório em questão (que tem 6 colunas no total) é executado um determinado método, esse método, primeiramente, executa um SELECT que tem como retorno determinadas colunas e cerca de 50 linhas. Duas dessas colunas serão inseridas diretamente no relatório e as outras quatro serão obtidas a partir da execução de quatro outros métodos que usam como parâmetro uma das colunas retornadas do primeiro método.

O problema é que é necessária a execução dos 4 métodos em cada linha do primeiro SELECT e usamos o ResultSet do mesmo e um laço no java para fazer isso. Mas fica muito demorado dessa forma (afinal, com 50 linhas de resultado no primeiro SELECT, são 200 consultas para gerar o relatório), portanto preciso de uma forma de gerar esse laço dentro do próprio SQL para que o tempo de execução fosse menor.

Espero ter sido claro e já agradeço quem puder ajudar.

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Ae moçada, dando uma pesquisada no assunto vi que com cursores eu consigo resolver meu problema.

Minha idéia é usar um cursor para fazer o primeiro select, inserir os dados desse select para uma tabela temporaria.

Depois usar outros 4 cursores para pegar os outros resultados que preciso e atualizar essa tabela.

Por último eu apenas pegava todo o conteúdo da tabela temporaria e gerava os relatórios.

Por enquanto meu código está assim:

<code>

DROP PROCEDURE IF EXISTS minhaProcedure;

delimiter |

CREATE PROCEDURE minhaProcedure()

BEGIN

DROP TABLE IF EXISTS `meuBD`.`TabelaTemp`;

CREATE TABLE `meuBD`.`TabelaTemp` (

`codigo` varchar(255) NOT NULL,

`razaoSocial` varchar(255) NOT NULL,

`idInt` int(10) unsigned NOT NULL,

`dataMax` date,

`total` double,

`quantidadeTotal` int(10) unsigned,

`custo` double

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

DECLARE @done INT DEFAULT 0;

DECLARE @cod VARCHAR(255);

DECLARE @rSocial VARCHAR(255);

DECLARE @idInt INT;

DECLARE @maxData DATE;

DECLARE @total DOUBLE;

DECLARE @qtdTotal INT;

DECLARE @custoTotal DOUBLE;

DECLARE curs1 CURSOR FOR(SELECT i.codigo, i.razaoSocial, i.idInstituicao FROM Instituicao i, Cliente c WHERE i.idInstituicao = c.idInstituicao AND i.bloqueado = 0 ORDER BY i.codigo);

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

OPEN curs1;

REPEAT

FETCH curs1 INTO @cod, @rSocial, @idInt;

IF NOT @done THEN

INSERT INTO TabelaTemp (codigo, razaoSocial, idInt) VALUES (@cod, @rSocial, @idInt);

END IF;

UNTIL @done END REPEAT;

CLOSE curs1;

END

|

DELIMITER;

</code>

Por enquanto estou apenas tentando inserir os dados do primeiro cursor na tabela temporária, mas dessa forma o MySQL Administrator (que estou usando pra testar) não roda dizendo que a procedure não existe (PROCEDURE minhaProcedure does not exist), se eu tiro o DROP diz que tem um erro de sintaxe (You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3).

Alguém tem alguma ideia?

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...