Пакет DBMS_PREPROCESSOR
используется для вывода или получения исходного текста вашей программы в обработанной (postprocessed
) форме. DBMS_PREPROCESSOR
предоставляет две программы, перегруженные для разных способов определения интересующего вас объекта, а также для использования отдельных строк и коллекций:
dbms_preprocessor.print_post_processed_source
— получает обработанный исходный код и выводит его функциейDBMS_OUTPUT.PUT_LINE
.dbms_preprocessor.get_post_processed_source
— возвращает обработанный исходный код в виде одной строки или коллекции строк.
При использовании версий этих программ, работающих с коллекциями, необходимо объявить, что коллекция базируется на следующей коллекции, определенной в пакете:
TYPE DBMS_PREPROCESSOR.source_lines_t IS TABLE OF VARCHAR2(32767)
INDEX BY BINARY_INTEGER;
Следующий фрагмент демонстрирует возможности этих программ. Сначала я компилирую очень маленькую программу с директивой выбора, проверяющей уровень оптимизации, а затем вывожу обработанный код с правильной ветвью команды $IF
:
PROCEDURE post_processed
IS
BEGIN
$IF $$PLSQL_OPTIMIZE_LEVEL = 1
$THEN
-- Медленно и просто
NULL;
$ELSE
-- Быстро, современно и просто
NULL;
$END
END post_processed;
SQL> BEGIN
2 DBMS_PREPROCESSOR.PRINT_POST_PROCESSED_SOURCE (
3 'PROCEDURE', USER, 'POST_PROCESSED');
4 END;
5 /
PROCEDURE post_processed
IS
BEGIN
-- Быстро, современно и просто
NULL;
END post_processed;
В следующем блоке функция get
используется для получения обработанного кода, а затем выводит его вызовом dbms_output.put_line
:
DECLARE
l_postproc_code DBMS_PREPROCESSOR.SOURCE_LINES_T;
l_row PLS_INTEGER;
BEGIN
l_postproc_code :=
DBMS_PREPROCESSOR.GET_POST_PROCESSED_SOURCE (
'PROCEDURE', USER, 'POST_PROCESSED');
l_row := l_postproc_code.FIRST;
WHILE (l_row IS NOT NULL)
LOOP
DBMS_OUTPUT.put_line ( LPAD (l_row, 3)
|| ' - '
|| rtrim ( l_postproc_code (l_row),chr(10))
);
l_row := l_postproc_code.NEXT (l_row);
END LOOP;
END;
Условная компиляция открывает массу полезных возможностей для разработчиков PL/ SQL
и администраторов приложений. Она становится еще более полезной с выходом новых версий базы данных Oracle и расширением набора констант DBMS_DB_VERSION
, позволяющим более полно использовать особенности PL/SQL
каждой версии.