Исходный код для определенной хранимой процедуры или функции

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

Что-то вроде этого:

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

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

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

Аплодисменты заранее

5
задан Chris 9 July 2010 в 10:29
поделиться

1 ответ

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

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

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

3
ответ дан 15 December 2019 в 06:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: