Ir para conteúdo

Arquivado

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

padremib

[Resolvido] Cursor em Oracle?

Recommended Posts

Olá a Todos!

Gostaria de ajuda para fazer o cursor abaixo funcionar.

Tenho algumas parcelas que foram canceladas (10620 +/-), porém o sistema não colocou a data de cancelamento nas mesmas e eu preciso colocar a data de cancelamento igua à data de vencimento de cada uma delas.

Pequei exemplos de cursores aqui no iMasters mas não funcionou.

Em MSSql eu sei fazer mas "ORACLE NÃO É DE DEUS" e nem para quem acabou de sair da faculdade, como eu.

Segue o código que estou tentando fazer funcionar, alguém pode me ajudar?

 

CURSOR c_DATCANCTO IS
SELECT FLAN.CODCOLIGADA,
	   FLAN.IDLAN,
	   XPARCELAPAGAMENTO.NUM_VENDA,
	   XPARCELAPAGAMENTO.DAT_VCTO
FROM FLAN INNER JOIN
	  XPARCELAPAGAMENTO ON
	  FLAN.CODCOLIGADA = XPARCELAPAGAMENTO.CODCOLIGADA AND
  FLAN.IDLAN = XPARCELAPAGAMENTO.IDLAN	 	
WHERE FLAN.STATUSLAN = 2 AND
	  FLAN.DATACANCELAMENTO IS NULL AND
	  FLAN.CODAPLICACAO = 'X' AND
	  FLAN.HISTORICO LIKE 'RESÍDUO'
ORDER BY FLAN.CODCOLIGADA, FLAN.IDLAN;

vCODCOLIGADA c_DATCANCTO.CODCOLIGADA%TYPE
vIDLAN c_DATCANCTO.IDLAN%TYPE
vNUM_VENDA c_DATCANCTO.NUM_VENDA%TYPE
vDAT_CANCTO c_DATCANCTO.DAT_CANCTO%TYPE

BEGIN
OPEN c_DATCANCTO

LOOP
	FETCH c_DATCANCTO INTO vCODCOLIGADA, vIDLAN, vNUM_VENDA, vDAT_CANCTO;

	EXIT WHEN c_DATCANCTO%NOTFOUND;

	UPDATE FLAN
	SET FLAN.DATACANCELAMENTO = @DAT_CANCTO
	WHERE FLAN.CODCOLIGADA = @CODCOLIGADA AND
   	  FLAN.IDLAN = @IDLAN;

UPDATE XPARCELAPAGAMENTO
	SET XPARCELAPAGAMENTO.DATACANCELAMENTO = vDAT_CANCTO
	WHERE XPARCELAPAGAMENTO.CODCOLIGADA = vCODCOLIGADA AND
	  XPARCELAPAGAMENTO.IDLAN = vIDLAN;

END LOOP

CLOSE c_DATCANCTO
END

DEALLOCATE c_DATCANCTO

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oracle não é assim tão ruim ...

 

Tente assim :

 

BEGIN
FOR  c_DATCANCTO  IN ( SELECT FLAN.CODCOLIGADA,
		                   FLAN.IDLAN,
		                   XPARCELAPAGAMENTO.NUM_VENDA,
		                   XPARCELAPAGAMENTO.DAT_VCTO
					 FROM FLAN INNER JOIN
					          XPARCELAPAGAMENTO ON
					          FLAN.CODCOLIGADA = XPARCELAPAGAMENTO.CODCOLIGADA AND
					          FLAN.IDLAN = XPARCELAPAGAMENTO.IDLAN          
					 WHERE FLAN.STATUSLAN = 2 AND
					                  FLAN.DATACANCELAMENTO IS NULL AND
					                  FLAN.CODAPLICACAO = 'X' AND
					                  FLAN.HISTORICO LIKE 'RESÍDUO'
			 		ORDER BY FLAN.CODCOLIGADA, FLAN.IDLAN) 

LOOP

       UPDATE FLAN
       SET FLAN.DATACANCELAMENTO = c_DATCANCTO.DAT_CANCTO
       WHERE FLAN.CODCOLIGADA = c_DATCANCTO.CODCOLIGADA AND
         FLAN.IDLAN = c_DATCANCTO.IDLAN;

       UPDATE XPARCELAPAGAMENTO
       SET XPARCELAPAGAMENTO.DATACANCELAMENTO = c_DATCANCTO.DAT_CANCTO
       WHERE XPARCELAPAGAMENTO.CODCOLIGADA = c_DATCANCTO.CODCOLIGADA AND
                 XPARCELAPAGAMENTO.IDLAN = c_DATCANCTO.IDLAN;

END LOOP;		 
END;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, Motta!

Obrigado pelo auxílio!

Executei o código que você me passou mas agora dá o erro ORA-00650, dizendo que o componente C_DATCANCTO precisa ser delclarado.

Coloquei "BEGIN FOR CURSOR c_DATCANCTO" mas também não é isso.

Veja as imagens em anexo:

erroORA-06550_zps9dd345e0.jpg

e

declareCursor_zps706f292a.jpg

Alguma dica?

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A síntaxe é

 

for <nome do cursor> in (select)
loop
end loop;

 

Dentro do loop é tratato, ler próximo, fim etc.

A referência é <nome do cursor>.<campo do select> , talvez aqui você deva trocar DAT_CANCTO por DAT_VCTO

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta,

Uns amigos me ensinaram a simplificar a solução para o update em várias linhas das tabelas que eu precisava.

Vou postar aqui mas, seria legal aprender a fazer um cursor funcionar em Oracle.

Segue as sintaxes:

UPDATE FLAN
  	SET FLAN.DATACANCELAMENTO = (SELECT XPARCELAPAGAMENTO.DAT_VCTO
                                FROM FLAN A1 INNER JOIN XPARCELAPAGAMENTO ON
										A1.CODCOLIGADA = XPARCELAPAGAMENTO.CODCOLIGADA AND
                                           A1.IDLAN = XPARCELAPAGAMENTO.IDLAN          
				             WHERE FLAN.STATUSLAN = 2 AND
					         A1.DATACANCELAMENTO IS NULL AND
					         A1.CODAPLICACAO = 'X' AND
					         FLAN.CODCOLIGADA = A1.CODCOLIGADA AND
					         FLAN.HISTORICO LIKE 'RESÍDUO' AND /*comentar se for incluir todos os tipos de histórico*/
					         FLAN.IDLAN = A1.IDLAN)
WHERE FLAN.STATUSLAN = 2 AND
     FLAN.DATACANCELAMENTO IS NULL AND
  FLAN.CODAPLICACAO = 'X';

COMMIT;


UPDATE XPARCELAPAGAMENTO
	SET XPARCELAPAGAMENTO.DATACANCELAMENTO = XPARCELAPAGAMENTO.DAT_VCTO
WHERE EXISTS (SELECT 1
             FROM FLAN INNER JOIN
                  XPARCELAPAGAMENTO X1 ON
				 FLAN.CODCOLIGADA = X1.CODCOLIGADA AND
                    FLAN.IDLAN = X1.IDLAN          
		  WHERE FLAN.STATUSLAN = 2 AND
		  	    FLAN.DATACANCELAMENTO IS NULL AND
				FLAN.CODAPLICACAO = 'X' AND
				X1.NUM_VENDA = XPARCELAPAGAMENTO.NUM_VENDA AND
				X1.COD_TIPO_PARC = XPARCELAPAGAMENTO.COD_TIPO_PARC AND
				X1.NUM_PARC = XPARCELAPAGAMENTO.NUM_PARC AND
				FLAN.HISTORICO LIKE 'RESÍDUO' AND /*comentar se for incluir todos os tipos de histórico*/
				X1.COD_GRUPO = XPARCELAPAGAMENTO.COD_GRUPO);

COMMIT;

 

Obrigado pela atenção. :thumbsup:

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.