Mais um help - erro de conversão

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
jackie_0704
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Qui, 10 Jan 2008 1:26 pm
Localização: Portlo Alegre - RS

Pessoal, estou enfrentando um erro de conversão numa procedure. Vou colocar o código aqui para mostrar pra vocês. O procedure lê um arquivo de produtos e carrega esses dados na tabela XXTR_PRODUTOS.

Selecionar tudo

SQL> CREATE OR REPLACE PROCEDURE READ_PRODS_P(p_last_upd_by IN XXTR_PRODUTOS.last_updated_by%TYP
  2                         ,p_dir_prod IN VARCHAR2
  3                         ,p_arq_prod IN VARCHAR2)
  4                             
  5   IS
  6  
  7  
  8    v_arq_prod         UTL_FILE.FILE_TYPE;
  9    v_linha_prod            VARCHAR2(512);   
 10    c_dados_prod        XXTR_PRODUTOS%ROWTYPE;
 11  
 12   BEGIN
 13     
 14     c_dados_prod.last_update_date  := sysdate;
 15     c_dados_prod.creation_date     := sysdate;
 16  
 17  
 18      BEGIN
 19        v_arq_prod := UTL_FILE.FOPEN(p_dir_prod,p_arq_prod,'r');
 20  
 21      EXCEPTION
 22      WHEN OTHERS THEN
 23        DBMS_OUTPUT.PUT_LINE('Erro ao abrir arquivo');
 24      END;   
 25  
 26     
 27    LOOP
 28  
 29      UTL_FILE.GET_LINE(v_arq_prod,v_linha_prod);
 30  
 31  
 32       c_dados_prod.cod_prod                      :=                                                    GET_ELEMENT_F             (v_linha_prod,1,'^');
 33      c_dados_prod.nome_prod                     := GET_ELEMENT_F(v_linha_prod,2,'^');
 34      c_dados_prod.unidade_medida                := GET_ELEMENT_F(v_linha_prod,3,'^');
 35      c_dados_prod.fabricante                    := GET_ELEMENT_F(v_linha_prod,4,'^');
 36  
 37      BEGIN 
 38        INSERT INTO XXTR_PRODUTOS
 39           (cod_prod                -- 01        
 40            ,nome_prod              -- 02
 41            ,unidade_medida         -- 03
 42            ,fabricante             -- 04
 43            ,last_update_date       -- 05
 44            ,creation_date          -- 06
 45            ,created_by)            -- 07
 46   
 47        VALUES(c_dados_prod.cod_prod                  -- 01
 48               ,c_dados_prod.nome_prod                -- 02
 49               ,c_dados_prod.unidade_medida           -- 03
 50               ,c_dados_prod.fabricante               -- 04
 51               ,c_dados_prod.last_update_date         -- 05
 52               ,c_dados_prod.creation_date            -- 06
 53               ,c_dados_prod.created_by               -- 07
 54          ); 
 55  
 56          
 57          EXCEPTION
 58              WHEN VALUE_ERROR THEN RAISE_APPLICATION_ERROR(-                   20003,'Valores insuficientes');
 59              WHEN OTHERS THEN RAISE_APPLICATION_ERROR(-                  20004,'Erro no insert');
 60       END;
 61    END LOOP;
 62   UTL_FILE.FCLOSE(v_arq_prod);
 63  END READ_PRODS_P;
 64  /
O erro de conversão de tipos ocorre na linha 32. A variável v_linha_prod é do tipo VARCHAR2 e o cod_prod (que vem da tabela XXTR_PRODUTOS) é um NUMBER.

Eu já tentei fazer a seguinte coisa: c_dados_prod.cod_prod := GET_ELEMENT_F(TO_NUMBER(v_linha_prod),1,'^');
mas, na hora de dar um EXECUTE na procedure, o Oracle acusa o mesmo erro de conversão de caracter para número.

O que pode ser isso?

Obrigado
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

Você colocou um Debug, pra ver se, neste ponto, neste GET... só vem number mesmo ?

Exiba este valor e, qualquer coisa, manda ai.
jackie_0704
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Qui, 10 Jan 2008 1:26 pm
Localização: Portlo Alegre - RS

Vou fazer algumas alterações na procedure e na tabela a fim de tentar resolucionar o problema. Qualquer coisa, volto a postar.

Obrigado
Tineks
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 365
Registrado em: Ter, 24 Mai 2005 2:24 pm
Localização: Araraquara - SP
Cristiano (Tineks)
Araraquara - SP

Olá, boa tarde!
Eu já tentei fazer a seguinte coisa: c_dados_prod.cod_prod := GET_ELEMENT_F(TO_NUMBER(v_linha_prod),1,'^');
nesse caso o problema vai acontecer pois você está tentando converter a linha toda "TO_NUMBER(v_linha_prod)", tenta inverter o comando, assim : TO_NUMBER(GET_ELEMENT_F(v_linha_prod,1,'^'));

[]'s
Responder
  • Informação