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 /
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