Форум OlegON > Компьютеры и Программное обеспечение > Операционные системы и программное обеспечение > Oracle

Временные таблицы - использование внутри функций. : Oracle

25.04.2024 0:25


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 артикулов.
Часовой пояс GMT +3, время: 00:25.

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