Yes, I too used temp, but i think all user connecting request to DB have same session,
now understand any request has separate session.
CREATE OR REPLACE FUNCTION getObserverItem(i_limit INT,i_offset INT, i_observerId INTEGER, i_callStateText TEXT, i_maxText TEXT DEFAULT 'callDate')
RETURNS SETOF observer_holder
LANGUAGE plpgsql
AS $$
declare
count INTEGER;
observerRecord RECORD;
customerRecord RECORD;
adviserRecord RECORD;
lastCallInfoRec RECORD;
result observer_holder;
BEGIN
SELECT COUNT(observerid) INTO count FROM "CustomersVsObserver" INNER JOIN "CustomersVsAdviser" AS t2 ON t2.customerid = "CustomersVsObserver".customerid WHERE observerid = i_observerId;
IF i_offset = 0 THEN
IF count < i_limit THEN
i_limit := count;
ELSE
i_offset := count - i_limit;
END IF;
ELSE
IF 0 > i_offset THEN
i_offset := 0;
END IF;
END IF;
FOR observerRecord IN SELECT * FROM "CustomersVsObserver" WHERE observerid = i_observerId LIMIT i_limit OFFSET i_offset LOOP
SELECT * INTO adviserRecord FROM "CustomersVsAdviser" WHERE customerid = observerRecord.customerid LIMIT 1;
IF adviserRecord.adviserid IS NULL THEN
CONTINUE;
END IF;
SELECT * INTO customerRecord FROM "CommonUsersModel" WHERE UserID = observerRecord.customerid LIMIT 1;
CREATE LOCAL TEMP TABLE callInfo AS SELECT * FROM "CustomerCallingInfo" WHERE customerid = observerRecord.customerid AND adviserid = adviserRecord.adviserid;
EXECUTE 'SELECT DISTINCT ON (AdviserID,CustomerID) *,MAX('|| i_maxText ||') OVER (PARTITION BY AdviserID,CustomerID) AS lastDate FROM callInfo WHERE callState ' || i_callStateText || ';' INTO lastCallInfoRec;
--EXECUTE query1 INTO lastCallInfoRec;
result."CustomerName" := customerRecord.name;
result."CustomerFamily" := customerRecord.family;
result."CustomerNumber" := customerRecord.uniquekey;
result."CustomerID" := observerRecord.customerid;
result."AdviserID" := adviserRecord.adviserid;
result."AdviserName" := (SELECT concat(name,' ',family) FROM "CommonUsersModel" WHERE userid = adviserRecord.adviserid);
result."AllCallCount" := (SELECT COUNT(customerid) FROM callInfo);
result."ObserverCallCount" := (SELECT COUNT(customerid) FROM callInfo WHERE calldate > observerRecord.setdate);
result."LastCallTime" := lastCallInfoRec.lastDate;
result."LastCallState" := lastCallInfoRec.callstate;
result."OffsetRow" := i_offset;
RETURN next result;
DROP TABLE IF EXISTS callInfo;
END LOOP;
END; $$;