Oracle - как найти столбцы в таблице + хранимые процедуры, зависящие от них? - PullRequest
2 голосов
/ 01 октября 2009

Сценарий:

Мне нужно перечислить все столбцы в table1 и все хранимые процедуры, которые зависят от этих столбцов этого table1. Мне нужно заполнить имя столбца и хранимые процедуры в новой таблице.

Я создал new_table(col1, sProc) и попытался заполнить имя столбца и соответствующую хранимую процедуру на этом new_table. Код, который я написал, приведен ниже:

Declare

Begin

for i in (select column_name from user_tab_columns where lower(table_name) like 'table1') loop

insert into new_table
  select i.column_name, 
        name 
   from user_source 
  where lower(text) like '%' || i.column_name || '%';

commit;

end loop;

end;

Результат: Сценарии выполняются успешно, но в новой таблице нет данных.

Стресс: Я пытался решить это за 1 целый день и не мог понять это. Любая помощь в этом будет с благодарностью. Еще раз, спасибо.

Ответы [ 3 ]

1 голос
/ 01 октября 2009

Одна очевидная проблема заключается в том, что вы конвертируете текст процедуры в нижний регистр, а не имя нужного столбца.

Однако у этого кода есть другие проблемы. Что произойдет, если имя столбца совпадает с некоторой частью текста, которая не является ссылкой на столбец?

0 голосов
/ 01 октября 2009

Вы можете уменьшить количество ложных срабатываний, включив в запрос USER_DEPENDENCIES. Вы можете захотеть ограничить поиск типов (или альтернативно включить TYPE в NEW_TABLE).

insert into new_table (col1, sproc)
    select distinct tc.column_name, sp.name     
    from user_tab_columns tc
            , user_source sp
            , user_dependencies d
    where d.referenced_name = 'TABLE1'
    and   d.referenced_type = 'TABLE'
    and   d.type IN ('PACKAGE', 'PACKAGE BODY', 'FUNCTION'
             , 'PROCEDURE',  'TYPE', 'TRIGGER')
    and   tc.table_name = 'TABLE1'
    and   sp.name = d.name
    and   instr(lower(sp.text), lower(tc.column_name)) > 0
/
0 голосов
/ 01 октября 2009

Лучшее, что вы сможете сделать, это указать имя пакета (так как это значение в поле USER_SOURCE.NAME) вместе со столбцом. Как указывает в своем комментарии rexem, вам не нужно прибегать к циклу for:

 INSERT INTO new_table (col1, sproc) 
    SELECT i.column_name, u.name 
    FROM user_tab_columns i, 
         user_source u 
    WHERE lower(i.table_name) like 'table1' 
      AND lower(u.text) like '%' || lower(i.column_name) || '%';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...