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

问题描述 投票:0回答:1
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;
postgresql inheritance cursor plpgsql create-table
1个回答
0
投票

您的函数中不需要显式游标。你可以使用简单的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
© www.soinside.com 2019 - 2024. All rights reserved.