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

Проблема с вызовом PLPCALL

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


Вступление в Клуб: 05.01.2015
СообщениеЧт Май 07, 2015 11:53   Проблема с вызовом PLPCALL Ответить с цитатой
Полезность: Нет оценки
Здравствуйте!

Есть одна операция, которая должна отработать для нескольких экземпляров. В коде операции сделал цикл для нахождения id, потом в цикле вызываю через PLPCALL вторую операцию. Проблема в том, что хотя ссылки найдены правильно, PLPCALL отрабатывает только для последнего экземпляра столько раз, сколько найдено ссылок. Как заставить операцию вызываться над каждым экземпляром?

UPD.: нужна экранная форма операции, вызвать t1.des.[FGK_REJECT_GASH] не получится
Код:
for(select t(t : id) in [PR_CRED] where t.[GR_CRED] = this)
      loop
         for(
            select t1(t1 : des) in ::[DECL_EARLY_SLAK]
            where t1.[CRED_REF] = t.id
            )
         loop
             V_DECL := t1.des;
            stdio.put_line_buf('<% PLPCALL %VAR%.V_DECL.[FGK_REJECT_GASH]() %>');
         end loop;
      end loop;
Alex294
Участник со стажем


Вступление в Клуб: 02.06.2013
СообщениеЧт Май 07, 2015 13:51    Ответить с цитатой
Полезность: Нет оценки
PLPCALL не отрабатывает мгновенно,а только после передачи управления (отработки блока). Надо после каждого PLPCALL делать выход. Я бы решал с помощью скрипта. Например, с начала сохранил бы все выбранные id, а потом бы их по одному обрабатывал в валидации из скрипта (ScriptServerValidate).
Amper
Профи


Вступление в Клуб: 29.10.2010
СообщениеЧт Май 07, 2015 18:09    Ответить с цитатой
Полезность: Нет оценки
Должно быть что-то вроде:
Код:
stdio.put_line_buf('<% PLPCALL [DECL_EARLY_SLAK].[FGK_REJECT_GASH](%THIS% => ''' || to_char(t1.des) || ''') %>');

не уверен в синтаксисе, т. к. под рукой нет админа словаря.
Kairat
Участник


Вступление в Клуб: 05.01.2015
СообщениеПт Май 08, 2015 06:41    Ответить с цитатой
Полезность: Нет оценки
Цитата:

Должно быть что-то вроде:
Код:
stdio.put_line_buf('<% PLPCALL [DECL_EARLY_SLAK].[FGK_REJECT_GASH](%THIS% => ''' || to_char(t1.des) || ''') %>');

не уверен в синтаксисе, т. к. под рукой нет админа словаря.

Вот что выдал этот код:
Не удалось разобрать команду, начиная с указанной '-->' позиции:
<% PLPCALL [DECL_EARLY_SLAK].[FGK_REJECT_GASH]( --> %THIS% => '1720415859') %>.

Цитата:
PLPCALL не отрабатывает мгновенно,а только после передачи управления (отработки блока). Надо после каждого PLPCALL делать выход. Я бы решал с помощью скрипта. Например, с начала сохранил бы все выбранные id, а потом бы их по одному обрабатывал в валидации из скрипта (ScriptServerValidate).

Вы это про VB скрипт? Допустим, я сохряню все айдишники в массив, потом в секции Клиент-скрипт вызывать PLPCALL? А разница будет? Увы, в VB не силен от слова совсем Smile
Alex294
Участник со стажем


Вступление в Клуб: 02.06.2013
СообщениеПт Май 08, 2015 10:11    Ответить с цитатой
Полезность: Нет оценки
Подумал, можно обойтись без VB скрипта. Просто V_DECL описываем как массив, а вызовы в цикле формируем как:
Код:

stdio.put_line_buf('<% PLPCALL %VAR%.V_DECL(i).[FGK_REJECT_GASH]() %>');


Правда в вызовах PLPCALL массивы не использовал, может и не сработать.
Alkov
Профи


Вступление в Клуб: 23.09.2010
СообщениеПт Май 08, 2015 10:58   Re: Проблема с вызовом PLPCALL Ответить с цитатой
Полезность: Нет оценки
Kairat пишет:
Здравствуйте!

Есть одна операция, которая должна отработать для нескольких экземпляров. В коде операции сделал цикл для нахождения id, потом в цикле вызываю через PLPCALL вторую операцию. Проблема в том, что хотя ссылки найдены правильно, PLPCALL отрабатывает только для последнего экземпляра столько раз, сколько найдено ссылок. Как заставить операцию вызываться над каждым экземпляром?

UPD.: нужна экранная форма операции, вызвать t1.des.[FGK_REJECT_GASH] не получится
Код:
for(select t(t : id) in [PR_CRED] where t.[GR_CRED] = this)
      loop
         for(
            select t1(t1 : des) in ::[DECL_EARLY_SLAK]
            where t1.[CRED_REF] = t.id
            )
         loop
             V_DECL := t1.des;
            stdio.put_line_buf('<% PLPCALL %VAR%.V_DECL.[FGK_REJECT_GASH]() %>');
         end loop;
      end loop;


Перенесите этот цикл в Клиент-скрипт, по идее должно помочь.
Kairat
Участник


Вступление в Клуб: 05.01.2015
СообщениеПн Май 11, 2015 12:59    Ответить с цитатой
Полезность: Нет оценки
Цитата:
Подумал, можно обойтись без VB скрипта. Просто V_DECL описываем как массив, а вызовы в цикле формируем как


Не сработало, не скушал массив.

Вывернулся по другому - вызов в цикле оставил как раньше, а на форму вывел те поля, которые находятся на вызываемой форме, благо, там их немного. Потом в цикле вызвал t1.des.[FGK_REJECT_GASH] с передачей выбранных параметров с формы. Но есть один нюанс - параметры с формы будут одни для всех экземпляров.

Цитата:
Перенесите этот цикл в Клиент-скрипт, по идее должно помочь.

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

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