Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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 записей и подготовлены для передачи в цикл
например:
Код: |
-- разместить в пакете 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); ?
|
Поменял, чуть -чуть. Всё получилось.
Результат, выходит то что хотел.
DEBUG выдает дату.
Спасибо огромное. |
|
 |
cool_dude Участник - экстремал
Вступление в Клуб: 05.02.2013
|
Чт Июл 25, 2019 08:21   |
|
Полезность: Нет оценки
|
Спасибо всем за предоставленные консультации! |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|