在 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 中使用游标创建子表函数的主要内容,如果未能解决你的问题,请参考以下文章

Python - 自动创建子记录

如何使用条件 Api 创建子查询

使用 pandas 数据透视表创建子图

postgresql partition分表的总结

postgresql partition分表的总结

Microsoft Access:在插入之前获取当前记录并创建子记录