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


Автор: Вася2 7.2.2007, 20:48
Хэллоу уважаемые
Возникла неожиданная проблема: есть файл с данными для уже существующей таблицы (база в 10g enterprise). При попытке запустить сам файл или его текст в SQL*Plus и Toad вываливается

ORA-00900: неверно предложение на языке SQL

вот текст файла
Код

LOAD DATA
INFILE *
 INTO TABLE GOODS
Fields terminated by ";" Optionally enclosed by '"'
(
  ID NULLIF (ID="NULL"),
  NAME,
  PRICE NULLIF (PRICE="NULL"),
  IMAGE,
  DETAILS
)
BEGINDATA
1;"Ball";20;"ball.jpg";"You can play football with it!"
2;"Tennis racket";30;"racket.jpg";"Let`s have some tennis!"
3;"Nikon 8Mpx camera";750;"camera.jpg";"8 Mpx, USB and TV ports, with a wide-screen objective and tripod"
4;"Nokia mobile phone";200;"mobile.jpg";"New Nokia phone with 3 Mpx camera, Web 2.0 support and termonuclear batteries"
5;"CRT monitor";300;"monitor.jpg";"Old-school CRT monitor with an unbeatable background radiation!"
6;"Camera objective";150;"objective.jpg";"Wide-screen telescopic objective"
7;"Chinese plate";25;"plate.jpg";"You can deploy your food on it!"
8;"Sugar bowl";30;"sugar bowl.jpg";"Universal, multi-purpose transformable sugar-bowl"



В чём может быть дело?

Автор: Тиль 8.2.2007, 07:42
А ты чем грузишь? SQL LOADERом?

Автор: Вася2 8.2.2007, 12:13
пробовал по-разному: писал текст непосредственно в SQL*Plus и Toad,  загружал файл с текстом в SQL*Plus (@), пытался через команды sqlldr и sqlload - всё равно нихрена не получается.... smile 

Автор: Тиль 8.2.2007, 15:30
Я пробовал sqlldr-все получилось.Попробуй по моему:
1. Готовишь файл file.ctl
Код

load data
INFILE "c:\import\file.txt"
INTO TABLE TEST
FIELDS TERMINATED BY ';'
(  ID NULLIF,  NAME, PRICE NULLIF, IMAGE, DETAILS)

ID NULLIF и PRICE NULLIF попробуй переименуй в ID_NULLIF и PRICE_NULLIF-может пробелы не понимать. Также посмотри типы данных в таблице и загружаемые значения.
2. Пишешь батник
Код

set nls_lang=AMERICAN_AMERICA.CL8MSWIN1251
sqlldr.exe userid=user/password@alias(из тнс-ки) control="c:\import\file.ctl"  errors=10000(большое число не ставь) bad=file.bad

Так вроде должно работать

Автор: -Сергей- 17.7.2007, 08:06
У меня подобная проблема. Юзаю sqlldr.

Код

sqlldr.exe userid=user/password@alias control=BLOBS.ctl errors=100 bad=BLOBS.bad discard=BLOBS.dis

файл BLOBS.ctl
Код

LOAD DATA

INFILE *

INTO TABLE docpatterns

FIELDS TERMINATED BY ','
( id, PATERN_BODY )

BEGINDATA
462,Заявка.dot


А в ответ получаю: SQL*Loader-00601 For INSERT option, table must be empty. 
В матчасти почитал:
Цитата

SQL*Loader-00601 For INSERT option, table must be empty. Error on table string

Cause: A non-empty table is being loaded with the INSERT option.

Action: Use the REPLACE keyword to empty the old table and store the new data in its place. Use the APPEND keyword to leave the table's contents intact and add the new data to it.

Ну и сделал как написано:
Код

sqlldr.exe userid=user/password@alias control=BLOBS.ctl errors=100 bad=BLOBS.bad discard=BLOBS.dis keyword=replace

В ответ получаю: LRM-00101 unknown parameter name 'replace' и SQL*Loader-00100 Syntax error on command-line

Уже не знаю что делать. Может есть другой способ загрузки данных, с помощью SQL скрипта?
Мне подсказали про какие-то локаторы BLOB или BFILE. Но я мало что понял...

Автор: tvik 17.7.2007, 08:39
попробу вместо append trancate - удаяет все имеющиеся в таблице записи и вставляет новые

Автор: -Сергей- 17.7.2007, 09:38
tvik, непонял, подробней можно?

Автор: DimW 17.7.2007, 09:58
Цитата(Вася2 @  7.2.2007,  20:48 Найти цитируемый пост)

LOAD DATA
INFILE *
 INTO TABLE GOODS
Fields terminated by ";" Optionally enclosed by '"'
(
  ID NULLIF (ID="NULL"),
  NAME,
  PRICE NULLIF (PRICE="NULL"),
  IMAGE,
  DETAILS
)


NULLIF имеет 2 параметра, отсуда ее нужно было записать так:

ID "NULLIF (:ID, 555)",        (как вариант)

желательно поставить кавычки и перед именем поля поставить двоеточие, т.е. имеется ввиду параметр который приходит.

как пример могу кинуть то что у меня точно работает, файл agent.ctl:

Код

LOAD DATA
INFILE "agent.csv"  - имя файла с данными (лежит в одной директории)
APPEND - добавить к сушествующим данным в таблице

INTO TABLE TEMP_AGENCY_UPLOAD
FIELDS TERMINATED BY ";" OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS
(
reference_code, 
first_name, 
middle_name, 
surname, 
sex, 
registration_no,
appointment_date "TO_DATE(:appointment_date, 'DD.MM.YYYY')",
date_of_birth "TO_DATE(:date_of_birth, 'DD.MM.YYYY')", 
place_of_birth "SUBSTR( :place_of_birth, 1, 50 )"
)


и сам запуск из бат-файла.

Код

sqlldr userid=customer/customer@opus03 control=agent.ctl
pause

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