
Доступ к тексту хранимых процедур в Oracle SQL необходим для анализа логики работы, внесения изменений или документирования существующей базы. Код можно извлечь напрямую из системных представлений, не прибегая к внешним инструментам. Основной источник – представления USER_SOURCE, ALL_SOURCE и DBA_SOURCE, где каждая строка соответствует фрагменту программы.
Если требуется просмотреть собственные процедуры, достаточно выполнить запрос к USER_SOURCE с фильтрацией по имени объекта. Для получения кода процедур, созданных другими пользователями, используется ALL_SOURCE, а для полного доступа ко всем объектам схем – DBA_SOURCE. В последнем случае необходимы административные права.
Структура представлений одинакова: ключевыми полями являются NAME (имя объекта), TYPE (тип – процедура, функция, пакет и т.д.), LINE (номер строки) и TEXT (содержимое). Чтобы получить полный текст процедуры в читаемом виде, нужно отсортировать данные по полю LINE и объединить их в правильной последовательности.
Такой подход позволяет восстановить код без использования IDE и сторонних средств, работать с ним внутри SQL*Plus, SQLcl или любых других инструментов, поддерживающих выполнение запросов к системным представлениям.
Подключение к базе данных через SQL*Plus или другой клиент

Для работы с исходным кодом процедур необходимо установить соединение с целевой схемой Oracle. Один из надёжных способов – использовать утилиту SQL*Plus, входящую в стандартный набор инструментов Oracle. Подключение выполняется командой:
sqlplus username/password@//host:port/service_name
Если используется локальная база с настроенным tnsnames.ora, достаточно указать алиас подключения:
sqlplus username/password@alias
Для подключения с правами администратора применяется ключ AS SYSDBA:
sqlplus sys/password@alias AS SYSDBA
Альтернатива – графические клиенты, например Oracle SQL Developer или DBeaver. В них требуется указать тип подключения (Basic или TNS), параметры хоста, порт, сервис и имя пользователя. После успешной аутентификации можно выполнять команды SELECT из системных представлений или обращаться к пакетам DBMS_METADATA для извлечения кода процедур.
Для повышения безопасности не рекомендуется передавать пароль в явном виде. Можно использовать переменные окружения или подключение без пароля через внешнюю аутентификацию, настроив файл sqlnet.ora и локальную учетную запись Oracle.
Проверка существования процедуры в словарях данных

Для определения наличия процедуры удобно использовать представления словарей данных: USER_OBJECTS, ALL_OBJECTS или DBA_OBJECTS. Выбор зависит от уровня доступа. Если требуется проверить процедуру в текущей схеме, достаточно обратиться к USER_OBJECTS:
SELECT object_name FROM user_objects WHERE object_type = 'PROCEDURE' AND object_name = 'MY_PROC';
Если запрос должен учитывать объекты в других схемах, используется ALL_OBJECTS. В этом случае нужно дополнительно указать схему:
SELECT owner, object_name FROM all_objects WHERE object_type = 'PROCEDURE' AND object_name = 'MY_PROC' AND owner = 'SCHEMA_NAME';
Для администраторов доступно DBA_OBJECTS, что позволяет просматривать процедуры во всех схемах без дополнительных прав на конкретные объекты:
SELECT owner, object_name FROM dba_objects WHERE object_type = 'PROCEDURE' AND object_name = 'MY_PROC';
Сравнение выполняется в верхнем регистре, так как имена объектов в словарях данных хранятся без учёта регистра. Если процедура не найдена, запрос не вернёт строк, что удобно использовать в PL/SQL-блоках для условной логики проверки перед выполнением EXECUTE или повторным созданием процедуры.
Использование представления ALL_SOURCE для просмотра кода
Представление ALL_SOURCE позволяет просматривать текст процедур, функций, пакетов и триггеров, к которым есть доступ. Каждая строка кода хранится в отдельной записи, что даёт возможность точно восстановить полный текст объекта.
Основные столбцы представления:
| Столбец | Назначение |
|---|---|
OWNER |
Схема, в которой расположен объект |
NAME |
Имя процедуры, функции или пакета |
TYPE |
Тип объекта (PROCEDURE, FUNCTION, PACKAGE и т.д.) |
LINE |
Номер строки кода |
TEXT |
Фрагмент текста соответствующей строки |
SELECT text
FROM all_source
WHERE name = 'MY_PROCEDURE' AND type = 'PROCEDURE' AND owner = 'HR'
ORDER BY line;
Регистр значений в столбцах NAME и TYPE обычно верхний, поэтому при использовании переменных рекомендуется применять функцию UPPER(). Чтобы собрать результат в один текстовый блок, удобно использовать агрегатную функцию LISTAGG:
SELECT LISTAGG(text, '') WITHIN GROUP (ORDER BY line) AS code
FROM all_source
WHERE name = UPPER('my_procedure') AND type = 'PROCEDURE' AND owner = UPPER('hr');
Если объект принадлежит другой схеме и нет прямого доступа, необходимо получить привилегию SELECT ANY DICTIONARY или конкретные права на представление ALL_SOURCE. В противном случае запрос не вернёт данные.
Извлечение кода процедуры с помощью представления DBA_SOURCE
Представление DBA_SOURCE содержит текст всех хранимых объектов базы данных, включая процедуры, функции, пакеты и триггеры. Доступ к нему обычно имеют пользователи с системными привилегиями, например SELECT_CATALOG_ROLE или DBA.
Для извлечения кода процедуры можно использовать следующий запрос:
SELECT TEXT
FROM DBA_SOURCE
WHERE NAME = 'НАЗВАНИЕ_ПРОЦЕДУРЫ'
AND TYPE = 'PROCEDURE'
ORDER BY LINE;
Ключевые моменты:
- NAME – имя процедуры в верхнем регистре, как она хранится в словаре данных.
- TYPE – тип объекта. Для процедур значение должно быть
PROCEDURE. - ORDER BY LINE обеспечивает восстановление текста в правильной последовательности.
Если процедура находится в определённой схеме, добавьте условие по владельцу:
SELECT TEXT
FROM DBA_SOURCE
WHERE OWNER = 'ИМЯ_СХЕМЫ'
AND NAME = 'НАЗВАНИЕ_ПРОЦЕДУРЫ'
AND TYPE = 'PROCEDURE'
ORDER BY LINE;
Рекомендации:
- Проверяйте права доступа к
DBA_SOURCE. При их отсутствии используйтеALL_SOURCEилиUSER_SOURCE. - Сохраняйте результат в файл, чтобы упростить анализ и версионирование кода.
Получение кода из USER_SOURCE для своих объектов

Просмотр текста собственных процедур, функций и пакетов осуществляется через представление USER_SOURCE. В нём хранится исходный код объектов по строкам, что позволяет восстановить полный текст в правильном порядке.
Основные колонки:
| Колонка | Описание |
|---|---|
NAME |
Имя объекта (процедура, функция, пакет) |
TYPE |
Тип объекта, например PROCEDURE, FUNCTION, PACKAGE |
LINE |
Номер строки в исходном коде |
TEXT |
Фрагмент кода (максимум 4000 байт) |
SELECT TEXT
FROM USER_SOURCE
WHERE NAME = 'MY_PROCEDURE'
AND TYPE = 'PROCEDURE'
ORDER BY LINE;
Если имя объекта задано в нижнем регистре или содержит спецсимволы, его нужно заключать в кавычки и указать точное написание. Пример для функции:
SELECT TEXT
FROM USER_SOURCE
WHERE NAME = 'CALCULATE_TAX'
AND TYPE = 'FUNCTION'
ORDER BY LINE;
Для получения полного текста сразу по всем объектам можно использовать агрегирующие функции:
SELECT NAME,
TYPE,
LISTAGG(TEXT, '') WITHIN GROUP (ORDER BY LINE) AS SOURCE_CODE
FROM USER_SOURCE
GROUP BY NAME, TYPE;
Результат удобно использовать для резервного копирования или миграции кода. В представлении отображаются только объекты текущего пользователя; для доступа к чужим объектам применяются ALL_SOURCE или DBA_SOURCE при наличии прав.
Форматирование результата запроса для удобного чтения кода

Для удобного отображения длинных строк используют функцию LISTAGG(text, CHR(10)) WITHIN GROUP (ORDER BY line). Она объединяет все строки кода процедуры в один блок с переносами строк. Пример запроса:
SELECT LISTAGG(text, CHR(10)) WITHIN GROUP (ORDER BY line) AS procedure_code
FROM all_source
WHERE name = 'MY_PROCEDURE' AND type = 'PROCEDURE';
При необходимости экспорта кода в файл применяют SPOOL. Команды:
SET LONG 10000
SET PAGESIZE 0
SPOOL procedure_code.sql
SELECT LISTAGG(text, CHR(10)) WITHIN GROUP (ORDER BY line) AS procedure_code
FROM all_source
WHERE name = 'MY_PROCEDURE' AND type = 'PROCEDURE';
SPOOL OFF
Сохранение полученного текста процедуры в файл

После получения текста процедуры через запрос к словарям Oracle, например DBMS_METADATA.GET_DDL('PROCEDURE', 'ИМЯ_ПРОЦЕДУРЫ', 'СХЕМА'), его можно сохранить в файл для резервного копирования или последующего использования.
В SQL*Plus или SQLcl используйте команду SPOOL для записи результата в файл. Пример:
SPOOL C:\backup\procedure.sql
SELECT DBMS_METADATA.GET_DDL('PROCEDURE', 'MY_PROC', 'HR') FROM DUAL;
SPOOL OFF
Файл procedure.sql будет содержать полный текст процедуры с CREATE OR REPLACE, включая все параметры и тело процедуры.
При работе в PL/SQL Developer или SQL Developer можно выделить текст процедуры в окне редактора и сохранить через File → Save As, указав кодировку UTF-8 для корректного отображения русских символов.
Для автоматизации на сервере используйте PL/SQL блок с записью в файл через пакет UTL_FILE. Пример:
DECLARE
f UTL_FILE.FILE_TYPE;
ddl CLOB;
BEGIN
ddl := DBMS_METADATA.GET_DDL('PROCEDURE', 'MY_PROC', 'HR');
f := UTL_FILE.FOPEN('BACKUP_DIR', 'procedure.sql', 'W');
UTL_FILE.PUT_LINE(f, ddl);
UTL_FILE.FCLOSE(f);
END;
Необходимо, чтобы директория BACKUP_DIR была создана через CREATE DIRECTORY BACKUP_DIR AS '/path/to/folder' и пользователю была предоставлена привилегия READ, WRITE.
Рекомендуется проверять содержимое файла после сохранения, чтобы убедиться в отсутствии обрезанных строк или некорректной кодировки. Для больших процедур используйте разбиение на части при записи CLOB через DBMS_LOB.SUBSTR.
Просмотр кода процедуры с помощью утилит SQL Developer

Для доступа к исходному коду процедуры в Oracle SQL Developer выполните следующие шаги:
- Запустите SQL Developer и подключитесь к нужной базе данных через существующее соединение.
- В панели «Connections» раскройте схему пользователя, где находится процедура.
- Перейдите в раздел Procedures, чтобы увидеть список всех процедур схемы.
- Найдите нужную процедуру и дважды кликните по её имени для открытия вкладки с деталями.
- На вкладке с процедурой выберите вкладку Source, где отображается полный код PL/SQL процедуры.
Дополнительно можно использовать контекстное меню процедуры:
- Клик правой кнопкой мыши по имени процедуры → Open для быстрого открытия исходного кода.
- Клик правой кнопкой мыши → Save As, чтобы сохранить код процедуры в файл .sql для дальнейшей работы.
SQL Developer поддерживает подсветку синтаксиса, автодополнение и поиск по тексту процедуры, что облегчает анализ и модификацию кода.
Если процедура имеет зависимости (например, функции или другие процедуры), используйте вкладку Dependencies, чтобы отследить все связанные объекты перед редактированием.
Для массового просмотра кода нескольких процедур можно использовать запрос:
SELECT text FROM all_source WHERE name = 'ИМЯ_ПРОЦЕДУРЫ' AND type = 'PROCEDURE' ORDER BY line;
Вопрос-ответ:
Как узнать текст процедуры в Oracle SQL, если я знаю только её имя?
В Oracle SQL для получения кода процедуры можно использовать представление USER_SOURCE (если процедура принадлежит текущему пользователю) или ALL_SOURCE/DBA_SOURCE (для всех процедур в базе). Нужно выполнить запрос вида: SELECT text FROM user_source WHERE name = 'ИМЯ_ПРОЦЕДУРЫ' ORDER BY line; Это вернёт текст процедуры построчно, который затем можно объединить в один блок, если нужно.
Можно ли получить код процедуры, если она создана другим пользователем?
Да, но для этого нужно иметь права доступа. Если у вас есть привилегия SELECT на представление ALL_SOURCE, вы сможете выполнить запрос: SELECT text FROM all_source WHERE name = 'ИМЯ_ПРОЦЕДУРЫ' AND owner = 'ИМЯ_ПОЛЬЗОВАТЕЛЯ' ORDER BY line; Если прав нет, база выдаст ошибку доступа, и администратор должен их предоставить.
Как получить код процедуры через SQL Developer?
В SQL Developer нужно открыть вкладку «Connections», выбрать пользователя и затем папку «Procedures». Найти нужную процедуру, щёлкнуть правой кнопкой и выбрать «Edit» или «Open». В открывшемся окне будет полный текст процедуры. Также можно скопировать его в файл, если требуется сохранить локально.
Что делать, если процедура скомпилирована и в базе нет исходного кода?
Если исходный код не сохранялся, и процедура скомпилирована только в бинарной форме, получить её текст стандартными средствами Oracle невозможно. В таких случаях остаётся только восстановить код из резервной копии или из документации разработчика. Некоторые сторонние инструменты позволяют декомпилировать PL/SQL, но они не гарантируют полной точности.
Можно ли получить код функции так же, как и процедуры?
Да, функции хранятся в тех же представлениях, что и процедуры. Например, в USER_SOURCE можно выполнить SELECT text FROM user_source WHERE name = 'ИМЯ_ФУНКЦИИ' ORDER BY line; Отличие будет только в том, что имя объекта в запросе указывает на функцию, а не на процедуру. Все остальные шаги по извлечению текста идентичны.
Как можно получить текст процедуры в Oracle SQL?
В Oracle SQL текст процедуры хранится в системной таблице USER_SOURCE, если процедура принадлежит текущему пользователю, или в ALL_SOURCE, если она может принадлежать другому пользователю и вам предоставлен доступ. Для просмотра кода можно выполнить запрос вида: SELECT TEXT FROM USER_SOURCE WHERE NAME = 'ИМЯ_ПРОЦЕДУРЫ' ORDER BY LINE;. Этот запрос вернет строки кода процедуры в порядке их следования. Если необходимо получить код процедуры другого пользователя, следует использовать ALL_SOURCE и указать имя владельца через столбец OWNER.
