Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
prog Эксперт
Вступление в Клуб: 03.03.2008
|
Пн Апр 09, 2012 13:48  Как определить есть ли функция в библиотеке или нет |
|
Полезность: Нет оценки
|
Как определить есть ли функция в пакете или нет. Хочется определять это в макросе.
Нужно разработать процедурку которая по имени функции сможет определить есть ли она в конкретной библиотеке.
Есть идеи как это узнать на PL+? |
|
 |
nOnAME Участник со стажем
Вступление в Клуб: 25.01.2011
|
Пн Апр 09, 2012 15:07   |
|
Полезность: 2
|
Может, что то типа:
--begin pl/sql
select true from user_source where type = 'PACKAGE' and text like 'procedure '||name;
--end pl/sql |
|
 |
prog Эксперт
Вступление в Клуб: 03.03.2008
|
Пн Апр 09, 2012 15:20   |
|
Полезность: Нет оценки
|
Это вариант, только не гарантирует что процедуру оттуда вызвать можно. Может процедура закомменчена.
--procedure my; |
|
 |
Alexsey Эксперт
Вступление в Клуб: 06.09.2007
|
Пн Апр 09, 2012 15:47   |
|
Полезность: 1
|
выполни запрос
Код: | declare
text_meth varchar2(32000);
begin
select m(s.text :text_meth)
in methods%rowtype
,(sources%rowtype :s)
where s.NAME = m.ID
and (m.class_id = P_CLASS
and m.SHORT_NAME = P_NAME_OPER)
into text_meth;
if instr(text_meth, P_NAME_FUNC) != 0 then
debug_pipe('Функция присутствует');
else debug_pipe('Функция отсутствует');
end if;
end;
|
по этому коду узнаешь, если оно в PL+.. ну а пакет просмотреть проблем уже не должно возникнуть..
ну или на PL+ текст пакета можно увидеть так
Код: | select s(s.TEXT) in USER_SOURCE%rowtype
where s.NAME = (select m(m.package_name)
in methods%rowtype
where m.class_id = P_CLASS
and m.SHORT_NAME = P_NAME_OPER)
and s.TYPE = 'PACKAGE BODY' order by s.LINE into code; |
_________________ всегда есть как минимум 2 выхода
Последний раз редактировалось: Alexsey (Пн Апр 09, 2012 16:03), всего редактировалось 6 раз(а) |
|
 |
nOnAME Участник со стажем
Вступление в Клуб: 25.01.2011
|
Пн Апр 09, 2012 15:49   |
|
Полезность: 1
|
можно и процедуру от туда вызвать, для функций лучше использовать: result:= {myfunction};
без всяких блоков --begin и --end |
|
 |
devor Профи
Вступление в Клуб: 13.02.2012
|
Пн Апр 09, 2012 16:00   |
|
Полезность: 1
|
Код: |
select 1 from user_procedures up, methods m
where up.object_name = m.package_name
and m.class_id = 'PR_CRED'
and m.short_name='LIB_DEBT'
and upper(up.PROCEDURE_NAME) = 'CALC_DEBETS'
|
|
|
 |
Random Эксперт
Вступление в Клуб: 27.06.2011
|
Вт Апр 10, 2012 06:27   |
|
Полезность: 1
|
devor пишет: | Код: |
select 1 from user_procedures up, methods m
where up.object_name = m.package_name
and m.class_id = 'PR_CRED'
and m.short_name='LIB_DEBT'
and upper(up.PROCEDURE_NAME) = 'CALC_DEBETS'
|
|
Обратите также внимание на user_ARGUMENTS
Если у процедуры есть аргумент без имени, значит, это функция.
Вот только использование макроса меня смущает.
Макрос не формирует зависимость операции, где используется, от операции, которая используется. Поэтому если в библиотеке вдруг исчезнет процедура, место, где эта процедура используется, останется валидным до того момента, пока не будет перекомпилировано вручную, либо выполнено.
Последний раз редактировалось: Random (Вт Апр 10, 2012 06:46), всего редактировалось 2 раз(а) |
|
 |
prog Эксперт
Вступление в Клуб: 03.03.2008
|
Вт Апр 10, 2012 06:33   |
|
Полезность: Нет оценки
|
Спасибо. user_procedures то что надо |
|
 |
prog Эксперт
Вступление в Клуб: 03.03.2008
|
Вт Апр 10, 2012 12:19   |
|
Полезность: Нет оценки
|
Опишу свою идею
В регламенте доработок рекомендуют обращаться к интерфейсным библиотекам через прокси операции(Правила создания и модификации прикладных объектов Приложений (Редакция 1.4), Приложение 3. Интерфейсы (API).)
Цитата: | Для использования интерфейсов данного типа рекомендуется создавать т.н. "прокси"-операции – Локальные операции/операции Дополнительных приложений, непосредственно обращающиеся к интерфейсным процедурам/функциям посредством специального макроса вызова CALL_INT из библиотеки [INTERFACE].[COMPILE_LIB]. |
Я попытался это выполнить, но столкнулся с проблемой. Допустим в кредитах у нас есть прокси-операция BNK_PRX_PROXY. Там у нас некий набор функций и процедур (фактически перевызовы функций в интерфейсе). На эту библиотеку ссылается довольно большое количество операций. И тут нам понадобилось добавить туда новую операцию. На промышленной базе становится сделать затруднительно, так как перекомпилируется пол-базы.
Идея следующая. В момент когда надо добавить новую операцию в прокси - создавать операцию, например BNK_PRX_PROXY2 и добавлять туда нужную функцию. Но вызывать ее не напрямую а кодом типа
где макрос &proxy будет возвращать одну из библиотек, в которой функция реально находится. Затем как-нибудь когда пользователей нет сливать все прокси-методы в один, а код операций править уже не нужно... |
|
 |
devor Профи
Вступление в Клуб: 13.02.2012
|
Вт Апр 10, 2012 13:38   |
|
Полезность: Нет оценки
|
prog пишет: | Опишу свою идею
Идея следующая. В момент когда надо добавить новую операцию в прокси - создавать операцию, например BNK_PRX_PROXY2 и добавлять туда нужную функцию. Но вызывать ее не напрямую а кодом типа
где макрос &proxy будет возвращать одну из библиотек, в которой функция реально находится. Затем как-нибудь когда пользователей нет сливать все прокси-методы в один, а код операций править уже не нужно... |
Код операции с вызовом функции править не нужно, но вот перекомпилировать ее все же придется. |
|
 |
Random Эксперт
Вступление в Клуб: 27.06.2011
|
Вт Апр 10, 2012 15:07   |
|
Полезность: Нет оценки
|
prog пишет: | Опишу свою идею
В регламенте доработок рекомендуют обращаться к интерфейсным библиотекам через прокси операции(Правила создания и модификации прикладных объектов Приложений...
Я попытался это выполнить, но столкнулся с проблемой. ... И тут нам понадобилось добавить туда новую операцию. На промышленной базе становится сделать затруднительно, так как перекомпилируется пол-базы... |
Перекомпиляция половины базы потребуется только если вы затрагиваете глобальные описания операции. Достаточно разработать функционал в соседней операции, отладить его, потом переложить в проксю (чтобы библиотека не сломалась), а на вопрос "Перекомпилировать зависимые операции?" ответить "нет".
А вообще-то у нас разработка ведется на схеме разработки, где перекомпиляция полбазы не так страшна, откуда уже готовый рабочий код накатывается на боевую (дистрибутивную) схему, когда на ней нет пользователей...
Такой подход не спасёт отца русской демократии? |
|
 |
prog Эксперт
Вступление в Клуб: 03.03.2008
|
Вт Апр 10, 2012 15:45   |
|
Полезность: Нет оценки
|
Random пишет: |
Перекомпиляция половины базы потребуется только если вы затрагиваете глобальные описания операции. Достаточно разработать функционал в соседней операции, отладить его, потом переложить в проксю (чтобы библиотека не сломалась), а на вопрос "Перекомпилировать зависимые операции?" ответить "нет".
|
Согласен, только активно используемую библиотеку перекомпилировать врятли удастся. Ее будут "держать" выполняемы в данный момент другие операции.
Насчет вести разработку в тестовой базе, а затем катить на рабочую когда нет пользователей, спасибо за совет, К.О. |
|
 |
Random Эксперт
Вступление в Клуб: 27.06.2011
|
Ср Апр 11, 2012 06:23   |
|
Полезность: Нет оценки
|
prog пишет: | спасибо за совет, К.О. |
Ну а Цитата: | Затем как-нибудь когда пользователей нет сливать все прокси-методы в один, а код операций править уже не нужно... |
чем отличается от наката на боевую, когда пользователей не будет? Такие моменты есть каждый день вроде как... |
|
 |
devor Профи
Вступление в Клуб: 13.02.2012
|
Пт Апр 13, 2012 12:01   |
|
Полезность: Нет оценки
|
Random пишет: | Цитата: | Затем как-нибудь когда пользователей нет сливать все прокси-методы в один, а код операций править уже не нужно... |
чем отличается от наката на боевую, когда пользователей не будет? Такие моменты есть каждый день вроде как... |
Видимо, prog ведет разработку прямо на боевой схеме  |
|
 |
|