powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Перекачка из одной таблицы в другую
17 сообщений из 17, страница 1 из 1
Перекачка из одной таблицы в другую
    #32088828
Boytronic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Не могли бы вы, господа, помочь мне в следующем вопросе. Есть совершенно две одинаковые таблицы, связь между которыми осуществляется через DBLink. Нужно написать скрипт по перекачке данных из одной таблицы в другую, НО на таблицы наложен CONSTRAINT, который не позволяет вставлять дублированные строки. Так и нужно, дублированные строки не нужны, но, данные в таблицах могут повторяться, поэтому, когда я запускаю скриптик типа: INSERT INTO table1@DBLink SELECT * FROM table1 начинается отработка скрипта, затем он доходит до первого констрэйнта и вываливается. Понимаю, что надо писать на PL/SQL с обработкой исключительной ситуации, но дело довольно срочное, а копаться с PL/SQL нет времени...:-). Может быть, кто - то поможет? Заранее благодарен. Андрей...:-)
...
Рейтинг: 0 / 0
Перекачка из одной таблицы в другую
    #32088844
Allexx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну и напиши
insert into a...
select from b...
where not exists
(select * from a where a.ключ=b.ключ)
...
Рейтинг: 0 / 0
Перекачка из одной таблицы в другую
    #32088852
Boytronic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, Алекс, что ответили. Дело в том, что я не стал это писать в первом постинге - да, я пытался делать так, как Вы советуете, но при этом SQLplus так четко "зависает", что я бросил эти попытки и подумал, что вводить надо именно построчно! Ресурсов не хватает, вот в чем дело - идет ругань на роллбэки и т.п....:-)
...
Рейтинг: 0 / 0
Перекачка из одной таблицы в другую
    #32088856
Boytronic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...Да и еще забыл. Дело в том, что таблица, связь с которой идет по DBLink'у, не "хавает" псевдоним, то есть если написать
INSERT INTO table@dblink a select * FROM table b
WHERE a.col1 NOT IN (SELEСT col1 FROM table) (col1 - уникальное поле), то, почему - то, идет "ругань"
Field a.col1 does not exist...
...
Рейтинг: 0 / 0
Перекачка из одной таблицы в другую
    #32088863
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Версия Оракла какая? Если 9i, то может MERGE INTO стаботает быстрее, чем INSERT INTO, и можно обработать дубликаты: http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96540/statements_915a.htm#2090700
...
Рейтинг: 0 / 0
Перекачка из одной таблицы в другую
    #32088871
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
форма записи insert ... select ... это просто возможность объединить два sql выражения в одно, так что вполне естественно, что вторая часть ничего не знает о первой.

А чтоб закачать данные отключите констреинты на таблице, затем вставьте данные, удалите дублирующиеся строки, включите констреинты.
...
Рейтинг: 0 / 0
Перекачка из одной таблицы в другую
    #32088894
Boytronic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Версия Oracle 8i. Насчет отключения констрэйнтов - не катит, так как база данных работает в горячем режиме и весьма нежелательно, чтобы они отключались. Относительно же удаления дублей - так это вообще делать боязно на "живой" базе, тем паче, что я этого не делал, да и, пожалуй, полагаю, что ресурсов не хватит....:-)
...
Рейтинг: 0 / 0
Перекачка из одной таблицы в другую
    #32088900
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда создай еще одну таблицу рядом с боевой, одинаковую с ней по структуре. Заливай через линк данные в нее, потом вставляй уже в боевую. Предварительно можешь почистить дубли, или просто запусти запрос по типу предложенного выше, через not exists.
...
Рейтинг: 0 / 0
Перекачка из одной таблицы в другую
    #32088911
Allexx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотел вам примерчик процедурки бросить, но, похоже, своими испытаниями я наш сервак грохнул))

...WHERE a.col1 NOT IN...
Во-первых надо b.col
А во вторых уж точно not exists, а не not in
...
Рейтинг: 0 / 0
Перекачка из одной таблицы в другую
    #32088921
[IPT]-Said
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А собственно чего такого страшного с PL/SQL, ниже вот примерчик (правда сам не запускал, может где и ошибся)

cursor c1 is select * from table1;
c1_var c1%rowtype;

BEGIN
open c1;
loop
fetch c1 into c1_var;
exit when c1%notfound;
begin
insert into table2
values(c1_var.table1.col1,c1_var.table1.col2,....);
commit;
exception when dup_val_on_index then
null;
end;
end loop;
close c1;
EXCEPTION
WHEN others THEN
null ;
END;
Коммит после каждой встаки должен избавить от проблем с роллбэками,
правда begin/end внутри цикла не есть хорошо, но попробовать можно...
...
Рейтинг: 0 / 0
Перекачка из одной таблицы в другую
    #32088958
Boytronic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Денису: Да, неплохая идея, если дело касается одноразовой перекачки. Сделал себе табличку, влил туды и экспериментируй как хош, в случае чего можно новую слабать. Но если надо делать регулярные вливания(скажем, раз в сутки), то, сами понимаете...:-) Алексу: Примите мои соболезнования, если б я знал, что у Вас будут проблемы...Теперь становится понятно, что есть такое перекачать из таблы в таблу. Это только на первый взгляд кажется просто...:-) Саиду: большое спасибо. Опробую я этот скрипт, скорее всего, уже в понедельник, НО мне не очень понравилось перечесление столбцов там, где VALUES. Дело в том, что в таблице их около сотни и...сами понимаете....Нельзя ли по - простому ,по - бразильски SELECT * сделать? :-)
...
Рейтинг: 0 / 0
Перекачка из одной таблицы в другую
    #32088974
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я таким макаром качал десятка полтора разных таблиц по несколько раз на дню. Точнее, вокруг всего этого были написаны процедуры, производящие все необходимые действия: очистка временной таблицы (через truncate), импорт удаленных данных, проверка на их правильность, импорт в боевые таблицы, рассылка отчетов о проделанной работе. Так что если у подобные перекачки регулярны, со временем они обрастут приготовленными скриптами на проведение всех операций.
...
Рейтинг: 0 / 0
Перекачка из одной таблицы в другую
    #32088988
Фотография Oleg Afanasiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По-моему лучше написать скрипт на plsql и горя не знать.
При таком подходе можно каждую запись проверять на валидность.
...
Рейтинг: 0 / 0
Перекачка из одной таблицы в другую
    #32089020
Allexx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сотни записей? и запрос вешается? я пятьдесят тысяч перегнать пытался:)
...
Рейтинг: 0 / 0
Перекачка из одной таблицы в другую
    #32089021
Boytronic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Олегу Афанасьеву - совершенно с Вами согласен. Я, собственно и спрашивал о конкретном скрипте...:-)))
...
Рейтинг: 0 / 0
Перекачка из одной таблицы в другую
    #32089023
[IPT]-Said
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2Boytronik
Чтобы не перечислять столбцы, можно организовать второй курсор,
в котором вытаскивать их из представления sys.user_tab_columns
и должным образом конкатенировать их в одну строку.
после чего использовать динамический SQL.
...
Рейтинг: 0 / 0
Перекачка из одной таблицы в другую
    #32089235
vskv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
cursor c1 is select rowid, pk_row from table1; 
c1_var c1%rowtype; 

BEGIN 
 open c1; 
 loop 
   fetch c1 into c1_var; 
   exit when c1%notfound; 
   begin 
     insert into table2 
     select from table1 T1
        where T1.rowid=c1_var.rowid;
     commit; 
   exception 
    when dup_val_on_index then 
     null; 
   end; 
 end loop; 
 close c1; 
 EXCEPTION 
  WHEN others THEN 
   null ; 
END; 
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Перекачка из одной таблицы в другую
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]