Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 truncate для n связанных таблиц  [new]
ssadmn
Member

Откуда: Moscow
Сообщений: 217
Привет ВСЕм!! :)
Ситуация:
есть таблица A, хочу сделать
truncate table A
, но из-за того что у неё есть подчинённая таблица B, то вылезает ошибка ORA 02266
это естесственно и всё понятно,
сделать
alter table B disable constraint ххх
, а потом
truncate table A
,
truncate table B
, потом естественно включить всё назад и всё ок, НО!!!
если у таблицы B в свою очередь есть своя подчинённая таблица C и при
truncate table B
оно скажет туже ошибку, нужно отключать ключи подчинённой
таблицы C и т.д., в зависимости от сложности структуры БД.
Терь вопрос:
КАК ПОСМОРЕТЬ ВСЕ ЭТИ CONSTRAINTS ВМЕСТЕ, УКАЗАВ ТОЛЬКО ИМЯ ТАБЛИЦЫ A, И ЧТОБЫ В ИТОГЕ ОНА ВЫДАЛА ВСЕ CONSTRAINTS ПО ВСЕМ СВЯЗАННЫМ ТАБЛИЦАМ????
сПАСИБ ВСЕМ КТО ОТКЛИКНЕЦА...!!!:)
а ЗАЧЕМ МНЕ ЭТО НАДО? зАТЕМ, ЧТОБЫ УКАЗАТЬ TRUNCATE ДЛЯ ТАБЛИЦЫ A И ВСЕ ПОДЧИНЁННЫЕ ЕЁ ТАБЛИЦЫ САМИ ОЧИСТИЛИСЬ.
!!! командная строка FOREVER !!! :):):)
4 мар 07, 17:25    [3860032]     Ответить | Цитировать Сообщить модератору
 Re: truncate для n связанных таблиц  [new]
Denis Popov
Member

Откуда: Санкт-Петербург
Сообщений: 7862
create or replace procedure truncate_table (p_table_name varchar2) as
begin
  for i in (
    select c2.table_name, c2.constraint_name
    from USER_CONSTRAINTS c
         join USER_CONSTRAINTS c2
           on c.constraint_name = c2.r_constraint_name
    where 1=1
      and c.table_name = p_table_name
  ) loop
    execute immediate 'alter table '||i.table_name||' disable constraint '||i.constraint_name;
  end loop;
  execute immediate 'truncate table '||p_table_name;
  for i in (  
    select c2.table_name, c2.constraint_name
    from USER_CONSTRAINTS c
         join USER_CONSTRAINTS c2
           on c.constraint_name = c2.r_constraint_name
    where 1=1
      and c.table_name = p_table_name
  ) loop
    truncate_table (p_table_name => i.table_name); 
  end loop;
  for i in (
    select c2.table_name, c2.constraint_name
    from USER_CONSTRAINTS c
         join USER_CONSTRAINTS c2
           on c.constraint_name = c2.r_constraint_name
    where 1=1
      and c.table_name = p_table_name
  ) loop
    execute immediate 'alter table '||i.table_name||' enable constraint '||i.constraint_name;
  end loop;
end;
/
4 мар 07, 18:28    [3860106]     Ответить | Цитировать Сообщить модератору
 Re: truncate для n связанных таблиц  [new]
ssadmn
Member

Откуда: Moscow
Сообщений: 217
спасибо огромное, я знал что такое рекурсия, но не знал некоторых вещей, а именно:
1. структуру представления "USER_CONSTRAINTS"
2. можно ли рекурсию применять в pl/sql

пытался по началу её сделать при помощи пакета на pl/sql на глобальных переменных, но переменные по итогу переинициализировались при большей иерархии ))

еще раз убеждаюсь что PL/SQL не так уж прост по сути своей как кажется, нужно знать где искать и обязательно найдешь то, что ищешь...

СПАСИБО ОГРОМНОЕ ЕЩЁ РАЗ!!! )))

!!! командная строка FOREVER !!! :):):)
4 мар 07, 18:59    [3860167]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить