ORA удалить/обрезать

Я использую загрузчик SQL для загрузки своих данных в базу данных.

Прежде чем вставлять данные, мне нужно удалить существующие данные в таблице:

options(skip=1,load=250000,errors=0,ROWS=30000,BINDSIZE=10485760)
load data
infile 'G:1.csv' "str '^_^'"
replace
into table IMPORT_ABC
fields terminated by "," OPTIONALLY ENCLOSED BY '"'
trailing nullcols(
.
.
.
.)

Но я получил ошибку, как:

SQL * LOADER-926: ошибка OCI при выполнении удаления/усечения для таблицы IMPORT_ABC ORA-30036: невозможно расширить сегмент на 8 в табличном пространстве отмены «undo1»

Как я могу удалить данные, например, по 10000 строк? Я знаю, что у меня есть ограничения на мою БД.


person 4est    schedule 08.04.2013    source источник
comment
Если его не нужно восстанавливать - предположительно, нет, если вы все равно заменяете - есть ли причина, по которой вы используете replace вместо truncate?   -  person Alex Poole    schedule 08.04.2013
comment
нет, я просто хочу удалить все элементы из таблицы, а затем вставить новый   -  person 4est    schedule 08.04.2013


Ответы (2)


Пакетное удаление записей можно выполнять в цикле 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
comment
могу ли я сделать это так: fist sqlloader file: `параметры кода (skip=1,load=250000,errors=0,ROWS=30000,BINDSIZE=10485760) загрузить данные в файл 'G:\Remediation metrics\Source data\Data Backup & Recovery\ALL_admin_combined_report_v1.csv' str '^_^' усечь в таблицу IMPORT_ABC..... 2-й файл загрузчика sql: options(skip=250001,load=250000,errors=0,ROWS =30000,BINDSIZE=10485760) загрузить файл данных '2.csv' str '^_^' добавить в таблицу. =10485760) загрузить файл данных '1.csv' str '^_^' добавить в таблицу - person 4est; 08.04.2013
comment
@ user2207426 - да, я это и имел в виду. Добавлена ​​ссылка на ответ; благодаря. - person Alex Poole; 08.04.2013
comment
@AlexPoole: Спасибо! Это сработает, но моему пользователю не будет предоставлено разрешение на усечение. У меня есть только удалить privs. На данный момент я использую отдельный оператор sqlplus для удаления данных, а затем sqldr, как указано выше... Но я не удивлен... - person Sauer; 03.11.2017

Ваше табличное пространство отмены слишком маленькое, чтобы хранить всю информацию об отмене, и кажется, что оно не может быть расширено.

Вы можете разделить импорт на более мелкие партии и выполнить фиксацию после каждой партии или попросить администратора базы данных увеличить табличное пространство для отмены1.

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

person Sibster    schedule 08.04.2013
comment
replace попытается удалить все в таблице при первом запуске, сколько бы записей ни было вставлено; и последующие запуски с тем же параметром удалят только что вставленные строки. Однако для фазы вставки может потребоваться пакетная обработка... - person Alex Poole; 08.04.2013
comment
да, у меня есть импорт данных, разделенный на 3 файла конфигурации, и это нормально, но я не могу удалить все элементы (в БД) за один раз, мне почему-то нужно удалить их по 1000 строк и т. д. как я могу это сделать? - person 4est; 08.04.2013
comment
Вы пробовали обрезать? или вы можете попробовать удалить на основе rowid asktom.oracle.com/pls/apex/ - person Sibster; 08.04.2013