テーブルを返すPostgresの関数を作成私はこの機能を持っている
CREATE OR REPLACE FUNCTION public.getusers(in user_id numeric)
RETURNS SETOF record
AS
$BODY$
DECLARE
ids character varying;
BEGIN
CREATE or REPLACE TEMP VIEW test AS
SELECT fx.*,EXTRACT(epoch FROM fx.time -(fx.timebuffer::text||' minute')::INTERVAL)::DOUBLE PRECISION as startTime
,EXTRACT(epoch FROM fx.time +(fx.timebuffer::text||' minute')::INTERVAL)::DOUBLE PRECISION as endTime
-- ... maybe more columns and expressions ...
FROM userlocation fx
;
CREATE or REPLACE TEMP VIEW buffer AS
SELECT *,st_buffer(location,ul.buffer) as buffered from userlocation ul
;
RETURN QUERY (
select "UserInfo".username as uid,"UserInfo"."userID" as uname,"UserInfo".id as id from "UserInfo" , (
(SELECT f1."userID"--,f1."ID" as locationID
FROM test f1
WHERE EXISTS(
SELECT *
FROM test f2
WHERE numrange((f2.startTime) :: NUMERIC, (f2.endTime) :: NUMERIC) &&
numrange((f1.startTime) :: NUMERIC, (f1.endTime) :: NUMERIC)
AND f2.locationtype = f1.locationtype
AND f2."userID"=user_id
AND f2.locationtype = 2)
-- AND f2."ID" <> f1."ID")
INTERSECT
SELECT u1."userID"--,u1."ID"
FROM buffer AS u1,
(SELECT *
FROM buffer ul) AS u2
WHERE st_intersects(u1.buffered, u2.buffered) = true
AND u1.locationtype = u2.locationtype
AND f2."userID"=user_id
AND u1.locationtype = 2)
-- AND u1."ID" <> u2."ID")
INTERSECT
(SELECT f3."userID"--,f3."ID"
FROM test f3
WHERE EXISTS(
SELECT *
FROM test f4
WHERE numrange((f4.startTime) :: NUMERIC, (f4.endTime) :: NUMERIC) &&
numrange((f3.startTime) :: NUMERIC, (f3.endTime) :: NUMERIC)
AND f4.locationtype = f3.locationtype
AND f2."userID"=user_id
AND f4.locationtype = 1)
-- AND f4."ID" <> f3."ID")
INTERSECT
SELECT u3."userID"--,u3."ID"
FROM buffer AS u3,
(SELECT *
FROM buffer ul) AS u4
WHERE st_intersects(u3.buffered, u4.buffered) = true
AND u3.locationtype = u4.locationtype
AND f2."userID"=user_id
AND u3.locationtype = 1)
-- AND u3."ID" <> u4."ID")
) inter WHERE inter."userID"="UserInfo".username);
--Some code which build the ids string, not interesting for this issue
-- RETURN QUERY EXECUTE 'SELECT users.id, users.firstname, users.lastname
-- FROM public.users WHERE ids IN (' || ids || ')';
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
私はRETURN QUERY(....)でクエリ部分を実行したときに私のテーブルを与えることになって、このクエリは、それがうまく動作しますが、私はこの機能を実行すると、それは私が間違っているの
ERROR: missing FROM-clause entry for table "f2"
Where: PL/pgSQL function getusers(numeric) line 20 at RETURN QUERY
私は、このエラーが発生します?あなたは、問題を見つける私を助けてくださいことができますか? おかげで第二に
最初のINTERSECTの後には、 "userID"がありますが、利用できるのはu1 en u2のみです。 – Eelke
@Eelkeあなたの答えのおかげで、なぜ、私はエラーを与えていないPostqlのSQLウィンドウからコードを実行するとき? –