Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Перекачка из одной таблицы в другую / 17 сообщений из 17, страница 1 из 1
10.01.2003, 14:28
    #32088828
Boytronic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекачка из одной таблицы в другую
Добрый день. Не могли бы вы, господа, помочь мне в следующем вопросе. Есть совершенно две одинаковые таблицы, связь между которыми осуществляется через DBLink. Нужно написать скрипт по перекачке данных из одной таблицы в другую, НО на таблицы наложен CONSTRAINT, который не позволяет вставлять дублированные строки. Так и нужно, дублированные строки не нужны, но, данные в таблицах могут повторяться, поэтому, когда я запускаю скриптик типа: INSERT INTO table1@DBLink SELECT * FROM table1 начинается отработка скрипта, затем он доходит до первого констрэйнта и вываливается. Понимаю, что надо писать на PL/SQL с обработкой исключительной ситуации, но дело довольно срочное, а копаться с PL/SQL нет времени...:-). Может быть, кто - то поможет? Заранее благодарен. Андрей...:-)
...
Рейтинг: 0 / 0
10.01.2003, 14:40
    #32088844
Allexx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекачка из одной таблицы в другую
Ну и напиши
insert into a...
select from b...
where not exists
(select * from a where a.ключ=b.ключ)
...
Рейтинг: 0 / 0
10.01.2003, 14:52
    #32088852
Boytronic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекачка из одной таблицы в другую
Спасибо, Алекс, что ответили. Дело в том, что я не стал это писать в первом постинге - да, я пытался делать так, как Вы советуете, но при этом SQLplus так четко "зависает", что я бросил эти попытки и подумал, что вводить надо именно построчно! Ресурсов не хватает, вот в чем дело - идет ругань на роллбэки и т.п....:-)
...
Рейтинг: 0 / 0
10.01.2003, 14:57
    #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
10.01.2003, 14:59
    #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
10.01.2003, 15:05
    #32088871
.dba
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекачка из одной таблицы в другую
форма записи insert ... select ... это просто возможность объединить два sql выражения в одно, так что вполне естественно, что вторая часть ничего не знает о первой.

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

...WHERE a.col1 NOT IN...
Во-первых надо b.col
А во вторых уж точно not exists, а не not in
...
Рейтинг: 0 / 0
10.01.2003, 15:43
    #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
10.01.2003, 16:24
    #32088958
Boytronic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекачка из одной таблицы в другую
Денису: Да, неплохая идея, если дело касается одноразовой перекачки. Сделал себе табличку, влил туды и экспериментируй как хош, в случае чего можно новую слабать. Но если надо делать регулярные вливания(скажем, раз в сутки), то, сами понимаете...:-) Алексу: Примите мои соболезнования, если б я знал, что у Вас будут проблемы...Теперь становится понятно, что есть такое перекачать из таблы в таблу. Это только на первый взгляд кажется просто...:-) Саиду: большое спасибо. Опробую я этот скрипт, скорее всего, уже в понедельник, НО мне не очень понравилось перечесление столбцов там, где VALUES. Дело в том, что в таблице их около сотни и...сами понимаете....Нельзя ли по - простому ,по - бразильски SELECT * сделать? :-)
...
Рейтинг: 0 / 0
10.01.2003, 16:42
    #32088974
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекачка из одной таблицы в другую
Я таким макаром качал десятка полтора разных таблиц по несколько раз на дню. Точнее, вокруг всего этого были написаны процедуры, производящие все необходимые действия: очистка временной таблицы (через truncate), импорт удаленных данных, проверка на их правильность, импорт в боевые таблицы, рассылка отчетов о проделанной работе. Так что если у подобные перекачки регулярны, со временем они обрастут приготовленными скриптами на проведение всех операций.
...
Рейтинг: 0 / 0
10.01.2003, 16:53
    #32088988
Oleg Afanasiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекачка из одной таблицы в другую
По-моему лучше написать скрипт на plsql и горя не знать.
При таком подходе можно каждую запись проверять на валидность.
...
Рейтинг: 0 / 0
10.01.2003, 17:30
    #32089020
Allexx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекачка из одной таблицы в другую
сотни записей? и запрос вешается? я пятьдесят тысяч перегнать пытался:)
...
Рейтинг: 0 / 0
10.01.2003, 17:30
    #32089021
Boytronic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекачка из одной таблицы в другую
Олегу Афанасьеву - совершенно с Вами согласен. Я, собственно и спрашивал о конкретном скрипте...:-)))
...
Рейтинг: 0 / 0
10.01.2003, 17:32
    #32089023
[IPT]-Said
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекачка из одной таблицы в другую
2Boytronik
Чтобы не перечислять столбцы, можно организовать второй курсор,
в котором вытаскивать их из представления sys.user_tab_columns
и должным образом конкатенировать их в одну строку.
после чего использовать динамический SQL.
...
Рейтинг: 0 / 0
11.01.2003, 22:34
    #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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Перекачка из одной таблицы в другую / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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