Проблема с SQL*загрузчиком

Я получаю сообщение об ошибке SQL*Loader-606, которое означает:

Синоним, указанный в предложении INTO TABLE в управляющем файле SQL*Loader, указывает удаленный объект через ссылку на базу данных. В предложении INTO TABLE можно указать только синоним существующей локальной таблицы.

Есть ли способ вставить в удаленную таблицу с помощью SQL * Loader?


person Vijay    schedule 08.10.2009    source источник
comment
Какую версию базы данных вы используете?   -  person APC    schedule 08.10.2009


Ответы (4)


Поскольку вы находитесь на 10g, вы можете использовать внешние таблицы вместо загрузчика SQL.

Настроить внешнюю таблицу очень просто. Подробнее.

Чтобы внешняя таблица выбрала новый файл (что вам может понадобиться, потому что у вас есть повторяющийся процесс), сделайте следующее:

alter table your_ext_table_name location ('<newfile.name>')
/

Тогда вы можете сделать это:

insert into whatever_table@remote_db
    select * from your_ext_table_name 
/

Это позволяет избежать двух партий DML. Внешние таблицы не так быстры, как хорошо настроенный процесс SQL*Loader, но это будет незначительно по сравнению с налогом на сетевой трафик (который неизбежен в вашем сценарии).

person APC    schedule 08.10.2009

Запустить загрузчик SQL на сервере с таблицей?

Должна быть причина, почему нет, но это кажется мне самым простым.

person PaulJ    schedule 08.10.2009
comment
У меня нет доступа к этому серверу, чтобы запустить на нем nythg. :) - person Vijay; 08.10.2009

Если вы не можете использовать внешние таблицы (например, потому что файл данных находится на клиентской машине, а не на сервере базы данных), вы можете вставить в представление удаленного объекта.

Например

create database link schema1 connect to schema1 identified by schema1 using 'XE';
create view schema1_test_vw as select * from test@schema1;

load data
 infile *
 append
 into table schema1_test_vw
 ( id POSITION(1:4) INTEGER)
begindata
1001
1002
1003

преуспел в моем тесте XE. Для представления все размеры столбцов, типы данных и т. д. зафиксированы в локальной схеме, поэтому у sqldr нет проблем.

person Gary Myers    schedule 22.11.2009

person    schedule
comment
+1 Большинство проблем с SQL*Loader проще решить на SQL. Вот почему внешние таблицы — это такое благо. - person APC; 08.10.2009
comment
@ Роберт. Спасибо за предложение, но если стол огромный! тогда не думаете ли вы, что это займет чертовски много времени, чтобы вставить, а также создать, и это должно выполняться регулярно в виде процесса, поэтому я боюсь, что это будет возможным решением или нет !! - person Vijay; 08.10.2009
comment
Тогда почему бы вам не позволить sqldr подключиться к удаленной базе данных sqldr имя пользователя/пароль@tnsalias У вас есть доступ к удаленной базе данных с использованием tnsalias, иначе ссылка на базу данных не будет работать - person Rob van Laarhoven; 08.10.2009
comment
Да, Роберт, я делаю то же самое, но проблема в том, что, как я упоминал выше, предложение INTO TABLE будет принимать синоним, который предназначен для локальной существующей таблицы :) - person Vijay; 08.10.2009
comment
@crasher: Роберт говорит, что не подключайтесь к вашей локальной базе данных и не подключайтесь к другой базе данных по ссылке базы данных ... напрямую обращайтесь к другой базе данных. SQL*Loader может подключаться к удаленным базам данных напрямую, он просто не может вставить ссылку в базу данных. Подключиться напрямую к remote_db. Не используйте локальную базу данных в качестве посредника. - person Rob; 08.10.2009