Como validar UTL

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
mariogus
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 157
Registrado em: Sex, 30 Nov 2007 1:17 pm
Localização: Porto Alegre - RS

Pessoal,

Não estou conseguindo efetuar os updates...não sei em que parte do bloco está com problemas....pode ser problema de sintaxe ou lógica

Selecionar tudo

hdr_arq       UTL_FILE.file_type;
  v_forn_arq     VARCHAR2(100);
  v_forn_buffer  VARCHAR2(4000);
  v_tipo_forn    VARCHAR2(1);
  v_cpf          corp.pessoas.nr_cpf%type;

  BEGIN
     ---
     v_forn_arq   := 'for'||to_char(sysdate,'ddmmrrrr')||'999999.ret';
    
     hdr_arq := UTL_FILE.fopen('DIR',
                               v_forn_arq,
                               'r');
     
     BEGIN
        ---
        LOOP
          UTL_FILE.get_line(hdr_arq, v_forn_buffer);
          v_tipo_forn := itg_splitstring(v_forn_buffer, ';', 24);
          --Busca o tipo de fornecedor(fisica/juridica)
          
          IF v_tipo_forn ='J' THEN
              
              --JURIDICA
            
              v_cpf := LPAD(TRIM(itg_splitstring(v_forn_buffer, ';', 5)),14,0);
          
              BEGIN
                   UPDATE corp.pessoas
                      SET
                        cd_forncedor_onf = LPAD(TRIM(itg_splitstring(v_forn_buffer, ';', 2)),5,0),
                        dt_atualizacao   = sysdate
                   WHERE LPAD(TRIM(nr_cpf),14,'0')= v_cpf;
                   COMMIT;
              EXCEPTION
                 WHEN OTHERS THEN
                  GERA_LOG_PRC('x',
                                      'xxx',
                                      'FORN.: '||TRIM(itg_splitstring(v_forn_buffer, ';', 2)) ||' NÃO ENCONTRADO - SQLCODE: '||sqlcode || ';  SQLERRM: '||sqlerrm ||
                                      ' ; CNPJ/CPF: ' ||TRIM(itg_splitstring(v_forn_buffer, ';', 5)) ||
                                      ' ; TIPO: ' ||TRIM(itg_splitstring(v_forn_buffer, ';', 24)) ||
                                      ' ; RAZAO_SOCIAL: ' ||TRIM(itg_splitstring(v_forn_buffer, ';', 3)));
              END;

          ELSE
              -- FISICA
              
              v_cpf := LPAD(TRIM(itg_splitstring(v_forn_buffer, ';', 5)),11,0);
              --
              
              BEGIN
                  --
                 UPDATE corp.pessoas
                    SET
                      cd_forncedor_onf = LPAD(TRIM(itg_splitstring(v_forn_buffer, ';', 2)),5,0),
                      dt_atualizacao   = sysdate
                 WHERE LPAD(TRIM(nr_cpf),11,'0')=v_cpf;-
                 COMMIT;
                 
                 utl_file.fclose(hdr_arq);
                 
              EXCEPTION
              
                 WHEN NO_DATA_FOUND THEN
                 
                 RAISE_APPLICATION_ERROR(-20001,'FORNECEDOR INEXISTENTE!'||SQLCODE||''||SQLERRM);
                    
                 WHEN OTHERS THEN
                  GERA_LOG_PRC('x',
                                      'xxx',
                                      'FORN.: '||TRIM(itg_splitstring(v_forn_buffer, ';', 2)) ||' NÃO ENCONTRADO - SQLCODE: '||sqlcode || ';  SQLERRM: '||sqlerrm ||
                                      ' ; CNPJ/CPF: ' ||TRIM(itg_splitstring(v_forn_buffer, ';', 5)) ||
                                      ' ; TIPO: ' ||TRIM(itg_splitstring(v_forn_buffer, ';', 24)) ||
                                      ' ; RAZAO_SOCIAL: ' ||TRIM(itg_splitstring(v_forn_buffer, ';', 3)));
              END;
          END IF;
        --
        END LOOP;
        
     IF (Sql%RowCount = 1) THEN
     
     UTL_FILE.FRENAME('DIR', v_forn_arq, 'DIR', Replace(v_forn_arq,'.ret','.OK'));
     
     END IF;
     COMMIT;
     EXCEPTION
     WHEN OTHERS THEN
     DBMS_OUTPUT.PUT_LINE(substr(sqlcode,1,100));
     END;
  END;
  
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

Cara, no meu caso quando postei o codigo:

IF (Sql%RowCount = 1) THEN

Isso serve pra saber se o resultado do meu DML (update/insert/delete) foi igual a uma linha, no seu caso pode ser que esteja dando update em mais que uma linha, que dai no caso o rowcount vai ser maior que um, aí você tem que dizer se é ou não,

e então adaptar para sql%rowcount >= 1, enfim , ou até retirar,

bom, vendo o seu codigo nunca vai entrar nesse IF, pois você está comitando após o UPDATE, fazendo com que SQL%ROWCOUNT não exista mais,

remova-o que deve funcionar.
mariogus
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 157
Registrado em: Sex, 30 Nov 2007 1:17 pm
Localização: Porto Alegre - RS

Ainda não funcionou...pode ser por causa do bloco? Não estou conseguindo efetuar os updates
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

Sim, mas da erro? não faz o update ?

tenta debugar, ou então colocar dbms_output.put_line no meio do codigo, pega os valores que estao passando nos loops, e então faça na mao pra ver o que acontece, se os valores estao certo,

não tem outro jeito..

debugando você resolve facilmente,

se utiliza o PLSQL Developer, tem uma opcao, Test Window,

cola o codigo lá, Da F9, e então vai dando Control + N,

falow
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

Pessoal,

Uma idéia pra se ver porque o update não funciona é, jogar uma EXCEPTION no Sql%RowCount = 0;

Faz um teste ai, talvez dê certo.
O Zero é quando ele não realiza o teu Update.

Selecionar tudo

IF SQL%ROWCOUNT = 0 THEN 
  RAISE_APPLICATION_ERROR(-20001, 'Erro:'||SQLERRM);
END IF;
qualquer coisa, manda pra gente.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 16 visitantes