在postgresql中使用游标创建子表函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在postgresql中使用游标创建子表函数相关的知识,希望对你有一定的参考价值。

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;
答案

您的函数中不需要显式游标。你可以使用简单的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 - 自动创建子记录

Greenplum(PostgreSql)中函数内游标的使用实例

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

postgresql partition分表的总结

postgresql partition分表的总结

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