Форум программистов, компьютерный форум, киберфорум
Oracle
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.84/104: Рейтинг темы: голосов - 104, средняя оценка - 4.84
0 / 0 / 4
Регистрация: 28.04.2012
Сообщений: 117
1

Получить текст функции/процедуры из пакета - Oracle

20.10.2016, 08:03. Показов 20615. Ответов 9
Метки нет (Все метки)

Добрый день.
Появилась задача найти в указанном пакете текст хранимой процедуры или функции.

Получилось только такое:
SQL
1
2
3
4
5
SELECT * 
  FROM user_source a 
 WHERE a.type = 'PACKAGE BODY' 
   AND a.name = 'AGENT_SUPPORT' 
 ORDER BY line ASC;
Понимаю что нужно парсить и даже алгоритм некий продумал, но все же решил спросить у вас уважаемые форумчане,
можно ли select'om достать текст из пакета. Может у кого завалялось решение, буду очень благодарен.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.10.2016, 08:03
Ответы с готовыми решениями:

Получить из Oracle в Access результат выполнения процедуры
Добрый день всем! В книге вычитал, что запросы напрямую к серверу в Access (dbSQLPassThrough)...

Получить текст процедуры
Здравствуйте, подскажите способы получения текста процедуры, триггера и т.п. Мне нужно реализовать...

Текст,строки,слова процедуры и функции
Вариант 9. 1. Вводится строка произвольного текста. Определить, в каком слове больше букв — в...

Ошибка при компиляции Java-пакета в Oracle
Компилю JAVA sourсe в базе данных Oracle. В коде имеются следующие строки: java.io.File f =...

9
339 / 235 / 113
Регистрация: 12.05.2016
Сообщений: 642
20.10.2016, 08:59 2
Нет простого способа без разбора исходника достать текст одной процедуры пакета.

Но вам могут помочь еще вьюхи user_procedures - содержит список всех методов пакетов и user_arguments - содержит параметры всех методов всех пакетов.
0
0 / 0 / 4
Регистрация: 28.04.2012
Сообщений: 117
20.10.2016, 12:57  [ТС] 3
Цитата Сообщение от Anvano Посмотреть сообщение
Нет простого способа без разбора исходника достать текст одной процедуры пакета.
Так и думал, грустно(
может у кого есть готовое решение?
0
Модератор
3912 / 2891 / 554
Регистрация: 21.01.2011
Сообщений: 12,533
21.10.2016, 10:17 4
Цитата Сообщение от Tantay
может у кого есть готовое решение?
Обычно люди работают с текстами процедур через какое-то ГУИ, тот же SQL Developer, доставать текст программным путем - редкая задача.
0
28 / 28 / 23
Регистрация: 06.10.2016
Сообщений: 74
21.10.2016, 12:04 5
если у вас есть точное расположение процедуры в пакете то так(например с 50 по 500 строку):
SQL
1
SELECT * FROM user_source WHERE name = 'MYPACK' AND TYPE = 'PACKAGE BODY' AND line BETWEEN 50 AND 500;
опубликованные процедурой точки входа можно получить тут:
SQL
1
2
SELECT * FROM user_procedures;
SELECT * FROM user_arguments;
0
0 / 0 / 4
Регистрация: 28.04.2012
Сообщений: 117
21.10.2016, 14:13  [ТС] 6
Есть проект в котором под сотню пакетов и под 10 тыс процедур/функций, вся логика находится в них.
Обновление проекта в основном заключается в исправлении этих процедур/функций. Проект для разных пользователей сильно ветвится, поэтому нельзя взять весь пакет и заменить его у пользователя. И возникла такая идея, что бы можно было вытащить нужные процедуры/функции и вставить их у пользователя. Без использования SQL Developer'a
0
28 / 28 / 23
Регистрация: 06.10.2016
Сообщений: 74
21.10.2016, 14:37 7
Могу предложить более простую вариацию. Изменяемые ф-ции вынести в параметризованные анонимные блоки и писать их в таблицу. В самих ф-циях проверяя пользователя вызывать нужный скрипт из таблицы на выполнение. Скрипты можно будет апдейтить как обычные поля таблицы при необходимости, пере компиляция не нужна.
0
Модератор
3912 / 2891 / 554
Регистрация: 21.01.2011
Сообщений: 12,533
21.10.2016, 14:45 8
Цитата Сообщение от FourthDimension
Изменяемые ф-ции вынести в параметризованные анонимные блоки и писать их в таблицу
Только при этом (и использовании execute immediate) ухудшается производительность системы, ибо снижается повторное выполнение запросов, т.е. растет число hard parse. Конечно, если система не сильно загружена, то этого можно и не заметить.
0
28 / 28 / 23
Регистрация: 06.10.2016
Сообщений: 74
21.10.2016, 15:16 9
Grossmeister, если анонимный блок параметризован + грамотно написан, то не сильно нагружает, проверено на практике. И я не принуждаю автора темы следовать моему совету. Просто предложение. Мне самому такой вариант не очень нравится из-за сложностей при отладке. Но, согласитесь, это проще, чем идея выдерать ф-ции из пакетов неким парсером. И впиливать их после изменения программно.
0
0 / 0 / 4
Регистрация: 28.04.2012
Сообщений: 117
25.10.2016, 08:58  [ТС] 10
Если кому нибудь будет нужно, то вот:
SQL
1
2
3
4
5
6
7
8
9
10
ALTER SESSION SET PLSCOPE_SETTINGS = 'IDENTIFIERS:ALL';
 
SELECT    Line,
            Col,
            INITCAP(NAME) Name,
            LOWER(TYPE)   TYPE,
            LOWER(USAGE)  Usage,
            USAGE_ID,
            USAGE_CONTEXT_ID
    FROM USER_IDENTIFIERS
uRL
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.10.2016, 08:58

Используя процедуры и функции получить из матрицы вектор
Ребята, выручайте, я сама как-то вообще не разберусь, как в Паскале это написать: Используя...

Процедуры и функции: Используя функцию, получить значение f(t,0.3*s)+f(s,0.2*t)
Даны действительные числа s, t. Используя функцию, получить значение f(t,0.3*s)+f(s,0.2*t), вывод...

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

Получить значение выражения с использованием функции или процедуры
Даны действительные числа S и Т. Получить: F(T,-2*S,1.17)+F(2.2,T,S-T), ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru