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

Как узнать наименование вышестоящей операции

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Справочник PL/PLUS: Функции, примеры, приёмы
Предыдущая тема :: Следующая тема  
Автор Сообщение
Sergei13
Участник


Вступление в Клуб: 06.09.2012
СообщениеПт Дек 14, 2012 10:29   Как узнать наименование вышестоящей операции Ответить с цитатой
Полезность: Нет оценки
Коллеги, может кто знает:

Есть ли в ЦФТ способ узнать, какая вышестоящая операция была запущена?

К примеру, мы запустили операцию DOC_TO_PROV, внутри ее вызывается операция FOLDER_TO_PROV, на сомом нижнем уровне MAKE_PROV.
Нужно из MAKE_PROV идентифицировать, что была запущена операция DOC_TO_PROV
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеПт Дек 14, 2012 10:37   Re: Как узнать наименование вышестоящей операции Ответить с цитатой
Полезность: Нет оценки
Sergei13 пишет:
Коллеги, может кто знает:

Есть ли в ЦФТ способ узнать, какая вышестоящая операция была запущена?

К примеру, мы запустили операцию DOC_TO_PROV, внутри ее вызывается операция FOLDER_TO_PROV, на сомом нижнем уровне MAKE_PROV.
Нужно из MAKE_PROV идентифицировать, что была запущена операция DOC_TO_PROV


Безусловно, можно.
Есть такая функция DBMS_UTILITY.FORMAT_CALL_STACK;

PS:
Код:

exception when others then
   debug_pipe ('ошибка '||sqlcode||' {'||sqlerrm||'}. Стек: '||dbms_utility.FORMAT_ERROR_BACKTRACE, 0);
   raise;
Sergei13
Участник


Вступление в Клуб: 06.09.2012
СообщениеПт Дек 14, 2012 11:44    Ответить с цитатой
Полезность: Нет оценки
Спасибо!
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеПт Дек 14, 2012 11:50    Ответить с цитатой
Полезность: Нет оценки
Sergei13 пишет:
Спасибо!

Для спасибо есть отдельная кнопка "Оценить" Smile
Blinderbor
Участник


Вступление в Клуб: 18.12.2012
СообщениеПт Янв 18, 2013 08:57    Ответить с цитатой
Полезность: Нет оценки
мне то же необходимо понять кто вызывает операцию
для тренировки пробую на своих двух операциях в разных ТБП
в вызываемой операции в ПРОВЕРКА добавил
Код:
 begin
 debug_pipe(DBMS_UTILITY.FORMAT_CALL_STACK,0);
 end;



в результате я получаю
Код:

09:52:33 ----- PL/SQL Call Stack -----
           object      line  object
           handle    number  name
         30185584       317  package body IBS.Z$SALE_PRINT_OBOROTV_10 --имя вызываемой операции
         29AA6F2C        98  package body IBS.Z$U$3244911146            --??
         273B30FC         1  anonymous block                             --??


как мне все-таки увидеть имя пакета вызвавшей операции?
трейс будет сохраняться на сервере? (он у меня неудобно расположен в другом городе (( )
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеПн Янв 21, 2013 12:27    Ответить с цитатой
Полезность: Нет оценки
Blinderbor пишет:
мне то же необходимо понять кто вызывает операцию
для тренировки пробую на своих двух операциях в разных ТБП
в вызываемой операции в ПРОВЕРКА добавил
Код:
 begin
 debug_pipe(DBMS_UTILITY.FORMAT_CALL_STACK,0);
 end;



в результате я получаю
Код:

09:52:33 ----- PL/SQL Call Stack -----
           object      line  object
           handle    number  name
         30185584       317  package body IBS.Z$SALE_PRINT_OBOROTV_10 --имя вызываемой операции
         29AA6F2C        98  package body IBS.Z$U$3244911146            --??
         273B30FC         1  anonymous block                             --??


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


Ну так у тебя всё получилось.
АРМ Навигатор сформировал анонимный блок declare begin end, который выполнил на сервере. Это у тебя есть.
Анонимный блок не включает имя пакета напрямую, а формируется только через интерфейсный пакет операции, в твоём случае Z$U$3244911146.

В интерфейсном пакете уже выполняется подстановка параметров и вызов целевого пакета операции Z$SALE_PRINT_OBOROTV_10

В этом пакете в строке 317 стоит вызов rtl.debug_pipe(DBMS_UTILITY.FORMAT_CALL_STACK,0);
который, собственно, и вывел тебе строчку, которую ты видишь в мониторе канала.

Вот если ты напишешь вывод debug_pipe(DBMS_UTILITY.FORMAT_CALL_STACK,0);
в секции ТЕЛО, и сделаешь вызов этой операции из какой-нибудь другой операции, то имя пакета этой другой тоже будет присутствовать в стэке.
Blinderbor
Участник


Вступление в Клуб: 18.12.2012
СообщениеПн Янв 21, 2013 16:30    Ответить с цитатой
Полезность: Нет оценки
пробовал
еще раз переместил debug_pipe(DBMS_UTILITY.FORMAT_CALL_STACK,0); в тело операции
разницы почти нет (
Код:

           object      line  object
           handle    number  name
         1FF4BF94       266  package body IBS.Z$SALE_PRINT_OBOROTV_10
         1FF5316C        98  package body IBS.Z$U$3244911146
         1FF19F44         1  anonymous block
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеВт Янв 22, 2013 08:03    Ответить с цитатой
Полезность: Нет оценки
Blinderbor пишет:
пробовал
еще раз переместил debug_pipe(DBMS_UTILITY.FORMAT_CALL_STACK,0); в тело операции
разницы почти нет (
Код:

           object      line  object
           handle    number  name
         1FF4BF94       266  package body IBS.Z$SALE_PRINT_OBOROTV_10
         1FF5316C        98  package body IBS.Z$U$3244911146
         1FF19F44         1  anonymous block


Я вот не понимаю, чего ты хочешь добиться-то.

Функционал работает, результат, какой запрашивал, весь получил.

У тебя три вызова, они отражаются в результате.
Строки, в которых эти вызовы стоят, тоже отражаются.

Чего ты ещё хочешь?
Blinderbor
Участник


Вступление в Клуб: 18.12.2012
СообщениеВт Янв 22, 2013 10:55    Ответить с цитатой
Полезность: Нет оценки
я из операции PRINT_OBOROT_KSV
вызываю PRINT_OBOROTV_10
Код:

stdio.put_line_buf('<% PLPCALL [SALE].[PRINT_OBOROTV_10]()%>');


в PRINT_OBOROTV_10 у меня
Код:
debug_pipe(DBMS_UTILITY.FORMAT_CALL_STACK,0);


и в результате хочу видеть PRINT_OBOROT_KSV
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеСр Янв 23, 2013 06:17    Ответить с цитатой
Полезность: 1
Blinderbor пишет:
я из операции PRINT_OBOROT_KSV
вызываю PRINT_OBOROTV_10
Код:

stdio.put_line_buf('<% PLPCALL [SALE].[PRINT_OBOROTV_10]()%>');


в PRINT_OBOROTV_10 у меня
Код:
debug_pipe(DBMS_UTILITY.FORMAT_CALL_STACK,0);


и в результате хочу видеть PRINT_OBOROT_KSV


А-а, понятно. Извини, ничего не получится. Ты ничего не вызываешь. Ты выводишь в стандартный output Oracle некую строку в ЦФТ-шном формате.

Если АРМ Навигатор не распознаёт свой формат, он просто отобразит результат в виде окошка, типа, глянь, какая кака вылезла.

А если распознает, то просто запускает операцию. Отдельно от той, где ты написал вывод в output.

Вызов - это если ты напишешь
begin ::[SALE].[PRINT_OBOROTV_10]; end;

То есть это заморочка чисто Платформы Развития. А я говорю про Oracle'овский механизм, который про эти ЦФТ-шные заморочки не знает.

Аналогично ничего не получится, если в клиент-скрипте сделать вызов какой-то операции, в которой вывести DBMS_UTILITY.FORMAT_CALL_STACK
Blinderbor
Участник


Вступление в Клуб: 18.12.2012
СообщениеЧт Янв 24, 2013 12:52    Ответить с цитатой
Полезность: Нет оценки
Цитата:
Извини, ничего не получится

ну что же, зато разобрались
debug теперь мой единственный помощник
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Справочник PL/PLUS: Функции, примеры, приёмы Часовой пояс: GMT + 3
Страница 1 из 1

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