我正在编写一个 PL/pgSQL 函数,它为我需要检查它是否返回某些内容的查询创建一个游标。
我正在做的是这样的:
我发现,检查,如果该查询返回的东西用光标是最好的选择,因为它(加入5个表和大量列)一个很长的查询和SELECT ... INTO
不正确的顺心,因为我必须创建一个TYPE
自查询具有来自一个表的列和用于距离计算的列。
问题是我目前仅使用游标来检查查询是否在我打开和关闭它的循环中返回了某些内容。一旦查询返回某些内容,我就退出循环并返回查询。我可以马上说,这是我需要的丑陋的解决方法。也许有人可以帮助我解决这个问题。
这是一些显示我目前正在做的事情的代码。
CREATE FUNCTION store_distance(
latitude double precision,
longitude double precision,
radius double precision,
tries integer
)
RETURNS TABLE(
store_id store.id%type,
store_name store.name%type,
distance double precision
)
AS
$$
DECLARE
cur_stores CURSOR FOR
SELECT
store.id,
store.name,
get_distance(latitude, longitude, store.latitude, store.longitude) distance
FROM
store
WHERE
store.latitude BETWEEN (latitude - radius) AND (latitude + radius)
AND store.longitude BETWEEN (longitude - radius) AND (longitude + radius)
ORDER BY …
Run Code Online (Sandbox Code Playgroud) 基本上我想将查询结果分配给自定义类型属性。但是我注意到直接从 PostgreSQL 控制台查询大约需要 0.071 毫秒,并且在几次调用后函数内部为 0.400 毫秒和 0.170 毫秒。explain analyze
甚至显示了第一种情况下索引的使用情况,但没有显示第二种情况。
这就是我正在做的。
CREATE OR REPLACE FUNCTION fun_isliked(
par_client client.id%type,
par_feed feed.id%type
)
RETURNS boolean
AS
$$
BEGIN
RETURN (
EXISTS(
SELECT
1
FROM
feedlike fl
WHERE
fl.client = par_client
AND fl.feed = par_feed
AND fl.state = 1
)
);
END;
$$ LANGUAGE plpgsql STABLE;
Run Code Online (Sandbox Code Playgroud)
以下是上述explain analyze
两种情况的输出:
postgres=# explain analyze select exists (select 1 from feedlike where client = 13 and feed = 68 and state = 1); …
Run Code Online (Sandbox Code Playgroud)