2017-12-19 13 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

wollen Kind-Tabelle erstellen, die zu seiner übergeordneten Tabelle durch Funktion erben Cursor . – kalpna

Antwort

0

Sie benötigen keinen expliziten Cursor in Ihrer Funktion. Sie können eine einfache FOR ... IN ... LOOP.

verwenden Es ist unklar, was Sie von der Funktion zurückgeben möchten. Beispielsweise kann ein lesbarer Text zu jeder erstellten Tabelle zurückgegeben werden.

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$; 

Verwendung:

SELECT create_child1(); 

     create_child1  
------------------------- 
telemetry_3089 created. 
telemetry_3090 created. 
telemetry_3091 created. 
telemetry_3092 created. 
(4 rows) 

Wenn die ids nicht aufeinander folgend sind, können Sie unnest() verwenden, zB:

FOR v_id IN SELECT id FROM unnest(array[3000,3001,3020,3021]) AS id LOOP 
Verwandte Themen