Antes que nada saludos anticipados, soy principiante en estos menesteres de oracle y me he encontrado con este error que me ha dado dolor de cabeza, al cargar un archivo plano desde un .txt separadao por tabuladores a una tabla en oracle todo esto por medio de un Store procedure y al lanzarlo me manda los sig. errores:
ORA-01722: invalid number
ORA-06512: at "COGNOS.CARGA_GRAF_PAROS_PROD2", line 165
ORA-06512: at line 7
le he estado moviendo pero no he encontrado la solución si alguien me pudiese ayudar le estaré muy agradecido, anexo el SP.
CREATE OR REPLACE PROCEDURE COGNOS.CARGA_GRAF_PAROS_PROD2 (P_ARCHIVO IN VARCHAR2) IS
-------------------------------------------------------------------------------
-- Store que carga tabla CARGA_GRAF_PAROS_PROD
-------------------------------------------------------------------------------
v_archivo UTL_FILE.FILE_TYPE;
v_log UTL_FILE.FILE_TYPE;
v_dir VARCHAR2(600):= '/u01/cognos';
v_linea_full VARCHAR2(600);
v_linea VARCHAR2(600);
v_pos_tab NUMBER ;
v_pos_eol NUMBER ;
v_num_linea NUMBER := 0;
v_HORA VARCHAR2(30);
v_anio VARCHAR2(250);
v_mes VARCHAR2(250);
v_metrica VARCHAR2(250);
v_cantidad number;
v_paro VARCHAR2(250);
v_objetivo VARCHAR2(250);
v_region varchar2(250);
--v_unidades number;
V_ERROR VARCHAR2(255);
V_SEPARADOR VARCHAR2(1) := CHR(9);
v_id_tipo_met INTEGER := -1;
v_id_tipo_par integer := -1;
v_id_region integer := -1;
v_fecha DATE;
v_temp VARCHAR2(250);
BEGIN
DELETE FROM GRAF_PAROS_PROD2;
v_archivo := UTL_FILE.FOPEN(v_dir, p_archivo, 'r');
v_log := UTL_FILE.FOPEN(v_dir,'GRAF_CARGA_LOG_'||P_ARCHIVO| |'-'||TO_CHAR(SYSDATE,'DDMONYY')||'.txt','w');
SELECT TO_CHAR(SYSDATE,'DD-MON-YY HH:MI:SS') INTO v_HORA FROM DUAL;
UTL_FILE.PUT_LINE (V_LOG,'Inicia el proceso de carga: '||v_HORA);
LOOP
v_num_linea := v_num_linea + 1;
UTL_FILE.GET_LINE(v_archivo,v_linea_full);
v_linea_full := CONVERT(v_linea_full, 'UTF8', 'WE8ISO8859P1');
IF v_num_linea < 2 THEN --Lo regresa a continue si solo existe la primera linea
GOTO CONTINUE;
END IF;
UTL_FILE.PUT_LINE(v_log,'v_linea_full: '||TO_CHAR( v_linea_full));
UTL_FILE.PUT_LINE(v_log,'v_num_linea: '||TO_CHAR( v_num_linea));
v_pos_tab := INSTR(v_linea_full,V_SEPARADOR); --Devuelve la posicion del separador en la linea
v_anio := TO_CHAR(REPLACE(SUBSTR(v_linea_full, 1, v_pos_tab - 1),'"','') ); --(1)
v_linea := SUBSTR(v_linea_full, v_pos_tab + 1);
UTL_FILE.PUT_LINE(v_log,'Anio: '||TO_CHAR(v_anio));
v_pos_tab := INSTR(v_linea,V_SEPARADOR);
v_mes := TO_CHAR(REPLACE(SUBSTR(v_linea, 1, v_pos_tab - 1),'"', '') ); --(2)
v_linea := SUBSTR(v_linea, v_pos_tab + 1);
UTL_FILE.PUT_LINE(v_log,'Mes: '||TO_CHAR(v_mes));
v_pos_tab := INSTR(v_linea,V_SEPARADOR);
v_metrica := REPLACE(SUBSTR(v_linea, 1, v_pos_tab - 1),'"',''); --(3)
v_linea := SUBSTR(v_linea, v_pos_tab + 1);
UTL_FILE.PUT_LINE(v_log,'Metrica: '||TO_CHAR(v_metrica));
v_pos_tab := INSTR(v_linea,V_SEPARADOR);
v_temp := REPLACE(SUBSTR(v_linea, 1, v_pos_tab - 1),'"','');
v_cantidad := CAST (v_temp as NUMBER); --(4)
v_linea := SUBSTR(v_linea, v_pos_tab + 1);
UTL_FILE.PUT_LINE(v_log,'Cantidad: '||TO_CHAR(v_cantidad));
v_pos_tab := INSTR(v_linea,V_SEPARADOR);
v_paro := REPLACE(SUBSTR(v_linea, 1, v_pos_tab - 1),'"',''); --(5)
v_linea := SUBSTR(v_linea, v_pos_tab + 1);
UTL_FILE.PUT_LINE(v_log,'Paro: '||TO_CHAR(v_paro));
v_pos_tab := INSTR(v_linea,V_SEPARADOR);
v_objetivo := REPLACE(SUBSTR(v_linea, 1, v_pos_tab - 1),'"','');
--v_temp := REPLACE(SUBSTR(v_linea, 1, v_pos_tab - 1),'"','');
--v_objetivo := CAST (v_temp as NUMBER); --(6)
v_linea := SUBSTR(v_linea, v_pos_tab + 1);
UTL_FILE.PUT_LINE(v_log,'Objetivo: '||TO_CHAR(v_objetivo));
v_pos_tab := INSTR(v_linea,V_SEPARADOR);
v_pos_eol := INSTR(TRIM(v_linea),CHR(13));
v_region := REPLACE(SUBSTR(v_linea, 1, v_pos_eol - 1),'"','');
--(7)
--v_region := CAST( v_temp AS NUMBER);
UTL_FILE.PUT_LINE(v_log,'Region: '||TO_CHAR(v_region));
/************************************************/
/* INSERTA DATOS */
/************************************************/
BEGIN
v_temp := TO_CHAR(v_mes);
IF (LENGTH(v_temp) < 2) THEN --Le agrega un cero para el mes que sea del 1 al 9
v_temp := '0' || TO_CHAR(v_mes);
END IF;
v_temp := '01' || v_temp || TO_CHAR(v_anio); -- Le agrega la fecha que sale en el log
UTL_FILE.PUT_LINE(v_log,'v_temp: '||TO_CHAR( v_temp));
-- Cursores, Realizar Consulta
SELECT GF.ID_TIPO_METRICA INTO v_id_tipo_met
FROM GRAF_CAT_TIPO_METRICA GF
WHERE GF.DESC_TIPO_METRICA = v_metrica;
UTL_FILE.PUT_LINE(v_log,'id tipo metrica: '||TO_CHAR( v_id_tipo_met ));
SELECT GF.ID_TIPO_PARO INTO v_id_tipo_par
FROM GRAF_CAT_TIPO_PARO_PROD GF
WHERE GF.DESC_TIPO_PARO = v_paro;
UTL_FILE.PUT_LINE(v_log,'id tipo paro: '||TO_CHAR( v_id_tipo_par ));
SELECT GF.ID_REGION_BI INTO v_id_region
FROM RG_CAT_REGION_CONCRETO GF
WHERE GF.REGION = v_region;
UTL_FILE.PUT_LINE(v_log,'id region: '||TO_CHAR( v_id_region ));
IF (v_id_tipo_met != -1 AND v_id_tipo_met IS NOT NULL AND
v_id_tipo_par != -1 AND v_id_tipo_par IS NOT NULL AND
v_id_region != -1 AND v_id_region IS NOT NULL)
THEN
v_fecha := TO_DATE(v_temp,'dd/mm/yyyy');
UTL_FILE.PUT_LINE(v_log,'Fecha: '||TO_CHAR(v_fecha));
-------La linea 165 es aquí
INSERT INTO GRAF_PAROS_PROD2
(
GRAF_PAROS_PROD2.ID_FECHA,
GRAF_PAROS_PROD2.ANIO,
GRAF_PAROS_PROD2.MES,
GRAF_PAROS_PROD2.ID_TIPO_METRICA,
GRAF_PAROS_PROD2.CANTIDAD,
GRAF_PAROS_PROD2.ID_TIPO_PARO,
GRAF_PAROS_PROD2.OBJETIVO,
GRAF_PAROS_PROD2.ID_REGION_BI
)
VALUES
(
v_fecha,
v_anio,
v_mes,
v_id_tipo_met,
v_cantidad,
v_id_tipo_par,
v_objetivo,
v_region
);
END IF;
COMMIT;
END;
<<continue>>
null;
END LOOP;
COMMIT;
Por lo que he leído se trata de un tipo de dato que anda fallando pero no sé si sea eso u otra cosa mas.??