Дело не в функции. Условие запроса попробуйте переписать по-другому.
where g.article = art
and g.storeloc = mh
and g.storeloc = prod.locationfrom(+)
and g.storeloc = prih.locationto(+)
and g.article = prod.article(+)
and g.article = prih.article(+)
У Вас получается, что будет результат тогда и только тогда, когда есть и расходы и приходы по артикулу. а ведь их может не быть.
(и я у sysdate по-другому конвертацию написала: to_date(sysdate,'dd.mm.yyyy') . но это некритично, кмк)
вот такой вариант у меня работает:
create or replace function get_goods_ondate
(art in string,mh in number,dat in date) return number is
Res number(14,3);
begin
Select ost_dat
into Res
from (
Select prod.article,
g.quantity - (nvl(prih.wiq, 0)-nvl(prod.prq, 0)) as ost_dat
from (Select ssc.article, sum(ssc.quantity) as prq, dsc.locationfrom
from supermag.smspec ssc, supermag.smdocuments dsc
where dsc.id = ssc.docid
and dsc.doctype = ssc.doctype
and ssc.doctype in ('CS','WO')
and dsc.createdat >=
to_date(dat, 'dd.mm.yyyy')
and dsc.createdat <=
to_date(sysdate,'dd.mm.yyyy')
group by ssc.article,dsc.locationfrom) prod,
(Select swi.article,sum(swi.quantity) as wiq,dwi.locationto
from supermag.smspec swi, supermag.smdocuments dwi
where dwi.id = swi.docid
and dwi.doctype = swi.doctype
and swi.doctype = 'WI'
and dwi.docstate = 3
and dwi.createdat >=
to_date(dat, 'dd.mm.yyyy')
and dwi.createdat <=
to_date(sysdate,'dd.mm.yyyy')
group by swi.article,dwi.locationto) prih,
supermag.smgoods g
where
g.article = art
and g.storeloc = mh
and g.storeloc = prod.locationfrom(+)
and g.storeloc = prih.locationto(+)
and g.article = prod.article(+)
and g.article = prih.article(+)
)
;
return(Res);
end get_goods_ondate;