padremib 0 Denunciar post Postado Outubro 23, 2012 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
Motta 645 Denunciar post Postado Outubro 23, 2012 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
padremib 0 Denunciar post Postado Outubro 23, 2012 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: e Alguma dica? Obrigado. Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Outubro 23, 2012 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
padremib 0 Denunciar post Postado Outubro 23, 2012 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