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

максимальная дата

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


Вступление в Клуб: 05.02.2013
СообщениеСр Июл 24, 2019 11:39   максимальная дата Ответить с цитатой
Полезность: Нет оценки
Здравствуйте. Стоит такая задача. Из коллекции где много записей, надо выбрать самую максимальную дату и передать его в переменную. Как сделать, подскажите пожалуйста. Спасибо.
Матвеев Евгений
Профи


Вступление в Клуб: 31.01.2012
СообщениеСр Июл 24, 2019 11:49   Re: максимальная дата Ответить с цитатой
Полезность: Нет оценки
cool_dude пишет:
Здравствуйте. Стоит такая задача. Из коллекции где много записей, надо выбрать самую максимальную дату и передать его в переменную. Как сделать, подскажите пожалуйста. Спасибо.



Код:


--Передача в переменную, пример
       SELECT x(MIN(x.[].[BEGIN_DATE])) in P#NOWORK_COMP where x.[].[BEGIN_DATE] is not NULL INTO beg_dat;




--Максимальная дата, пример

SELECT V2(MAX(V2.[DATE]) : Max_Date
,V2.[BRANCH] : Branch) IN ::[PL_ARC_USV]
WHERE V2.[plan_acc].[USV_US].[NUM] = BS
AND V2.[PERIOD].[CODE]= 'D'
AND V2.[DATE] <= D_MAX


Объединяем и получаем плюс минус следующий код)

DECLARE
beg_dat DATE;
BEGIN

SELECT V2(MAX(V2.[DATE]) : Max_Date)
IN ::[PL_ARC_USV]
INTO beg_dat;

DEBUG(beg_dat,0);

END;
cool_dude
Участник - экстремал


Вступление в Клуб: 05.02.2013
СообщениеСр Июл 24, 2019 16:42    Ответить с цитатой
Полезность: Нет оценки
У меня, что-то значение beg_dat возвращает ноль, т.е. ничего. Ниже приведен код


    [code]
    DECLARE
    beg_dat DATE;
    BEGIN

    SELECT V2(MAX(V2.[DATE_TIME]) : Max_Date)
    IN ::[I_SAFE_L_PROL]
    where V2%collection = this.[PROLS] and V2.[DOPS_TYPE].[CODE] = 'ПРОЛОНГАЦИЯ'
    INTO beg_dat;
    DEBUG(beg_dat,0);

    for DopSog in ::[I_SAFE_L_PROL] all where DopSog%collection = this.[PROLS] and DopSog.[DOPS_TYPE].[code] = 'ПРОЛОНГАЦИЯ'
    and DopSog.[DATE_TIME] = beg_dat
    loop
    [WORD].put (l_WordVarType, 'Dnum', to_char(DopSog.[NUM]));
    [WORD].put (l_WordVarType, 'Sdate', to_char(DopSog.[SIGN_DATE],'DD/MM/YYYY'));
    [WORD].put (l_WordVarType, 'Ddate', to_char(DopSog.[BEG_DATE],'DD/MM/YYYY'));
    [WORD].put (l_WordVarType, 'Edate', to_char(DopSog.[END_DATE],'DD/MM/YYYY'));
    for sumsafeprol in ::[DOC_COM_JOUR] all where sumsafeprol%collection = this.[ARRAY_OPER_DOG] and
    sumsafeprol.[DATE_CALC] = DopSog.[SIGN_DATE] and sumsafeprol.[ADD_INF] like '%Расчетная операция.%' loop
    [WORD].put (l_WordVarType, 'sprol', sumsafeprol.[SUMMA]);
    end loop;
    end loop;

    END;
    [/code]
Матвеев Евгений
Профи


Вступление в Клуб: 31.01.2012
СообщениеСр Июл 24, 2019 16:49    Ответить с цитатой
Полезность: 1
cool_dude пишет:
У меня, что-то значение beg_dat возвращает ноль, т.е. ничего. Ниже приведен код


    [code]
    DECLARE
    beg_dat DATE;
    BEGIN

    SELECT V2(MAX(V2.[DATE_TIME]) : Max_Date)
    IN ::[I_SAFE_L_PROL]
    where V2%collection = this.[PROLS] and V2.[DOPS_TYPE].[CODE] = 'ПРОЛОНГАЦИЯ'
    INTO beg_dat;
    DEBUG(beg_dat,0);

    for DopSog in ::[I_SAFE_L_PROL] all where DopSog%collection = this.[PROLS] and DopSog.[DOPS_TYPE].[code] = 'ПРОЛОНГАЦИЯ'
    and DopSog.[DATE_TIME] = beg_dat
    loop
    [WORD].put (l_WordVarType, 'Dnum', to_char(DopSog.[NUM]));
    [WORD].put (l_WordVarType, 'Sdate', to_char(DopSog.[SIGN_DATE],'DD/MM/YYYY'));
    [WORD].put (l_WordVarType, 'Ddate', to_char(DopSog.[BEG_DATE],'DD/MM/YYYY'));
    [WORD].put (l_WordVarType, 'Edate', to_char(DopSog.[END_DATE],'DD/MM/YYYY'));
    for sumsafeprol in ::[DOC_COM_JOUR] all where sumsafeprol%collection = this.[ARRAY_OPER_DOG] and
    sumsafeprol.[DATE_CALC] = DopSog.[SIGN_DATE] and sumsafeprol.[ADD_INF] like '%Расчетная операция.%' loop
    [WORD].put (l_WordVarType, 'sprol', sumsafeprol.[SUMMA]);
    end loop;
    end loop;

    END;
    [/code]





Судя по тексту (this.[PROLS]) речь идет о ::[IND_SAFE_LEASE]

Можешь чуть чуть поменять? Какой результат выдает после правки? Какой результат выдает DEBUG(beg_dat,0); ?




DECLARE
beg_dat DATE;
BEGIN

SELECT V2(MAX(V2.[DATE_TIME]) : Max_Date)
IN this.[PROLS] all
where V2.[DOPS_TYPE].[CODE] = 'ПРОЛОНГАЦИЯ'
INTO beg_dat;
DEBUG(beg_dat,0);

for DopSog in ::[I_SAFE_L_PROL] all where DopSog%collection = this.[PROLS] and DopSog.[DOPS_TYPE].[code] = 'ПРОЛОНГАЦИЯ'
and DopSog.[DATE_TIME] = beg_dat
loop
[WORD].put (l_WordVarType, 'Dnum', to_char(DopSog.[NUM]));
[WORD].put (l_WordVarType, 'Sdate', to_char(DopSog.[SIGN_DATE],'DD/MM/YYYY'));
[WORD].put (l_WordVarType, 'Ddate', to_char(DopSog.[BEG_DATE],'DD/MM/YYYY'));
[WORD].put (l_WordVarType, 'Edate', to_char(DopSog.[END_DATE],'DD/MM/YYYY'));
for sumsafeprol in ::[DOC_COM_JOUR] all where sumsafeprol%collection = this.[ARRAY_OPER_DOG] and
sumsafeprol.[DATE_CALC] = DopSog.[SIGN_DATE] and sumsafeprol.[ADD_INF] like '%Расчетная операция.%' loop
[WORD].put (l_WordVarType, 'sprol', sumsafeprol.[SUMMA]);
end loop;
end loop;

END;
Volod
Эксперт


Вступление в Клуб: 19.09.2007
СообщениеСр Июл 24, 2019 16:54    Ответить с цитатой
Полезность: Нет оценки
Можно уложиться в один селект,
если отсортировать по [DATE_TIME] desc и добавить exit в loop
Эмиралька
Эксперт


Вступление в Клуб: 09.11.2015
СообщениеЧт Июл 25, 2019 05:40    Ответить с цитатой
Полезность: Нет оценки
Volod пишет:
Можно уложиться в один селект,
если отсортировать по [DATE_TIME] desc и добавить exit в loop

Неоптимально. Oracle для внутренних нужд быстрой выдачи результата фетчит сразу 100 записей. Это можно проверить, если в полях выборки разместить функцию с выводом в лог.
Так что ваш exit сработает после того, как из запроса будут вытянуты 100 записей и подготовлены для передачи в цикл Smile
например:
Код:

   --   разместить в пакете a
   n   number := 0;
   function a return varchar2 is
   begin
      n := n + 1;
      dbms_output.put_line('n = {'||n||'}');
      return n;
   end;

declare
   cursor t is
      select a.a
      from z#ac_fin
   ;
begin
   for i in t loop
      exit;
   end loop;
end;


Лучше окружить запрос подзапросом и взять первую запись
Код:
declare
   cursor t is
   select * from (
      select a.a
      from z#ac_fin
   ) where rownum <= 1
   ;
begin
   for i in t loop
      exit;
   end loop;
end;
cool_dude
Участник - экстремал


Вступление в Клуб: 05.02.2013
СообщениеЧт Июл 25, 2019 08:19    Ответить с цитатой
Полезность: Нет оценки
Цитата:
Можешь чуть чуть поменять? Какой результат выдает после правки? Какой результат выдает DEBUG(beg_dat,0); ?

Поменял, чуть -чуть. Всё получилось. Smile
Результат, выходит то что хотел.
DEBUG выдает дату.
Спасибо огромное.
cool_dude
Участник - экстремал


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

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