在 postgresql 中使用游标创建子表函数
Posted
技术标签:
【中文标题】在 postgresql 中使用游标创建子表函数【英文标题】:create child table function using cursor in postgresql 【发布时间】:2017-12-19 10:48:25 【问题描述】:CREATE FUNCTION create_child1()
RETURNS TABLE(sys_user_id integer,
sys_service_id integer
)
LANGUAGE 'plpgsql'
COST 100
VOLATILE
ROWS 1000
AS $BODY$
DECLARE
curr_id CURSOR IS
SELECT id FROM users WHERE id in (3089,3090,3091,3092);
v_id bigint;
BEGIN
OPEN curr_id;
LOOP
FETCH curr_id INTO v_id;
EXIT WHEN not found ;
EXECUTE format('
CREATE TABLE IF NOT EXISTS %I (
sys_user_id integer,
sys_service_id integer
id bigint NOT NULL primary key
)
INHERITS (telemetry_master)
WITH (
OIDS=FALSE
)', 'telemetry_' || v_id);
end loop;
close curr_id;
fetch next from curr_id into v_id;
END
$BODY$ LANGUAGE plpgsql;
【问题讨论】:
想创建子表,通过使用游标的函数继承到其父表。 【参考方案1】:您的函数中不需要显式游标。您可以使用简单的FOR ... IN ... LOOP.
不清楚你想从函数返回什么。例如,它可以返回关于每个创建的表的可读文本。
CREATE OR REPLACE FUNCTION create_child1()
RETURNS SETOF text LANGUAGE plpgsql
AS $BODY$
DECLARE
v_id int;
BEGIN
FOR v_id IN 3089..3092 LOOP
EXECUTE format('
CREATE TABLE IF NOT EXISTS telemetry_%s (
sys_user_id integer,
sys_service_id integer,
id bigint NOT NULL primary key
)
INHERITS (telemetry_master)', v_id);
RETURN NEXT format('telemetry_%s created.', v_id);
END LOOP;
END $BODY$;
用途:
SELECT create_child1();
create_child1
-------------------------
telemetry_3089 created.
telemetry_3090 created.
telemetry_3091 created.
telemetry_3092 created.
(4 rows)
如果ids
不连续,可以使用unnest()
,例如:
FOR v_id IN SELECT id FROM unnest(array[3000,3001,3020,3021]) AS id LOOP
【讨论】:
以上是关于在 postgresql 中使用游标创建子表函数的主要内容,如果未能解决你的问题,请参考以下文章