|
|
|
Перекачка из одной таблицы в другую
|
|||
|---|---|---|---|
|
#18+
Добрый день. Не могли бы вы, господа, помочь мне в следующем вопросе. Есть совершенно две одинаковые таблицы, связь между которыми осуществляется через DBLink. Нужно написать скрипт по перекачке данных из одной таблицы в другую, НО на таблицы наложен CONSTRAINT, который не позволяет вставлять дублированные строки. Так и нужно, дублированные строки не нужны, но, данные в таблицах могут повторяться, поэтому, когда я запускаю скриптик типа: INSERT INTO table1@DBLink SELECT * FROM table1 начинается отработка скрипта, затем он доходит до первого констрэйнта и вываливается. Понимаю, что надо писать на PL/SQL с обработкой исключительной ситуации, но дело довольно срочное, а копаться с PL/SQL нет времени...:-). Может быть, кто - то поможет? Заранее благодарен. Андрей...:-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2003, 14:28 |
|
||
|
Перекачка из одной таблицы в другую
|
|||
|---|---|---|---|
|
#18+
Ну и напиши insert into a... select from b... where not exists (select * from a where a.ключ=b.ключ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2003, 14:40 |
|
||
|
Перекачка из одной таблицы в другую
|
|||
|---|---|---|---|
|
#18+
Спасибо, Алекс, что ответили. Дело в том, что я не стал это писать в первом постинге - да, я пытался делать так, как Вы советуете, но при этом SQLplus так четко "зависает", что я бросил эти попытки и подумал, что вводить надо именно построчно! Ресурсов не хватает, вот в чем дело - идет ругань на роллбэки и т.п....:-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2003, 14:52 |
|
||
|
Перекачка из одной таблицы в другую
|
|||
|---|---|---|---|
|
#18+
...Да и еще забыл. Дело в том, что таблица, связь с которой идет по 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... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2003, 14:57 |
|
||
|
Перекачка из одной таблицы в другую
|
|||
|---|---|---|---|
|
#18+
Версия Оракла какая? Если 9i, то может MERGE INTO стаботает быстрее, чем INSERT INTO, и можно обработать дубликаты: http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96540/statements_915a.htm#2090700 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2003, 14:59 |
|
||
|
Перекачка из одной таблицы в другую
|
|||
|---|---|---|---|
|
#18+
форма записи insert ... select ... это просто возможность объединить два sql выражения в одно, так что вполне естественно, что вторая часть ничего не знает о первой. А чтоб закачать данные отключите констреинты на таблице, затем вставьте данные, удалите дублирующиеся строки, включите констреинты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2003, 15:05 |
|
||
|
Перекачка из одной таблицы в другую
|
|||
|---|---|---|---|
|
#18+
Версия Oracle 8i. Насчет отключения констрэйнтов - не катит, так как база данных работает в горячем режиме и весьма нежелательно, чтобы они отключались. Относительно же удаления дублей - так это вообще делать боязно на "живой" базе, тем паче, что я этого не делал, да и, пожалуй, полагаю, что ресурсов не хватит....:-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2003, 15:22 |
|
||
|
Перекачка из одной таблицы в другую
|
|||
|---|---|---|---|
|
#18+
Тогда создай еще одну таблицу рядом с боевой, одинаковую с ней по структуре. Заливай через линк данные в нее, потом вставляй уже в боевую. Предварительно можешь почистить дубли, или просто запусти запрос по типу предложенного выше, через not exists. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2003, 15:29 |
|
||
|
Перекачка из одной таблицы в другую
|
|||
|---|---|---|---|
|
#18+
Хотел вам примерчик процедурки бросить, но, похоже, своими испытаниями я наш сервак грохнул)) ...WHERE a.col1 NOT IN... Во-первых надо b.col А во вторых уж точно not exists, а не not in ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2003, 15:35 |
|
||
|
Перекачка из одной таблицы в другую
|
|||
|---|---|---|---|
|
#18+
А собственно чего такого страшного с 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 внутри цикла не есть хорошо, но попробовать можно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2003, 15:43 |
|
||
|
Перекачка из одной таблицы в другую
|
|||
|---|---|---|---|
|
#18+
Денису: Да, неплохая идея, если дело касается одноразовой перекачки. Сделал себе табличку, влил туды и экспериментируй как хош, в случае чего можно новую слабать. Но если надо делать регулярные вливания(скажем, раз в сутки), то, сами понимаете...:-) Алексу: Примите мои соболезнования, если б я знал, что у Вас будут проблемы...Теперь становится понятно, что есть такое перекачать из таблы в таблу. Это только на первый взгляд кажется просто...:-) Саиду: большое спасибо. Опробую я этот скрипт, скорее всего, уже в понедельник, НО мне не очень понравилось перечесление столбцов там, где VALUES. Дело в том, что в таблице их около сотни и...сами понимаете....Нельзя ли по - простому ,по - бразильски SELECT * сделать? :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2003, 16:24 |
|
||
|
Перекачка из одной таблицы в другую
|
|||
|---|---|---|---|
|
#18+
Я таким макаром качал десятка полтора разных таблиц по несколько раз на дню. Точнее, вокруг всего этого были написаны процедуры, производящие все необходимые действия: очистка временной таблицы (через truncate), импорт удаленных данных, проверка на их правильность, импорт в боевые таблицы, рассылка отчетов о проделанной работе. Так что если у подобные перекачки регулярны, со временем они обрастут приготовленными скриптами на проведение всех операций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2003, 16:42 |
|
||
|
Перекачка из одной таблицы в другую
|
|||
|---|---|---|---|
|
#18+
По-моему лучше написать скрипт на plsql и горя не знать. При таком подходе можно каждую запись проверять на валидность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2003, 16:53 |
|
||
|
Перекачка из одной таблицы в другую
|
|||
|---|---|---|---|
|
#18+
сотни записей? и запрос вешается? я пятьдесят тысяч перегнать пытался:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2003, 17:30 |
|
||
|
Перекачка из одной таблицы в другую
|
|||
|---|---|---|---|
|
#18+
Олегу Афанасьеву - совершенно с Вами согласен. Я, собственно и спрашивал о конкретном скрипте...:-))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2003, 17:30 |
|
||
|
Перекачка из одной таблицы в другую
|
|||
|---|---|---|---|
|
#18+
2Boytronik Чтобы не перечислять столбцы, можно организовать второй курсор, в котором вытаскивать их из представления sys.user_tab_columns и должным образом конкатенировать их в одну строку. после чего использовать динамический SQL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2003, 17:32 |
|
||
|
Перекачка из одной таблицы в другую
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2003, 22:34 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=32088974&tid=1992231]: |
0ms |
get settings: |
7ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
57ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
| others: | 228ms |
| total: | 388ms |

| 0 / 0 |
