2017-12-19 57 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$; 

사용 : ids 연속하지 않은 경우

SELECT create_child1(); 

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

당신이 unnest()을 사용할 수 있습니다, 예를 들면 :

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