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

Problema stored procedure com cursor


RDC

Pergunta

Pessoal,

Preciso de ajuda. Estou com um problema: Preciso popular algumas tabelas com os dados presente em outra trabela. Decidi fazer uma stored procedure utilizando cursor. Está funcionando, porém ele duplica a última linha, ou seja, sempre insere a última linha da primeira tabela duplicado na tebela que quero popular. Já coloquei o WHILE do=0 DO ... END WHILE; porém acontece o mesmo erro.

Alguém sabe como resolver este problema?

Obrigado

DELIMITER $$

DROP PROCEDURE IF EXISTS `teste_cursor` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `teste_cursor`()
BEGIN
  DECLARE data_cadastramento date;
  DECLARE telefone varchar(100);
  DECLARE pront varchar(20);
  DECLARE num varchar(100);
  DECLARE done INT UNSIGNED DEFAULT 0;
  DECLARE c_cursor CURSOR FOR SELECT DATA_INCLUSAO,TELEFONE,PRONTUARIO,NUMERO FROM todos;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;

  OPEN c_cursor;

  REPEAT
    FETCH c_cursor into data_cadastramento,telefone,pront,num;
    INSERT INTO cursor_t (Data_d,Telefone,prontuario,num) VALUES (data_cadastramento,telefone,pront,num);
  UNTIL done END REPEAT;

  CLOSE c_cursor;

END $$
DELIMITER;

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Oi, 'RDC'!

Sua solução estava duplicando a ultima linha porque a variável done ainda estava setada como false quando da leitura da última linha. Ela só é setada como true após tentar ler e não encontrar mais nenhum registro.

Substitua este trecho de código

REPEAT
    FETCH c_cursor into data_cadastramento,telefone,pront,num;
    INSERT INTO cursor_t (Data_d,Telefone,prontuario,num) VALUES (data_cadastramento,telefone,pront,num);
  UNTIL done END REPEAT;
por este
FETCH c_cursor into data_cadastramento,telefone,pront,num;
  WHILE not done DO
    INSERT INTO cursor_t (Data_d,Telefone,prontuario,num) VALUES (data_cadastramento,telefone,pront,num);
    FETCH c_cursor into data_cadastramento,telefone,pront,num;
  END WHILE;
Avaliando melhor sua procedure, vi que você não necessita de um controle de laço para fazer o que você quer. Então, estou propondo uma solução mais otimizada (mais rápida e mais eficiente) para sua srocedure. Modifique toda sua stored procedure para que fique assim:
DELIMITER $$

DROP PROCEDURE IF EXISTS `teste_cursor` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `teste_cursor`()
BEGIN
    INSERT INTO cursor_t (Data_d,Telefone,prontuario,num) 
    SELECT DATA_INCLUSAO,TELEFONE,PRONTUARIO,NUMERO FROM todos;
END $$
DELIMITER;

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

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