Jump to content
Fórum Script Brasil
  • 0

Laço no MySQL


Joca Baldini

Question

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 to comment
Share on other sites

1 answer to this question

Recommended Posts

  • 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652.1k
×
×
  • Create New...