Как импортировать данные из большого CSV-файла (размер файла больше 32767) в базу данных с использованием UTL_FILE - PullRequest
1 голос
/ 17 мая 2019

У меня есть CSV-файл с 90000 записями, когда я пытаюсь импортировать CSV в базу данных, я получаю сообщение об ошибке ниже -

Отчет об ошибке - ORA-06502: PL / SQL: ошибка числового значения или значения:слишком маленький буфер строки символовпроизошла ошибка преобразования или ограничения.Например, эта ошибка возникает, если предпринята попытка присвоить значение NULL переменной, объявленной NOT NULL, или если предпринята попытка присвоить целое число больше 99 переменной, объявленной NUMBER (2).* Действие: измените данные, как они обрабатываются или как они объявляются, чтобы значения не нарушали ограничения.

Я знаю, что размер буфера равен 32767, и мой файл больше этого.Но, пожалуйста, скажите мне, как обработать такой случай, используя пакет UTL_FILE.

ниже приведен код -

create or replace PROCEDURE test_c1(errbuff varchar2,errcode number)
AS
v_line                      VARCHAR2(32767);
v_file                      SYS.UTL_FILE.FILE_TYPE;
--v_dir                     VARCHAR2(250);
v_filename                  VARCHAR2(250);
p_ignore_headerlines  NUMBER;

BEGIN
v_filename := 'file.csv';       
v_file := SYS.UTL_FILE.FOPEN('CSV_DIR',v_filename,'R',32767);

p_ignore_headerlines:=1;
   IF p_ignore_headerlines > 0
   THEN
      BEGIN
         FOR i IN 1 .. p_ignore_headerlines
         LOOP
            UTL_FILE.get_line (v_file, V_LINE);
         END LOOP;
            END;
   END IF;

LOOP
BEGIN
SYS.UTL_FILE.GET_LINE(v_file,v_line);
EXCEPTION
WHEN no_data_found THEN
exit;
END;
INSERT INTO load_csv
VALUES (--my columns--);

END LOOP;
UTL_FILE.FCLOSE(v_file);
END;


/

Мне нужно загрузить данные, используя пакет UTL_File.

1 Ответ

1 голос
/ 17 мая 2019

Ошибка «ORA-06502» не о размере файла, а о размере строки .

Переменная "v_line" предназначена для 32767 байтов, но строка содержит больше байтов.

В какой операционной системе установлена ​​база данных Oracle?

Если это Windows, тогда конец строки (или конец записи) ДОЛЖЕН быть 2 (двумя) символами: CARRIAGE_RETURN (десятичное ASCII 13 или шестнадцатеричное значение 0D) и следующее LINE_FEED (десятичное ASCII 10 или шестнадцатеричное значение) 0A).

Если это Linux / Unix, то конец строки равен ТОЛЬКО 1 (одному) символу: LINE_FEED (ascii 10).

Я предлагаю использовать Hex Editor, например XVI32, чтобы вы могли «увидеть», каков конец строки.

На изображении текстовый файл для системы Windows, с CARRIAGE_RETURN (CR, ascii 13 или шестнадцатеричное значение 0D) и следующим LINE_FEED (LF, ascii 10 или hex valur 0A).

enter image description here

Примечание: в качестве альтернативы, если чтение файла CVS должно выполняться более одного раза (например, каждую неделю или месяц), вы можете определить таблицу типа " Внешняя таблица ". Дайте мне знать, чтобы помочь вам. При этом вы можете использовать « select » в файле CVS, и это быстрее, чем UTL_FILE.

...