Oracle: импортировать файл CSV

Я уже давно искал, но, похоже, не могу найти ответов, так что вот ...

У меня есть CSV-файл, который я хочу импортировать в таблицу в Oracle (9i / 10i).

Позже я планирую использовать эту таблицу как поиск для другого использования.

На самом деле это обходной путь, над которым я работаю, поскольку запрос с использованием предложения IN с более чем 1000 значений невозможен.

Как это сделать с помощью SQLPLUS?

Спасибо за ваше время! :)


person cr8ivecodesmith    schedule 01.06.2011    source источник
comment
Вы должны использовать объединение вместо предложения IN.   -  person MikeKulls    schedule 18.07.2013
comment
Вы должны использовать объединение вместо предложения IN. ... что вы делаете, сначала импортируя csv в Oracle.   -  person sf_jeff    schedule 19.04.2017
comment
Мэтью Уотсон написал здесь хороший и полный ответ: stackoverflow.com/a/41080/1579667   -  person Benj    schedule 23.01.2020


Ответы (7)


Загрузчик SQL помогает загружать файлы CSV в таблицы: Загрузчик SQL *

Если вам нужен только sqlplus, это будет немного сложнее. Вам нужно найти сценарий sqlloader и файл csv, а затем запустить команду sqlldr.

person Abi    schedule 01.06.2011
comment
Ты прав. Еще пара исследований заставила меня понять, что SQL Loader - это способ решить эту проблему. Спасибо! - person cr8ivecodesmith; 01.06.2011

Еще одно решение, которое вы можете использовать, - это SQL Developer.

С его помощью у вас есть возможность импортировать из файла csv (доступны другие файлы с разделителями).

Просто откройте представление таблицы, а затем:

  • выбрать действия
  • данные импорта
  • найди свой файл
  • выберите свои варианты.

У вас есть возможность, чтобы разработчик SQL выполнял вставки за вас, создавал сценарий вставки sql или создавал данные для сценария загрузчика SQL (сам не пробовал этот вариант).

Конечно, все это спорно, если вы можете использовать только командную строку, но если вы можете протестировать это с помощью SQL Developer локально, вы всегда можете развернуть сгенерированные сценарии вставки (например).

Просто добавляю еще один вариант к 2 уже очень хорошим ответам.

person Clarkey    schedule 12.09.2012
comment
Хорошая подробная статья о том, как использовать мастер SQL Developer для подготовки сценария загрузчика SQL и управляющего файла: thatjeffsmith.com/archive/2012/08/ - person Vadzim; 20.12.2014

Загрузчик SQL - это то, что вам нужно. Я недавно загрузил свою таблицу из файла csv, в новинку для этой концепции, хотел бы поделиться примером.

LOAD DATA
    infile '/ipoapplication/utl_file/LBR_HE_Mar16.csv'
    REPLACE
    INTO TABLE LOAN_BALANCE_MASTER_INT
    fields terminated by ',' optionally enclosed by '"'
    (
    ACCOUNT_NO,
    CUSTOMER_NAME,
    LIMIT,
    REGION

    )

Place the control file and csv at the same location on the server. Locate the sqlldr exe and invoce it.

sqlldr userid / passwd @ DBname control = Пример: sqlldr abc / xyz @ ora control = load.ctl

Надеюсь, это поможет.

person arjun gaur    schedule 01.06.2016

Альтернативным решением является использование внешней таблицы: http://www.orafaq.com/node/848

Используйте это, когда вам нужно делать этот импорт очень часто и очень быстро.

person TTT    schedule 01.06.2011

Кто-то попросил меня разместить ссылку на фреймворк! который я представил на Open World 2012. Это полный пост в блоге, демонстрирующий, как проектировать решение с внешними таблицами.

person Michael McLaughlin    schedule 17.11.2012

Из Oracle 18c вы можете использовать Встроенные внешние таблицы:

Встроенные внешние таблицы позволяют определять во время выполнения внешнюю таблицу как часть оператора SQL, не создавая внешнюю таблицу как постоянный объект в словаре данных.

Для встроенных внешних таблиц тот же синтаксис, который используется для создания внешней таблицы с помощью оператора CREATE TABLE, может использоваться в операторе SELECT во время выполнения. Укажите встроенные внешние таблицы в предложении FROM блока запроса. Запросы, которые включают встроенные внешние таблицы, могут также включать обычные таблицы для объединений, агрегирования и т. Д.

INSERT INTO target_table(time_id, prod_id, quantity_sold, amount_sold)
SELECT time_id, prod_id, quantity_sold, amount_sold
FROM   EXTERNAL (   
    (time_id        DATE NOT NULL,     
     prod_id        INTEGER NOT NULL,
     quantity_sold  NUMBER(10,2),
     amount_sold    NUMBER(10,2))     
    TYPE ORACLE_LOADER     
    DEFAULT DIRECTORY data_dir1
    ACCESS PARAMETERS (
      RECORDS DELIMITED BY NEWLINE
      FIELDS TERMINATED BY '|')     
   LOCATION ('sales_9.csv') REJECT LIMIT UNLIMITED) sales_external;
person Lukasz Szozda    schedule 02.03.2018

Я хотел бы поделиться двумя советами: (совет 1) создать файл csv (совет 2) загрузить строки из файла csv в таблицу.

==== [(совет 1) SQLPLUS для создания файла CSV из таблицы Oracle] ====

Я использую SQLPLUS со следующими командами:

set markup csv on
set lines 1000
set pagesize 100000 linesize 1000
set feedback off 
set trimspool on
spool /MyFolderAndFilename.csv
Select *  from MYschema.MYTABLE  where MyWhereConditions ;
spool off
exit

==== [совет 2 SQLLDR для загрузки CSV-файла в таблицу] ====

Я использую SQLLDR и файл csv (разделенный запятыми), чтобы добавить (ДОБАВИТЬ) строки из файла csv в таблицу. в файле между полями текстовые поля имеют до и после текста КРИТИЧЕСКИЙ: если последний столбец пуст, в конце строки стоит символ

Пример строк данных в файле csv:

11,"aa",1001
22,"bb',2002
33,"cc",
44,"dd",4004
55,"ee',

Это контрольный файл:

LOAD DATA
APPEND 
INTO TABLE MYSCHEMA.MYTABLE
fields terminated by ',' optionally enclosed by '"'
TRAILING NULLCOLS
(
CoulmnName1,
CoulmnName2,
CoulmnName3
)

Это команда для выполнения sqlldr в Linux. Если вы работаете в Windows, используйте \ вместо / c:

sqlldr userid=MyOracleUser/MyOraclePassword@MyOracleServerIPaddress:port/MyOracleSIDorService  DATA=datafile.csv  CONTROL=controlfile.ctl  LOG=logfile.log  BAD=notloadedrows.bad

Удачи !

person user14570900    schedule 22.01.2021
comment
Превосходно! Именно то, что я искал. Большое спасибо - person Chazg76; 27.05.2021