Nano Hash - криптовалюты, майнинг, программирование

Как проверить, где в каком-то другом пакете/процедуре используется/ссылается на мою процедуру (внутри пакета)?

Скажем, у меня есть пакет my_package с процедурой my_procedure.

Я хочу знать, из каких other_procedures (в некоторых других пакетах) эта процедура используется/вызывается (например, из my_other_package.my_other_procedure)

Это вообще возможно? Если возможно, то как?

Обновление 1:

Я могу использовать ALL_DEPENDENCIES, но проблема с ALL_DEPENDENCIES в том, что он дает мне список объектов, которые используют my_package вообще, а не my_procedure в нем. my_package имеет около 50 нечетных функций и процедур, а запрос к ALL_DEPENDENCIES для пакета my_package дает мне 30 нечетных результатов.

Моя схема базы данных огромна, и запрос ALL_SOURCES занимает целую вечность.

Обновление 2:

Следующий запрос, созданный с помощью приведенных ниже ответов, кажется, работает достаточно хорошо:

 select /*+  parallel(als, 16) */   * from all_source als 
 where type in ('PROCEDURE','PACKAGE BODY')
 and name in ( select NAME from all_Dependencies where referenced_name  = 'OE_HEADER_UTIL')
 and upper(text) like '%INSERT_ROW%';
12.11.2014

Ответы:


1

Попробуйте использовать представление ALL_SOURCE, оно содержит исходный код всех хранимых процедур, а лучше ALL_DEPENDENCIES.

12.11.2014
  • @Arnab Я думаю, что это связано с концепцией скрытия реализации. Вы знаете, что ваша процедура зависит от всего пакета, и вы не знаете реализацию пакета (вы не должны зависеть от реализации). Если ваше представление ALL_SOURCE слишком велико, попробуйте скопировать его часть с вашим пакетом в другую таблицу и проанализируйте эту копию. 12.11.2014

  • 2

    Мое решение (немного сложное, но оно работает для моих пакетов):

    SET SERVEROUTPUT ON
    
    DECLARE
      l_own    VARCHAR2 (30) := 'YOUR_OWNER'; -- package owner
      l_obj    VARCHAR2 (30) := 'YOUR_PACKAGE'; -- package name
      l_priv   VARCHAR2 (30);
      l_cnt    NUMBER := 0;
    BEGIN
      DBMS_OUTPUT.put_line ('Checking required privileges for [' || l_own || '.' || l_obj || ']');
      DBMS_OUTPUT.put_line ('TABLES and VIEWS');
    
      SELECT MAX (line)
        INTO l_cnt
        FROM all_source
       WHERE owner = l_own AND name = l_obj AND TYPE = 'PACKAGE BODY';
    
      IF l_cnt = 0 THEN
        DBMS_OUTPUT.put_line (
          'ERROR - Cannot read the [' || l_own || '.' || l_obj || '] package sources!');
        RETURN;
      END IF;
    
      FOR x IN (WITH txt AS
                       (SELECT line, UPPER (text) text, 'FROM\s*([_|\$|[:upper:]]+)' regexp
                          FROM all_source
                         WHERE owner = l_own AND name = l_obj AND REGEXP_INSTR (text, 'FROM\s*') > 0),
                     tabs AS
                       (SELECT line, text, tab
                          FROM (    SELECT line,
                                           text,
                                           REGEXP_REPLACE (REGEXP_REPLACE (REGEXP_SUBSTR (text,
                                                                                          regexp,
                                                                                          1,
                                                                                          LEVEL),
                                                                           '^FROM\s*'),
                                                           '^V\$',
                                                           'V_$')
                                             tab
                                      FROM txt
                                CONNECT BY REGEXP_SUBSTR (text,
                                                          regexp,
                                                          1,
                                                          LEVEL)
                                             IS NOT NULL)
                         WHERE tab IS NOT NULL AND NOT REGEXP_LIKE (tab, 'DUAL|TABLE')),
                     syns AS
                       (SELECT line,
                               text,
                               tab,
                               table_owner syn_own,
                               NVL (table_name, tab) syn_obj
                          FROM tabs INNER JOIN all_synonyms ON synonym_name(+) = tabs.tab),
                     syns_objs AS
                       (SELECT object_type typ, NVL (syn_own, owner) own, syn_obj obj
                          FROM syns INNER JOIN dba_objects ON syns.syn_obj = object_name)
                  SELECT DISTINCT typ, own, obj
                    FROM syns_objs
                   WHERE typ <> 'SYNONYM'
                ORDER BY typ, own, obj) LOOP
        BEGIN
          SELECT DISTINCT privilege
            INTO l_priv
            FROM dba_tab_privs
           WHERE table_name = x.obj AND owner = x.own;
        EXCEPTION
          WHEN NO_DATA_FOUND THEN
            NULL;
        END;
        DBMS_OUTPUT.put_line (
          RPAD ('. [' || x.typ || ']:' || x.own || '.' || x.obj, 80, ' ')||
          NVL (l_priv, 'NO_PRIVILEGE'));
      END LOOP;
      DBMS_OUTPUT.put_line ('PACKAGES');
      FOR x
        IN (  SELECT lvl,
                     object_type typ,
                     owner own,
                     object_name obj
                FROM (    SELECT LEVEL lvl, object_id
                            FROM public_dependency s
                      START WITH s.object_id =
                                   (SELECT object_id
                                      FROM all_objects
                                     WHERE     owner = l_own
                                           AND object_name = l_obj
                                           AND object_type = 'PACKAGE BODY')
                      CONNECT BY s.object_id = PRIOR referenced_object_id
                        GROUP BY LEVEL, object_id) tree,
                     all_objects u
               WHERE tree.object_id = u.object_id AND u.owner <> 'PUBLIC'
            ORDER BY lvl) LOOP
        BEGIN
          SELECT DISTINCT privilege
            INTO l_priv
            FROM dba_tab_privs
           WHERE table_name = x.obj AND owner = x.own;
        EXCEPTION
          WHEN NO_DATA_FOUND THEN
            NULL;
        END;
        DBMS_OUTPUT.put_line (
          RPAD (LPAD ('.', x.lvl, '.') || '[' || x.typ || ']:' || x.own || '.' || x.obj, 80, ' ')||
          NVL (l_priv, 'NO_PRIVILEGE'));
      END LOOP;
    END;
    /
    
    12.11.2014
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..