[ОТВЕТИТЬ]
25.03.2015 07:20
Starter
 
Встал вопрос - можно ли использовать временные таблицы внутри функций ?
Нужно для получения остатков. Т.е. пишем функцию, внутри проверяется существование временной таблицы, если ее нет, то вызывается процедура расчета остатков, если есть, то данные берутся из временной таблицы.
Как бы это правильнее оформить ?
Проверять число строк таблицы ? или само ее существование ?
Речь идет о таблице SUPERMAG.TTREMAINS и процедуре Remains.Calc.
Как внутри функции описать модуль проверки.
т.е. что то типа
IF <таблица не существует> THEN
Remains.Calc
END IF;
<читаем данные из временной таблицы>

Вопрос - как правильно проверить вот это <таблица не существует> ?
Или есть некие конструкции языка, специально предназначенные для таких случаев ?
25.03.2015 07:29
Mtirt
 
Таблица то существует. Она не создается/удаляется процедурой Remains.Calc, а заполняется.
Причем заполняется в той сессии, от которой запрос запущен.
Так что лучше проверять количество строк в таблице. Если больше 0, то выполнять требуемые действия...
25.03.2015 07:36
Starter
 
select count(*) from ttremains; ?
25.03.2015 07:42
OlegON
 
копать приблизительно сюда:
Код:
declare tt number;
select count(*) into tt from all_tables where owner=... and table_name=...;
if (tt!=0) then таблица есть endif;
25.03.2015 07:43
OlegON
 
о :) зря я отвлекся после открытия страницы... ну, пусть пример определения существования таблицы тоже будет.
25.03.2015 08:37
Starter
 
Теперь встал другой вопрос -
как избавиться от ORA-14551: cannot perform a DML operation inside a query

сама функция:
Create or Replace Function Article_LastDocID2(MyStoreloc IN SUPERMAG.SMSTORELOCATIONS.ID%TYPE, MyArticle IN SUPERMAG.SMCARD.ARTICLE%TYPE)
return VARCHAR2 is
res_all varchar2 (100);

res_tt integer:=0;

BEGIN
select count(*) into res_tt from supermag.TTREMAINS;
if res_tt=0 then
supermag.Rep_Ostatki(to_char(sysdate-1,'dd.mm.yyyy'),0,0,0,2,0,0,0);
commit;
end if;
select D.ID into res_all from SUPERMAG.TTOSTATKI1 D where D.LOCID=MyStoreloc and D.ARTICLE=MyArticle;

RETURN res_all;
EXCEPTION WHEN NO_DATA_FOUND THEN RETURN NULL;
END Article_LastDocID2;
/
25.03.2015 08:38
OlegON
 
нажал на ошибку в своем сообщении? :) про автономные транзакции придется почитать...
25.03.2015 08:53
Starter
 
pragma autonomous_transaction; добавлял. В первый раз, почему то функция работала, но пустоту возвращала.
теперь работает.
Другой вопрос - с автономными транзакциями табличка ttremains будет сохраняться после вызова функции или удалится ?
Фунция будет внутри select использоваться (в бизнес анализе), т.е. вариант сперва запускаем расчет, а потом пользуемся временными таблицами не прокатит..
25.03.2015 09:16
Mtirt
 
Может не надо делать это в бизнес-анализе?
Может стоит уже перейти на отчеты в FastReport?
Объясню свою позицию. В Бизнес-Анализе твоя функция будет вызываться для каждой пары артикул-место хранения.
В FastReport - один раз, для всего списка карточек товаров.
По времени выполнения - как в Бизнес-анализе будут посчитаны 5 артикулов.
25.03.2015 09:34
Starter
 
Не соглашусь, в бизнес-анализе можно добавлять произвольные фильтры, в Fast Reports для этого постоянно отчет придется переделывать. Плюс механизм выгрузки в эксель - тут выделил, скопировал, в экселе вставил, в Fast reports экспорт в эксель, лишние телодвижения.
Да и то, что функция вызывается для каждой пары - не проблема, если бы расчет остатков запускался один раз, а при дальнейших вызовах использовалась временная табличка.
25.03.2015 09:40
OlegON
 
Насколько мне известно, в БА никаких предрасчетных функций не предусмотрено... О том Mtirt и говорит.
25.03.2015 09:45
Starter
 
Не предусмотрено, вот и хотелось бы как то это обойти, в связи с этим и вариант с функцией.
Таки интересно - с автономной транзакцией будет сохраняться временная таблица, или каждый раз заново запускаться будет ?
25.03.2015 10:56
Mtirt
 
Цитата:
Starter Не предусмотрено, вот и хотелось бы как то это обойти, в связи с этим и вариант с функцией.
Таки интересно - с автономной транзакцией будет сохраняться временная таблица, или каждый раз заново запускаться будет ?
Насколько я поняла из текста функции, автор и пытается это обойти.
Т.е. запустить расчет Remainc.Calc по списку артикулов, а потом просто выбирать данные и темповой таблицы.
Проблема в том, как из бизнес-анализа передать, при использовании этой функции не артикул товара, а список артикулов.
25.03.2015 10:57
Mtirt
 
Цитата:
Starter Не предусмотрено, вот и хотелось бы как то это обойти, в связи с этим и вариант с функцией.
Таки интересно - с автономной транзакцией будет сохраняться временная таблица, или каждый раз заново запускаться будет ?
А вот этого никто не пробовал. Поэкспериментируй. Возможно и сработает...
25.03.2015 11:35
vdm
 
Как я понял у автора остатки сразу по всем артикулам считаются, без фильтра. Терпимо, если их не слишком много.

Но если сработает, то возможна другая проблема.
Таблица 1 раз заполнится. И если сессия БА не переподключается при каждом старте отчета, то из нее так и будут "вечно" выбираться устаревшие данные.
25.03.2015 14:29
Starter
 
Сработать - сработало, но vdm опередил с описанием последствий :)
Сессия БА не переподключается при каждом старте, поэтому данные так и выбираются устаревшие. Финт ушами не сработал :(
Опции темы


Часовой пояс GMT +3, время: 01:09.

 

Форум сделан на основе vBulletin®
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot и OlegON
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.