IMPORTACIÓN DATOS CSV
Hola foro,
Tenía este código PL/SQL que funcionaba correctamente en 10g para cargar datos desde un archivo .csv. Hemos actualizado la versión de Oracle a 11g el código ha dejado de funcionar, no sé por qué. Se compila correctamente, se ejecuta pero no carga los datos. No aparece ningún mensaje ni código de error. Si se ejecuta con degug, habla de una excepción no tratada en la línea del INSERT, pero no da más información. ¿Alquien tiene experiencia con este tema, por favor? Gracias de antemano.
El código:
CREATE OR REPLACE PROCEDURE VSCI.load_escandallo_N (
p_filename IN VARCHAR2 DEFAULT ‘FlowRouterCorvival.txt’,
p_directory IN VARCHAR2 DEFAULT ‘GUA_DIR’,
p_ignore_headerlines IN INTEGER DEFAULT 0,
p_delimiter IN VARCHAR2 DEFAULT ‘,’
)
IS
v_filehandle UTL_FILE.file_type;
v_text VARCHAR2 (32767);
v_eof BOOLEAN := FALSE;
v_fields DBMS_SQL.varchar2a;
v_field_index INTEGER;
v_length INTEGER;
v_start INTEGER;
v_index INTEGER;
v_enclosed_start INTEGER;
v_enclosed_end INTEGER;
BEGIN
v_filehandle := UTL_FILE.fopen (p_directory, p_filename, ‘r’, 32767);
DELETE FROM TB_ESCANDALLO_N;
IF p_ignore_headerlines > 0
THEN
BEGIN
FOR i IN 1 .. p_ignore_headerlines
LOOP
UTL_FILE.get_line (v_filehandle, v_text);
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
v_eof := TRUE;
END;
END IF;
WHILE NOT v_eof
LOOP
BEGIN
DBMS_OUTPUT.put_line
(‘——————————————————————‘
);
UTL_FILE.get_line (v_filehandle, v_text);
DBMS_OUTPUT.put_line (‘v_text=’ || v_text);
v_fields.DELETE;
v_field_index := 0;
v_length := LENGTH (v_text);
v_start := 1;
v_enclosed_start := INSTR (v_text, ‘»‘, 1);
v_enclosed_end := INSTR (v_text, ‘»‘, v_enclosed_start + 1);
WHILE (v_start <= v_length)
LOOP
v_index := INSTR (v_text, p_delimiter, v_start);
IF v_enclosed_end != 0
AND v_index > v_enclosed_start
AND v_index < v_enclosed_end
THEN
v_index := INSTR (v_text, p_delimiter, v_enclosed_end);
v_enclosed_start := INSTR (v_text, '"', v_enclosed_end + 1);
IF v_enclosed_start != 0
THEN
v_enclosed_end := INSTR (v_text, '"', v_enclosed_start + 1);
END IF;
END IF;
IF v_index = 0
THEN
v_fields (v_field_index) :=
TRIM (LTRIM (RTRIM (SUBSTR (v_text, v_start), '"'), '"'));
v_start := v_length + LENGTH (p_delimiter);
ELSE
v_fields (v_field_index) :=
TRIM (LTRIM (RTRIM (SUBSTR (v_text,
v_start,
v_index - v_start
),
'"'
),
'"'
)
);
v_start := v_index + LENGTH (p_delimiter);
END IF;
v_field_index := v_field_index + 1;
END LOOP;
INSERT INTO TB_ESCANDALLO_N
(EUROCODE,DESCRIPCION, REFERENCIA, COMPONENTE, CANTIDAD
)
VALUES (v_fields (0), v_fields (1), v_fields (2), v_fields (3), TO_NUMBER(v_fields (4),'9.9')
);
DBMS_OUTPUT.put_line
('------------------------------------------------------------------'
);
EXCEPTION
WHEN NO_DATA_FOUND
THEN
v_eof := TRUE;
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line
('*************************************************************'
);
DBMS_OUTPUT.put_line (SQLERRM);
DBMS_OUTPUT.put_line (v_text);
DBMS_OUTPUT.put_line
('*************************************************************'
);
END;
END LOOP;
UTL_FILE.fclose (v_filehandle);
-- *********************************************************************************
-- UTL_FILE.fclose (v_filehandle);
-- UTL_FILE.frename ('GUA_DIR',
-- p_filename,
-- 'GUA_DIR',
-- REPLACE (p_filename,
-- '.txt',
-- '_' || TO_CHAR (SYSDATE, 'yymmddhh24miss') || '.txt'
-- )
-- );
EXCEPTION
WHEN OTHERS
THEN
IF UTL_FILE.is_open (v_filehandle)
THEN
UTL_FILE.fclose (v_filehandle);
END IF;
RAISE;
END load_escandallo_N;
/
Si sirve de orientación, adjunto las capturas de Toad, para que veáis que hay cosas extrañas en el código de colores (soy novato con 11g y con Toad 12, como podéis comprobar)
No puedo adjuntar las capturas.