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

Состояния

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


Вступление в Клуб: 18.01.2008
СообщениеПн Авг 18, 2008 12:23   Состояния Ответить с цитатой
Полезность: Нет оценки
Помимо системных состояний было принято решение использовать свои дополнительные статусы в документах (в одном типе). Хочется получать список всех состояний: системных и собственных, отсортированных по времени (можно и по ID). Системные, как водится, получаются по Ctrl+S.

В PL/SQL я это реализовал так (статическая выборка):
Код:
select a.OBJ_ID ID, to_char(a.TIME, 'DD/MM/YYYY HH24:MI:SS') TIME, e.NAME NAME, e.ID CODE
from IBS.OBJECT_STATE_HISTORY a, IBS.STATES e
where
   e.CLASS_ID = 'DECL_ON_GET_CRED' and
   a.STATE_ID = e.ID and
   a.OBJ_ID = '407388569'
UNION
select to_char(b.C_DECL) ID, to_char(b.C_DATETIME, 'DD/MM/YYYY HH24:MI:SS') TIME, 'ВПБ.' || nvl(d.C_VPB_NAME, 'Отказано СБ') NAME, d.C_VPB_CODE
from
   z#VPB_DECL_LOG b, z#VPB_DECL_STATE c, z#VPB_DECL_STATUS d
where
   b.C_DECL = 407388569 and
   b.C_DECL_STATE = c.C_VPB_STATUS and
   c.C_VPB_STATUS = d.ID
order by 1
;


А вот на PL/Plus не очень получается. Нашёл, как в библиотеке [SYS_DIARYS].[HLIB] достаются системные статусы, но в собственной операции этот способ не работает:
Код:
for (
      select s(
         s.OBJ_ID: ID,
         to_char(s.TIME, 'DD/MM/YYYY HH24:MI:SS'): TIME,
         s.STATE_ID: NAME
      ) in OBJECT_STATE_HISTORY%rowtype, (STATES%rowtype: states)
      where s.OBJ_ID = v_this%id and s.STATE_ID = states
      union ALL
      select v(
         v.[DECL]: ID,
         to_char(v.[DATETIME], 'DD/MM/YYYY HH24:MI:SS'): TIME,
         'ВПБ.' || nvl(vpbStatus.[VPB_NAME], 'Отказано СБ'): NAME
      ) in ::[VPB_DECL_LOG], (::[VPB_DECL_STATE] all: vpbState), (::[VPB_DECL_STATUS] all: vpbStatus)
      where v.[DECL] = v_this and v.[DECL_STATE] = vpbState.[VPB_STATUS] and vpbState.[VPB_STATUS] = vpbStatus
      order by 1, 2
   ) loop
      stdio.put_line_buf(to_char(v.[ID]) || ': ' || v.[TIME] || ' ' || v.[NAME]);
   end loop;

Ошибки следующие:
Код:
PLP-NOT_CLASS_COMPONENT: У типа [DECL_ON_GET_CRED] нет реквизита или операции [OBJ_ID]
PLP-NOT_CLASS_COMPONENT: У типа [DECL_ON_GET_CRED] нет реквизита или операции [STATE_ID]
PLP-NOT_CLASS_COMPONENT: У типа [DECL_ON_GET_CRED] нет реквизита или операции [OBJECT_STATE_HISTORY]
PLP-NOT_COLLECTION: [OBJECT_STATE_HISTORY] не коллекция
...


Без выборки из STATES - всё то же самое. Помогите! Smile Как правильно выбирать из системных таблиц?
r00st
Эксперт
Резидент CftClub


Вступление в Клуб: 14.09.2007
СообщениеПн Авг 18, 2008 13:14    Ответить с цитатой
Полезность: 1
Доступ к любой таблице, неописанной как класс IBSO, осуществляется через %rowtype. Так что работать должно.

Расширенный синтаксис стоит?
pavelskv
Участник
Волгопромбанк


Вступление в Клуб: 18.01.2008
СообщениеПн Авг 18, 2008 14:33    Ответить с цитатой
Полезность: Нет оценки
Благодарю! Такая вот мелочь иногда замораживает продолжение написания. Wink
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
Страница 1 из 1

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