2017-12-19 50 views
0
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; 
+0

は、カーソルを使用し機能を通じて、親テーブルに継承する子テーブルを作成したいです。 – kalpna

答えて

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