Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > Вставка данных из .csv файла в таблицу


Автор: CrazyDiamond 7.9.2006, 11:44
Вот есть в информиксе такой оператор - load
Например, load from $file delimiter ';'

А вот как вставить данные из файла с разделителями в таблицу в Оракле?

Автор: ZeeLax 7.9.2006, 11:53
Методом прямой загрузки в обход SQL машины. Программка называется sqlldr.
Краткое описание http://www.firststeps.ru/sql/oracle/r.php?135

Автор: CrazyDiamond 11.9.2006, 11:24
Попробовал с помощью sqlldr.
---------------------------------------------------------------------------------------------------------
sqlldr user/password control=/путь/load.ctl log=/путь/load.log bad=/путь/load.bad

SQL*Loader: Release 9.2.0.6.0 - Production on Пнд Сен 11 12:12:25 2006

Copyright © 1982, 2002, Oracle Corporation.  All rights reserved.

Достигнута точка фиксации - счетчик логич. записей 7
---------------------------------------------------------------------------------------------------------
Вот, что пишется в лог:

SQL*Loader: Release 9.2.0.6.0 - Production on Пнд Сен 11 12:12:25 2006

Copyright © 1982, 2002, Oracle Corporation.  All rights reserved.

Управляющий файл:      /путь/load.ctl
Файл данных:           /путь/load.dat
  Файл плохих записей: /путь/load.bad
  Файл удаленных записей:  ничего не задано

 (Разрешить удалять все записи)

Количество записей для загрузки: ALL
Количество записей для пропуска: 0
Допускается ошибок: 50
Массив привязки:64 строк, макс. из 256000 байт
Продолжение:    ничего не задано
Использован маршрут:      Условный

Таблица GREG_TEST1, загружен из каждой логической записи.
Режим вставки действует для этой таблицы: APPEND
Действует опция TRAILING NULLCOLS

   Имя столбца                  Позиция    Дл.  Огр. Вкл Тип данных
------------------------------ ---------- ----- ---- ---- ---------------------
SZONE1                              FIRST     *   ;  O(") CHARACTER
SZKBEZ1                              NEXT     *   ;  O(") CHARACTER

Запись 1: Забракована - Ошибка в таблице GREG_TEST1.
ORA-01116: ошибка при открытии файла 8 базы данных
ORA-01110: файл данных 8: '/usr/oracle/OraHome1/oradata/ADV/users01.dbf'
ORA-27092: skgfofi: размер файла превышает предельный для процесса размер
Additional information: 262143
Additional information: 284161

...тоже самое с остальными записями.

Таблица GREG_TEST1:
  0 Строки успешно загружено.
  7 Строки не загружены из-за ошибки в данных.
  0 Строки не загружены из-за сбоев во всех фразах WHEN.
  0 Строки не загружены из-за того, что все поля были пусты.


Для массива привязки отведено:                  33024 байт(64 строк)
Байтов буфера чтения: 1048576

Всего пропущено логических записей:          0
Всего прочитано логических записей:            7
Всего забраковано логических записей:        7
Всего удалено логических записей:        0

Прогон начался в Пнд Сен 11 12:12:25 2006
Прогон кончился в Пнд Сен 11 12:12:25 2006

Общее время:          00:00:00.42
Процессорное время:   00:00:00.00
---------------------------------------------------------------------------------------------------------

/usr/oracle/OraHome1/oradata/ADV/users01.dbf занимает 1,16 Гб.
Отсюда вопрос. Этот файл БД действительно необходим для загрузки данных в мою табличку? Как выделить процессу sqlldr возможность использовать такой файлище? Без такого прямого использованяи файла БД загрузку "в обход SQL машины" никак не осуществить?

Автор: ols 11.9.2006, 15:48
я обычно использую внешние таблицы. 
например: 
создать директорию
Код

CREATE OR REPLACE DIRECTORY EXT AS 'd:\oracle\...\ext';

положить туда файл
а потом 
Код

create table ext_table_name
(
c1 varchar2(4000),
c2 varchar2(4000),
c3 varchar2(4000),
c4 varchar2(4000),
c5 varchar2(4000)
) 
organization external 
 (
   default directory EXT
   access parameters
   (
    fields terminated by ";"
   )
   location('file_name')
  );


делаешь select из новой таблицы куда угодно... 
например: 
Код

create table TTT as select * from ext_table_name


Удачи

Автор: ZeeLax 14.9.2006, 17:22
Цитата(CrazyDiamond @  11.9.2006,  14:24 Найти цитируемый пост)
ORA-01116: ошибка при открытии файла 8 базы данных
ORA-01110: файл данных 8: '/usr/oracle/OraHome1/oradata/ADV/users01.dbf'
ORA-27092: skgfofi: размер файла превышает предельный для процесса размер

Это значит, что превышен максимально допустимый размер файла для процесса. Параметр ulimit ядра Linux. Следовательно, нужно, либо увеличить значение ulimit, либо разбить таблично пространство на несколько файлов данных.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)