- 01
 - 02
 - 03
 - 04
 - 05
 - 06
 - 07
 - 08
 - 09
 - 10
 - 11
 - 12
 - 13
 - 14
 - 15
 - 16
 - 17
 - 18
 - 19
 - 20
 - 21
 - 22
 - 23
 - 24
 - 25
 - 26
 - 27
 - 28
 - 29
 - 30
 - 31
 - 32
 - 33
 - 34
 - 35
 - 36
 - 37
 - 38
 - 39
 - 40
 - 41
 - 42
 - 43
 - 44
 - 45
 - 46
 - 47
 - 48
 - 49
 - 50
 - 51
 - 52
 - 53
 - 54
 - 55
 - 56
 - 57
 - 58
 - 59
 - 60
 - 61
 - 62
 - 63
 
                        -- Я ТУТ ИСПОЛЬЗУЮ 2 КУРСОРА, 
-- причем 2рой вызывается изнутри первого, 
-- причем этот 2рой курсор ПОЛНОСТЬЮ (в худшем случае) 
-- перебирает все свои значения, чтобы подставить одно.
-- ВОПРОС: как сделать так, чтоб работало так же, но чтоб не так яро грузилось???
DECLARE 
  CURSOR get_col1 IS
    SELECT DISTINCT 
	a.constraint_name, 
  a.constraint_type,
  a.table_name,
  a.r_constraint_name,
  b.column_name
    FROM all_constraints a, all_cons_columns b
    WHERE a.table_name = b.table_name
  AND a.constraint_type in ('P', 'R')
  AND a.constraint_name = b.constraint_name
    ORDER by 1;
  
  CURSOR get_col2 IS
    SELECT constraint_name, table_name, column_name 
    FROM all_cons_columns
    WHERE constraint_name in 
          (select r_constraint_name 
           from all_constraints 
           where constraint_type = 'R');
    
BEGIN
  dbms_output.ENABLE;
  dbms_output.put_line(rpad('Имя ограничения', 30)
            ||rpad('Тип', 5)
            ||rpad('Имя столбца', 30)
            ||rpad('Имя таблицы', 30)
            ||rpad('Имя таблицы', 30)
            ||rpad('Имя столбца', 30));
  dbms_output.put_line(rpad('-', 155, '-'));
  
  FOR main_col IN get_col1 LOOP
    dbms_output.put(rpad(to_char(main_col.constraint_name), 30)
      ||rpad(to_char(main_col.constraint_type), 5)
      ||rpad(to_char(main_col.column_name), 30)
      ||rpad(to_char(main_col.table_name), 30));
    
    IF (main_col.constraint_type = 'R') THEN
      
         FOR sec_col IN get_col2 LOOP
              
              IF (main_col.r_constraint_name = sec_col.constraint_name) THEN
                
                dbms_output.put(rpad(to_char(sec_col.table_name), 30)
                                   ||rpad(to_char(sec_col.column_name), 30));
              END IF;
              
         END LOOP;
    
    END IF;
    
    dbms_output.new_line();  
  END LOOP;
END;
/
                                     
        
            7. Используя сведения из представлений словаря данных получить
   информацию о первичных и внешних ключах схемы: Номер по порядку,
   Имя ограничения целостности, Тип, Имя столбца, Имя таблицы.
   Кроме того, для внешних ключей указать Имя таблицы и Имя столбца
   на которые ссылаются эти ключи.