Исходный код для конкретной хранимой процедуры или функции - PullRequest
5 голосов
/ 09 июля 2010

Я могу использовать all_arguments и all_procedures для перечисления процедур и функций внутри любого данного пакета, а с помощью DBMS_METADATA я могу извлечь DDL для этого пакета. Существует ли простой способ (кроме большого количества вызовов вхождений и подстрок) получить исходный код процедуры или функции отдельно для каждого отдельного блока кода в пакете.

Примерно так:

Владелец | Название пакета | Имя объекта | Перегрузка | Аргументы | Источник

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

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

Приветствия заранее

1 Ответ

3 голосов
/ 09 июля 2010

IIRC, PLSQL допускает вложенные пакеты и функции. В этом случае вы обнаружите, что «instring» и «substring» могут оказаться недостаточными для извлечения исходного кода, поскольку вы сталкиваетесь с рекурсией, а строковые функции обычно обрабатывают только меньший класс вычислений (обычно регулярные выражения). Это классическая проблема, с которой люди пытаются разобрать языки простым манипулированием строками. Вы можете обойти ограничения строковых функций, по сути взломав, чтобы создать парсер бедного человека, но это может быть удивительно много работы, если вы хотите, чтобы это было смертельно правильно, потому что вы должны обрабатывать по крайней мере рекурсивные грамматические правила, которые важны для экстракция.

Другим способом получения надежного доступа к элементам пакета PLSQL является использование синтаксического анализатора языка. DMS Software Reengineering Toolkit имеет полный анализатор PLSQL.

Сначала вам нужно будет извлечь текст пакета в файл, а затем применить к нему анализатор PLSQL; это создает абстрактное синтаксическое дерево (AST) внутри парсера. Учитывая имя функции, довольно просто найти AST для функции с соответствующим именем. Вы бы получили более одного удара, если у вас есть перегруженные функции; Вы можете квалифицировать функцию по иерархии, в которую она встроена, или по информации об аргументах, которые у вас могут быть. Определив конкретную функцию в AST, можно попросить DMS красиво распечатать это дерево, и оно восстановит текст (с комментариями) для этой функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...