Пакетное удаление записей можно выполнять в цикле PL/SQL, но обычно это считается плохой практикой, поскольку полное удаление обычно следует рассматривать как одну транзакцию; и это невозможно сделать из управляющего файла SQL*Loader. Ваш администратор базы данных должен определить размер пространства UNDO
, чтобы он мог выполнять работу, которую вам необходимо выполнить.
Если вы удаляете всю таблицу, вам почти наверняка будет лучше урезать ее, либо в управляющем файле:
options(skip=1,load=250000,errors=0,ROWS=30000,BINDSIZE=10485760)
load data
infile 'G:1.csv' "str '^_^'"
truncate
into table IMPORT_ABC
...
Или как отдельный оператор truncate
в SQL*Plus/ SQL Developer/какой-то другой клиент, прежде чем начать загрузку:
truncate table import_abc;
Недостатком является то, что ваша таблица будет казаться пустой для других пользователей, пока загружаются новые строки, но если это выделенная область импорта (догадываясь по имени), это может не иметь значения в любом случае.
Если ваш UNDO
действительно такой маленький, вам, возможно, придется запускать несколько загрузок, и в этом случае - вероятно, очевидно - вам нужно убедиться, что у вас есть только truncate
в управляющем файле для первого (или используйте отдельный оператор truncate
), и иметь append
в последующих контрольных файлах как вы отметили в комментариях.
Вы также можете рассмотреть возможность использования внешних таблиц, если вы повторное использование этих данных в качестве базы для заполнения чего-то еще, поскольку нет UNDO
накладных расходов на замену внешнего источника данных. Вам, вероятно, придется поговорить с вашим администратором баз данных о настройке этого и предоставлении вам необходимых разрешений для каталога.
person
Alex Poole
schedule
08.04.2013
replace
вместоtruncate
? - person Alex Poole   schedule 08.04.2013