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; $$;