Ajuda em Procedure

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
LoadingXp
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 65
Registrado em: Sex, 30 Mar 2007 11:57 am
Localização: SP
Contato:
Att.

Luciano Alvarenga M. Pires
DBA ORACLE CERTIFICADO
http://fulloracle.blogspot.com
------------------------------------
Dinheiro é o combustivel da sociedade industrial. Mas na sociedade da informática o combustivel, o poder, é o conhecimento.

Pessoal criei uma procedure para atualizar uns dados a qual eu necessito.

Selecionar tudo

create or replace PROCEDURE SP_Ctr_ColetaVivoNetTemp AS

  v_idProcessoVivoNet       varchar2(700);
  v_RESP_CLIENTEREINC       varchar2(2000);

  CURSOR Cur_Perguntas is
   Select distinct IDPROCESSOVIVONET into v_idProcessoVivoNet 
   from COLETA_TEMP_PS20070508;
   
BEGIN
  OPEN Cur_Perguntas;
      LOOP
          FETCH Cur_Perguntas INTO v_idProcessoVivoNet;
          SELECT RESPOSTA into v_RESP_CLIENTEREINC FROM COLETA_TEMP_PS20070508
            WHERE PERGUNTA='CLIENTE É REINCIDENTE?'
            AND IDPROCESSOVIVONET = v_idProcessoVivoNet;
            DBMS_OUTPUT.PUT_LINE(v_RESP_CLIENTEREINC);
                        
          UPDATE COLETA_VIVONET_TEMP SET
            RESP_CLIENTEREINCIDENTE = TO_CHAR(v_RESP_CLIENTEREINC)
          WHERE IDPROCESSOVIVONET = v_idProcessoVivoNet;
          COMMIT;
          
          EXIT WHEN Cur_Perguntas%NOTFOUND;
      END LOOP;
      CLOSE Cur_Perguntas;
      
  EXCEPTION
            WHEN NO_DATA_FOUND THEN
            BEGIN
              DBMS_OUTPUT.PUT_LINE('Não encontrado informação');
            END;

END SP_Ctr_ColetaVivoNetTemp;
A mesma não retorna erro, mas tambem não atualiza, alguém teria alguma ideia do que seria???
Tem uma forma de eu debugar uma Procedure???

Abraços
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother,

Neste ponto, você não precisa dar o into:

Selecionar tudo

 CURSOR Cur_Perguntas is 
   Select distinct IDPROCESSOVIVONET into v_idProcessoVivoNet 
   from COLETA_TEMP_PS20070508; 
Correto:

Selecionar tudo

 CURSOR Cur_Perguntas is 
   Select distinct IDPROCESSOVIVONET 
   from COLETA_TEMP_PS20070508; 

Para debugar a procedure:

Coloque dbms_output.put_line nos pontos principais e, não se esqueça de verificar se o SET SERVEROUTPUT ON.

Pra debugar o Update, você consegue verificar se fez o Update ou não, com o SQL%NOTFOUND.

qualquer coisa, manda ai.
LoadingXp
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 65
Registrado em: Sex, 30 Mar 2007 11:57 am
Localização: SP
Contato:
Att.

Luciano Alvarenga M. Pires
DBA ORACLE CERTIFICADO
http://fulloracle.blogspot.com
------------------------------------
Dinheiro é o combustivel da sociedade industrial. Mas na sociedade da informática o combustivel, o poder, é o conhecimento.

Obrigadão Trevis!!!!

:D
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Outra forma de debugar é usar ferramentas avançadas, como PL/SQL Developer. etc
LoadingXp
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 65
Registrado em: Sex, 30 Mar 2007 11:57 am
Localização: SP
Contato:
Att.

Luciano Alvarenga M. Pires
DBA ORACLE CERTIFICADO
http://fulloracle.blogspot.com
------------------------------------
Dinheiro é o combustivel da sociedade industrial. Mas na sociedade da informática o combustivel, o poder, é o conhecimento.

Pessoal tentei, tentei mas não consegui...

Meu ultimo recurso é vir aqui antes de procurar na net, bater a cabeça, tomar um café, 2 ligações... Mas dessa vez to parado... Peço mais uma vez a ajuda dos meu amigos aqui...

Ainda continuo sem atualizar minha tabela, ele diz que não encontrou dado, teria alguma forma de ignorar isso. Pois toda vez que ele não encontra o dado ele cai no Exception

dando a seguinte mensagem

Selecionar tudo

    Connecting to the database GPM.
    Não encontrado informação
    Process exited.
    Disconnecting from the database GPM.
Segue abaixo o codigo fonte:

Selecionar tudo


create or replace PROCEDURE SP_Ctr_ColetaVivoNetTemp AS

  v_idProcessoVivoNet       varchar2(700);
  v_RESP_CLIENTEREINC       varchar2(2000);
  v_RESP_CLIENTENCONT       varchar2(2000); 
  v_RESP_HOUVECONTATO       varchar2(2000);
  v_RESP_DETALHESATIS       varchar2(2000);
  v_RESP_MOTIVOINSAT        varchar2(2000);
  v_RESP_COMENTARIOFI       varchar2(2000);
  v_RESP_SATISFACAOR        varchar2(2000);
  v_RESP_NOTAATENDIM        varchar2(2000);
  v_RESP_LINHACANC          varchar2(2000);
  

  CURSOR Cur_Perguntas is
   Select distinct IDPROCESSOVIVONET from COLETA_TEMP_PS20070508;
   
BEGIN
  OPEN Cur_Perguntas;
      LOOP          
          FETCH Cur_Perguntas INTO v_idProcessoVivoNet;
          
          SELECT RESPOSTA into v_RESP_CLIENTEREINC FROM COLETA_TEMP_PS20070508
            WHERE PERGUNTA='CLIENTE É REINCIDENTE?'
            AND IDPROCESSOVIVONET = v_idProcessoVivoNet;
          SELECT RESPOSTA into v_RESP_CLIENTENCONT FROM COLETA_TEMP_PS20070508
            WHERE PERGUNTA='CLIENTE NÃO CONTATADO'
            AND IDPROCESSOVIVONET = v_idProcessoVivoNet;
          SELECT RESPOSTA into v_RESP_HOUVECONTATO FROM COLETA_TEMP_PS20070508
            WHERE PERGUNTA='HOUVE CONTATO COM CLIENTE?'
            AND IDPROCESSOVIVONET = v_idProcessoVivoNet;
          SELECT RESPOSTA into v_RESP_DETALHESATIS FROM COLETA_TEMP_PS20070508
            WHERE PERGUNTA='DETALHE  DA INSATISFAÇÃO DO CLIENTE'
            AND IDPROCESSOVIVONET = v_idProcessoVivoNet;
          SELECT RESPOSTA into v_RESP_MOTIVOINSAT FROM COLETA_TEMP_PS20070508
            WHERE PERGUNTA='MOTIVO DA INSATISFAÇÃO:'
            AND IDPROCESSOVIVONET = v_idProcessoVivoNet;
          SELECT RESPOSTA into v_RESP_COMENTARIOFI FROM COLETA_TEMP_PS20070508
            WHERE PERGUNTA='COMENTARIO FINAL'
            AND IDPROCESSOVIVONET = v_idProcessoVivoNet;
          SELECT RESPOSTA into v_RESP_SATISFACAOR FROM COLETA_TEMP_PS20070508
            WHERE PERGUNTA='SATISFAÇÃO COM RESULTADO?'
            AND IDPROCESSOVIVONET = v_idProcessoVivoNet;
          SELECT RESPOSTA into v_RESP_NOTAATENDIM FROM COLETA_TEMP_PS20070508
            WHERE PERGUNTA='NOTA PARA O ATENDIMENTO'
            AND IDPROCESSOVIVONET = v_idProcessoVivoNet;
          SELECT RESPOSTA into v_RESP_LINHACANC FROM COLETA_TEMP_PS20070508
            WHERE PERGUNTA='LINHA CANCELADA?'
            AND IDPROCESSOVIVONET = v_idProcessoVivoNet;            
            
          UPDATE COLETA_VIVONET_TEMP SET
            RESP_CLIENTEREINCIDENTE = v_RESP_CLIENTEREINC,
            RESP_CLIENTECONTATADO = v_RESP_CLIENTENCONT, 
            RESP_HOUVECONTATOCLIENTE = v_RESP_HOUVECONTATO,
            RESP_DETALHEINSATISFACAO = v_RESP_DETALHESATIS, 
            RESP_MOTIVOINSATISFACAO = v_RESP_MOTIVOINSAT,
            RESP_COMENTARIOFINAL = v_RESP_COMENTARIOFI,
            RESP_SATISFACAORESULTADO = v_RESP_SATISFACAOR,
            RESP_NOTAATENDIMENTO = v_RESP_NOTAATENDIM,
            RESP_LINHACANCELADA = v_RESP_LINHACANC
          WHERE IDPROCESSOVIVONET = v_idProcessoVivoNet;
          

         
          EXIT WHEN Cur_Perguntas%NOTFOUND;
      END LOOP;
      CLOSE Cur_Perguntas;
      
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
          BEGIN
             DBMS_OUTPUT.PUT_LINE('Não encontrado informação');
          END; 
    
END SP_Ctr_ColetaVivoNetTemp ;

LoadingXp
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 65
Registrado em: Sex, 30 Mar 2007 11:57 am
Localização: SP
Contato:
Att.

Luciano Alvarenga M. Pires
DBA ORACLE CERTIFICADO
http://fulloracle.blogspot.com
------------------------------------
Dinheiro é o combustivel da sociedade industrial. Mas na sociedade da informática o combustivel, o poder, é o conhecimento.

Pessoal, desisti de fazer desse metodo, como eu tenho alguns id's que não tem a pergunta que eu procuro, mudei, mudei, até ir na Cultura consultar alguns livros eu fui... Mas tudo foi em vão...

Vou começar tudo do 0 criando 7 cursores dentro de uma procedure, acredito que seja mais facil, porem o desempenho deva ser mais elevado.

Vou deixar a ultima versão do codigo, caso alguém saiba de algo...

Selecionar tudo


create or replace 
 PROCEDURE SP_Ctr_ColetaVivoNetTemp AS

  v_Count numeric;
  i       numeric;
  v_idProcessoVivoNet       varchar2(700);
  v_RESP_CLIENTEREINC       varchar2(2000);
  v_RESP_CLIENTENCONT       varchar2(2000); 
  v_RESP_HOUVECONTATO       varchar2(2000);
  v_RESP_DETALHESATIS       varchar2(2000);
  v_RESP_MOTIVOINSAT        varchar2(2000);
  v_RESP_COMENTARIOFI       varchar2(2000);
  v_RESP_SATISFACAOR        varchar2(2000);
  v_RESP_NOTAATENDIM        varchar2(2000);
  v_RESP_LINHACANC          varchar2(2000);
  
  
  CURSOR Cur_Perguntas is
   Select distinct IDPROCESSOVIVONET from COLETA_TEMP_PS20070508;
   
BEGIN
  select count(1) into v_Count from (select distinct IDPROCESSOVIVONET from COLETA_TEMP_PS20070508) T;
  OPEN Cur_Perguntas;
  DBMS_OUTPUT.PUT('Dado:' || To_Char(v_Count));
  while i <= v_Count
  LOOP
          i:=i+1; 
          FETCH Cur_Perguntas INTO v_idProcessoVivoNet;
           SELECT RESPOSTA into v_RESP_CLIENTEREINC FROM COLETA_TEMP_PS20070508
            WHERE PERGUNTA='CLIENTE É REINCIDENTE?'
            AND IDPROCESSOVIVONET = v_idProcessoVivoNet;
          
          SELECT RESPOSTA into v_RESP_CLIENTENCONT FROM COLETA_TEMP_PS20070508
            WHERE PERGUNTA='CLIENTE NÃO CONTATADO'
            AND IDPROCESSOVIVONET = v_idProcessoVivoNet;
            
          SELECT RESPOSTA into v_RESP_HOUVECONTATO FROM COLETA_TEMP_PS20070508
            WHERE PERGUNTA='HOUVE CONTATO COM CLIENTE?'
            AND IDPROCESSOVIVONET = v_idProcessoVivoNet;
            
          SELECT RESPOSTA into v_RESP_DETALHESATIS FROM COLETA_TEMP_PS20070508
            WHERE PERGUNTA='DETALHE  DA INSATISFAÇÃO DO CLIENTE'
            AND IDPROCESSOVIVONET = v_idProcessoVivoNet;
            
          SELECT RESPOSTA into v_RESP_MOTIVOINSAT FROM COLETA_TEMP_PS20070508
            WHERE PERGUNTA='MOTIVO DA INSATISFAÇÃO:'
            AND IDPROCESSOVIVONET = v_idProcessoVivoNet;
            
          SELECT RESPOSTA into v_RESP_COMENTARIOFI FROM COLETA_TEMP_PS20070508
            WHERE PERGUNTA='COMENTARIO FINAL'
            AND IDPROCESSOVIVONET = v_idProcessoVivoNet;
            
          SELECT RESPOSTA into v_RESP_SATISFACAOR FROM COLETA_TEMP_PS20070508
            WHERE PERGUNTA='SATISFAÇÃO COM RESULTADO?'
            AND IDPROCESSOVIVONET = v_idProcessoVivoNet;
            
          SELECT RESPOSTA into v_RESP_NOTAATENDIM FROM COLETA_TEMP_PS20070508
            WHERE PERGUNTA='NOTA PARA O ATENDIMENTO'
            AND IDPROCESSOVIVONET = v_idProcessoVivoNet;
            
          SELECT RESPOSTA into v_RESP_LINHACANC FROM COLETA_TEMP_PS20070508
            WHERE PERGUNTA='LINHA CANCELADA?'
            AND IDPROCESSOVIVONET = v_idProcessoVivoNet;            
            
          UPDATE COLETA_VIVONET_TEMP SET
            RESP_CLIENTEREINCIDENTE = v_RESP_CLIENTEREINC,
            RESP_CLIENTECONTATADO = v_RESP_CLIENTENCONT, 
            RESP_HOUVECONTATOCLIENTE = v_RESP_HOUVECONTATO,
            RESP_DETALHEINSATISFACAO = v_RESP_DETALHESATIS, 
            RESP_MOTIVOINSATISFACAO = v_RESP_MOTIVOINSAT,
            RESP_COMENTARIOFINAL = v_RESP_COMENTARIOFI,
            RESP_SATISFACAORESULTADO = v_RESP_SATISFACAOR,
            RESP_NOTAATENDIMENTO = v_RESP_NOTAATENDIM,
            RESP_LINHACANCELADA = v_RESP_LINHACANC
          WHERE IDPROCESSOVIVONET = v_idProcessoVivoNet;
          COMMIT;
  END LOOP;
  CLOSE Cur_Perguntas;    
END SP_Ctr_ColetaVivoNetTemp ;


Avatar do usuário
Toad
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 253
Registrado em: Sex, 18 Nov 2005 2:14 pm
Localização: Seattle, WA
Contato:
Matheus Gonçalves
matheus.dev
twitter.com/developer__c

Analisando o código:

Selecionar tudo

SELECT RESPOSTA into v_RESP_LINHACANC FROM COLETA_TEMP_PS20070508
WHERE PERGUNTA='LINHA CANCELADA?'
AND IDPROCESSOVIVONET = v_idProcessoVivoNet;           


Toda vez que qualquer um desses selects não retorna dados, ele lança o exception:

Selecionar tudo

EXCEPTION WHEN NO_DATA_FOUND
Logo, se um deles, qualquer um deles, não retornar resultados, a exceção é lançada e os Updates não são acionados.

Aconselho você a fazer cursores e analisar, antes de atualizar, com:

Selecionar tudo

NOMEDOCURSOR%NOTFOUND.
Assim você consegue saber qual dos selects não está trazendo resultados.

Espero ter ajudado.
LoadingXp
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 65
Registrado em: Sex, 30 Mar 2007 11:57 am
Localização: SP
Contato:
Att.

Luciano Alvarenga M. Pires
DBA ORACLE CERTIFICADO
http://fulloracle.blogspot.com
------------------------------------
Dinheiro é o combustivel da sociedade industrial. Mas na sociedade da informática o combustivel, o poder, é o conhecimento.

Ahh é isso mesmo, pois alguns updates iram fallhar. Pois as vezes as perguntas não tem resposta. Ai as mesmas deram exception.

Eu consegui debugar com o Pl/SQL Developer e verifiquei a mesma...

Depois disso fiz o processo inverso, verifiquei qual dos ID', cuja a pergunta era a solicitada tinha resposta. Logo que ele pegava o valor ele fazia o Update na nova tabela com os dados invertidos...

Obrigadão a todos!
Responder
  • Informação