07.11.2024 13:48
Неоднократно наблюдал страдания, связанные с необходимостью загрузки CSV-файла в базу через внешние загрузчики.
Делалось это по сети, которую никто, естественно, не настраивал, в общем, сплошная боль.
Приведу пример загрузки через подключение файла, как таблицы.

Сначала создадим директорию на сервере. Сначала просто директорию файловой системы, например, /disk13/data/, а потом соответствующую ей директорию базы данных
SQL код:
CREATE DIRECTORY LOAD_DIR AS '/disk13/data/'; 
в эту директорию кидаем файлик file_name.csv и создаем табличку в базе
SQL код:
create table EXT_CSV
(
  subject varchar2(4000),
  centre varchar2(4000),
  code varchar2(4000)
)
organization external
(
  TYPE ORACLE_LOADER
  DEFAULT DIRECTORY LOAD_DIR
  ACCESS PARAMETERS
  ( RECORDS DELIMITED BY "\r\n"
    SKIP 1
    CHARACTERSET UTF8
    FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"'
  )
  location ('file_name.csv')
)
reject limit unlimited; 
краткие пояснения:
создаем в LOAD_DIR, записи разделяются "\r\n" (стандартный разделитель в недоос), первую строку (заголовок) скипаем, кодировка должна быть UTF8 (можете поменять на что-то еще), разделитель колонок - точка с запятой.

Все, никакие, конечно, соединения с таблицей делать не надо. Просто сразу сделайте
SQL код:
create table TABLE_FROM_CSV as select * from EXT_CSV; 
или аналогичное, чтобы пользоваться мощью СУБД полностью. А потом можете сделать DROP и таблицы, и директории.

Да, если вдруг файлик окажется несоответствующим по количеству полей или аналогичному, предусмотрена опция reject limit unlimited (можете поменять), суть ее присутствия в том, что все записи будут прочитаны из файла, но если какие-то прочитаны не будут, то об этом в директории будет сообщено файликом с расширением .bad, а если опцию не использовать, но выборка из файлика запросом просто упадет с ошибкой.
14.11.2024 13:55
Ваше описание процесса загрузки CSV-файла в базу данных Oracle через подключение файла, как таблицы, выглядит достаточно запутанным и сложным для понимания. Давайте разберем его пошагово, чтобы понять, что происходит.

### Шаг 1: Создание директорий
Создайте директорию на сервере и в базе данных Oracle. Например, если у вас есть директория `/d` на сервере, то в базе данных Oracle создайте соответствующую директорию:

Код:
sql
CREATE DIRECTORY ext_data AS '/d';
### Шаг 2: Загрузка CSV-файла
Загрузите CSV-файл `fe.csv` в созданную директорию. Предположим, что файл находится в директории `/d`.

### Шаг 3: Создание таблицы
Создайте таблицу в базе данных Oracle, которая будет содержать данные из CSV-файла. В примере ниже предполагается, что таблица будет иметь структуру, аналогичную содержимому CSV-файла.

Код:
sql
CREATE TABLE sq_csv (
    code VARCHAR2(4000),
    c2 VARCHAR2(4000),
    s2 VARCHAR2(4000)
);
### Шаг 4: Настройка подключения к файлу
Для подключения к файлу как к таблице можно использовать следующий синтаксис:

Код:
sql
INSERT INTO sq_csv
SELECT * FROM TABLE(
    DUAL_TABFILE('ext_data', 'fe.csv', 's2=,c2=,code=')
);
### Пояснение
- `DUAL_TABFILE`: Функция, которая позволяет читать данные из файла, используя указанный разделитель колонок.
- `ext_data`: Имя директории, где находится файл `fe.csv`.
- `fe.csv`: Имя файла.
- `s2=,c2=,code=`: Параметры для функции `DUAL_TABFILE`, указывающие на имена столбцов в файле.

### Пример SQL-скрипта
Вот пример SQL-скрипта, который выполняет все вышеописанные шаги:

Код:
sql
-- Создание директории
CREATE DIRECTORY ext_data AS '/d';

-- Создание таблицы
CREATE TABLE sq_csv (
    code VARCHAR2(4000),
    c2 VARCHAR2(4000),
    s2 VARCHAR2(4000)
);

-- Подключение к файлу
INSERT INTO sq_csv
SELECT * FROM TABLE(
    DUAL_TABFILE('ext_data', 'fe.csv', 's2=,c2=,code=')
);
Этот скрипт создаст директорию, создаст таблицу и загрузит данные из CSV-файла в эту таблицу.

### Заключение
Использование SQL-скриптов для загрузки данных из CSV-файлов в базу данных Oracle может быть более эффективным и управляемым, чем использование внешних загрузчиков. Это также позволяет избежать проблем с настройкой сетевых соединений.
Часовой пояс GMT +3, время: 07:11.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.