CftClub.ru
Клуб специалистов ЦФТ-Банк

Как определить есть ли функция в библиотеке или нет

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
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    Ответить с цитатой
Полезность: Нет оценки
Опишу свою идею Smile

В регламенте доработок рекомендуют обращаться к интерфейсным библиотекам через прокси операции(Правила создания и модификации прикладных объектов Приложений (Редакция 1.4), Приложение 3. Интерфейсы (API).)
Цитата:
Для использования интерфейсов данного типа рекомендуется создавать т.н. "прокси"-операции – Локальные операции/операции Дополнительных приложений, непосредственно обращающиеся к интерфейсным процедурам/функциям посредством специального макроса вызова CALL_INT из библиотеки [INTERFACE].[COMPILE_LIB].


Я попытался это выполнить, но столкнулся с проблемой. Допустим в кредитах у нас есть прокси-операция BNK_PRX_PROXY. Там у нас некий набор функций и процедур (фактически перевызовы функций в интерфейсе). На эту библиотеку ссылается довольно большое количество операций. И тут нам понадобилось добавить туда новую операцию. На промышленной базе становится сделать затруднительно, так как перекомпилируется пол-базы.
Идея следующая. В момент когда надо добавить новую операцию в прокси - создавать операцию, например BNK_PRX_PROXY2 и добавлять туда нужную функцию. Но вызывать ее не напрямую а кодом типа
Код:
&proxy.myfunction

где макрос &proxy будет возвращать одну из библиотек, в которой функция реально находится. Затем как-нибудь когда пользователей нет сливать все прокси-методы в один, а код операций править уже не нужно...
devor
Профи


Вступление в Клуб: 13.02.2012
СообщениеВт Апр 10, 2012 13:38    Ответить с цитатой
Полезность: Нет оценки
prog пишет:
Опишу свою идею Smile
Идея следующая. В момент когда надо добавить новую операцию в прокси - создавать операцию, например BNK_PRX_PROXY2 и добавлять туда нужную функцию. Но вызывать ее не напрямую а кодом типа
Код:
&proxy.myfunction

где макрос &proxy будет возвращать одну из библиотек, в которой функция реально находится. Затем как-нибудь когда пользователей нет сливать все прокси-методы в один, а код операций править уже не нужно...

Код операции с вызовом функции править не нужно, но вот перекомпилировать ее все же придется.
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеВт Апр 10, 2012 15:07    Ответить с цитатой
Полезность: Нет оценки
prog пишет:
Опишу свою идею Smile

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

Я попытался это выполнить, но столкнулся с проблемой. ... И тут нам понадобилось добавить туда новую операцию. На промышленной базе становится сделать затруднительно, так как перекомпилируется пол-базы...


Перекомпиляция половины базы потребуется только если вы затрагиваете глобальные описания операции. Достаточно разработать функционал в соседней операции, отладить его, потом переложить в проксю (чтобы библиотека не сломалась), а на вопрос "Перекомпилировать зависимые операции?" ответить "нет".

А вообще-то у нас разработка ведется на схеме разработки, где перекомпиляция полбазы не так страшна, откуда уже готовый рабочий код накатывается на боевую (дистрибутивную) схему, когда на ней нет пользователей...

Такой подход не спасёт отца русской демократии?
prog
Эксперт


Вступление в Клуб: 03.03.2008
СообщениеВт Апр 10, 2012 15:45    Ответить с цитатой
Полезность: Нет оценки
Random пишет:

Перекомпиляция половины базы потребуется только если вы затрагиваете глобальные описания операции. Достаточно разработать функционал в соседней операции, отладить его, потом переложить в проксю (чтобы библиотека не сломалась), а на вопрос "Перекомпилировать зависимые операции?" ответить "нет".


Согласен, только активно используемую библиотеку перекомпилировать врятли удастся. Ее будут "держать" выполняемы в данный момент другие операции.

Насчет вести разработку в тестовой базе, а затем катить на рабочую когда нет пользователей, спасибо за совет, К.О.
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеСр Апр 11, 2012 06:23    Ответить с цитатой
Полезность: Нет оценки
prog пишет:
спасибо за совет, К.О.

Rolling Eyes

Ну а
Цитата:
Затем как-нибудь когда пользователей нет сливать все прокси-методы в один, а код операций править уже не нужно...

чем отличается от наката на боевую, когда пользователей не будет? Такие моменты есть каждый день вроде как...
devor
Профи


Вступление в Клуб: 13.02.2012
СообщениеПт Апр 13, 2012 12:01    Ответить с цитатой
Полезность: Нет оценки
Random пишет:
Цитата:
Затем как-нибудь когда пользователей нет сливать все прокси-методы в один, а код операций править уже не нужно...

чем отличается от наката на боевую, когда пользователей не будет? Такие моменты есть каждый день вроде как...

Видимо, prog ведет разработку прямо на боевой схеме Smile
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru