Ir para conteúdo

Arquivado

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

Dino César Vitória

Problemas com cursor simples

Recommended Posts

Pessoal, estou com um problema em um cursor bem simples. Ele simplesmente não sai do primeiro loop. Uso cursor no Oracle, mas não consegui nada que me iluminasse quanto a esse problema. Alguma luz? Segue o cursor para avaliação:

 

 

BEGIN DECLARE @COD_EMPRESA INTEGER;

 DECLARE @COD_FUNCAO INTEGER;
 DECLARE @NRO_ASO INTEGER;
 DECLARE @ID_FUNCIONARIO INTEGER;
 DECLARE @ID_EXAME INTEGER;
 DECLARE @VALOR FLOAT;

 DECLARE ASO
CURSOR
FOR
SELECT COD_EMPRESA,
       COD_FUNCAO,
       NRO_ASO,
       ID_FUNCIONARIO
FROM TB_ASO;

 OPEN ASO FETCH NEXT
FROM ASO INTO @COD_EMPRESA,
              @COD_FUNCAO,
              @NRO_ASO,
              @ID_FUNCIONARIO;

 WHILE @@FETCH_STATUS = 0 BEGIN DECLARE EXAMES
CURSOR
FOR
SELECT ID_EXAME,
       VALOR
FROM TB_FUNCAOEXAMECOMPLEMENTAR
WHERE COD_FUNCAO = @COD_FUNCAO
  AND COD_EMPRESA = @COD_EMPRESA;

 OPEN EXAMES;

 FETCH NEXT
FROM EXAMES INTO @ID_EXAME,
                 @VALOR;

 WHILE @@FETCH_STATUS = 0 BEGIN
INSERT INTO TB_ASO_EXAMES ( NRO_ASO, COD_FUNCAO, COD_EMPRESA, ID_FUNCIONARIO, ID_EXAME, VALOR )
VALUES ( @NRO_ASO,
         @COD_FUNCAO,
         @COD_EMPRESA,
         @ID_FUNCIONARIO,
         @ID_EXAME,
         @VALOR) END ;

 FETCH NEXT
FROM EXAMES INTO @ID_EXAME,
                 @VALOR ;

 END;

 CLOSE EXAMES;
 DEALLOCATE EXAMES;

 FETCH NEXT
FROM ASO INTO @COD_EMPRESA,
              @COD_FUNCAO,
              @NRO_ASO,
              @ID_FUNCIONARIO ;

 END;

 CLOSE ASO;
 DEALLOCATE ASO;

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Dino César Vitória,

 

Ao invés de cursor, porque não utiliza um while:

http://adjuniordba.wordpress.com/2013/07/04/while-para-cursores/

 

Aqui tem alguns exemplos do uso:

http://msdn.microsoft.com/pt-br/library/ms180169(v=sql.100).aspx

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado A.Jr mas gostaria de algo mais profissional e garantido, pois dentro do cursor posso consistir a PK. Na trigger ok, o cursor funciona muito bem.

 

Mas obrigado mesmo assim.

Tanto o cursor como o While funcionam.

Trabalhei em empresas em que o uso do Cursor era proibido. Ele onera a leitura de disco (I/O), swap, memória e ainda "loca" as tabelas envolvidas durante seu processo.

 

Em treinamentos que ministro eu demonstro as diferenças entre os dois, em relação a tempo de execução, uso do servidor entre outros parâmetros. Existem diversos documentos que também demostram esta diferença.

 

Então se precisa de algo mais profissional e garantido sugiro usar o while, mas observando a lógica e o resultado final. Nenhuma mudança é fácil em estrutura de T-SQL, mas muitas são muito bem vindas.

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.