gpt4 book ai didi

database - 如何将表或行传递给 Postgresql 中的函数?

转载 作者:搜寻专家 更新时间:2023-10-30 21:56:29 25 4
gpt4 key购买 nike

这是代码,当前参数类型是数组,但我想传递一个表或行。

create or replace function skyband_sortedlist(rest point[]) 
returns setof point
as $$
declare

last_x integer :=0;
last_y integer :=0;
begin
for ipoint in (select s0.x,s0.y from unnest(rest))
loop
if ipoint.x>last_x and ipoint.y<>last_y then
last_x = ipoint.x;
last_y = ipoint.y;
return next;
end if;
end loop;
end;
$$ language plpgsql;

最佳答案

行由复合类型表示,如

CREATE TYPE mytype  AS (
id integer,
name text,
fromdate timestamp with time zone
);

您可以使用这样的类型作为函数参数。

对于每个 PostgreSQL 表,自动存在一个具有相同名称和列的类型:

CREATE TABLE mytable (
id integer PRIMARY KEY,
name text,
fromdate timestamp with time zone NOT NULL
);

因此您可以创建一个函数,将这种类型的数组作为参数:

CREATE OR REPLACE FUNCTION myfunc(arg mytable[]) RETURNS void
LANGUAGE plpgsql IMMUTABLE STRICT AS
$$DECLARE
t mytable;
BEGIN
FOREACH t IN ARRAY arg LOOP
RAISE NOTICE 'id = %', t.id;
END LOOP;
END;$$;

可以这样调用(假设mytable中有两行):

SELECT myfunc(array_agg(mytable)) FROM mytable;
NOTICE: id = 1
NOTICE: id = 2
┌────────┐
│ myfunc │
├────────┤
│ │
└────────┘
(1 row)

或者,您可以创建一个将游标作为参数的函数:

CREATE OR REPLACE FUNCTION myfunc(arg refcursor) RETURNS void
LANGUAGE plpgsql IMMUTABLE STRICT AS
$$DECLARE
t mytable;
BEGIN
LOOP
FETCH NEXT FROM arg INTO t;
EXIT WHEN NOT FOUND;
RAISE NOTICE 'id = %', t.id;
END LOOP;
END;$$;

这可以在事务中调用如下:

BEGIN;
DECLARE c CURSOR FOR SELECT * FROM mytable;
SELECT myfunc('c');

NOTICE: id = 1
NOTICE: id = 2
┌────────┐
│ myfunc │
├────────┤
│ │
└────────┘
(1 row)

COMMIT;

关于database - 如何将表或行传递给 Postgresql 中的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43979341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com