2017-11-01 1 views
0

필자는 pgplsql을 처음 사용하고 있으며, 지금까지는 함수로받은 배열을 반복하는 함수를 만들어야했습니다.plpgsql 함수에서 매개 변수로받은 배열에서 루프하는 방법은 무엇입니까?

새로운 형식의 ID로 수신 된 배열에 포함 된 각 ID를 매핑하는 테이블에 새 레코드를 삽입하는 방법은 수신 된 두 번째 매개 변수에 따라 형식이 달라지며 테이블 "idsTable"을 반환합니다.

ERROR : ARRAY idsList 루프 FOREACH의 OBJECTID : FOREACH의 루프 변수가 알려진 변수 또는 LINE (38) 변수의 목록이 있어야합니다

문제는 그 기능을 만들려고 할 때 나에게 오류를 전송하는 것입니다

내가 본 적이없는 예제에서 objectid 변수를 선언해야하는지 확실하지 않습니다. 잘못 될 수 있는지의

CREATE OR REPLACE FUNCTION createId(idsList varchar[], objectType varchar) 
RETURNS TABLE(original_id varchar, new_id char) as 
$$ 
BEGIN 
IF LOWER(objectType) = 'global' THEN 
    FOREACH objectid IN ARRAY idsList LOOP 
     INSERT INTO idsTable(original_id, new_id) 
     VALUES(objectid, 'GID'||nextval('mapSquema.globalid')::TEXT); 
    END LOOP; 
ELSE 
    FOREACH objectid IN ARRAY idsList LOOP 
     INSERT INTO idsTable(original_id, new_id) 
     VALUES(objectid, 'ORG'||nextval('mapSquema.globalid')::TEXT); 
    END LOOP; 
END IF; 
END; 
$$ LANGUAGE plpgsql; 

어떤 아이디어 :

지금까지 나는이 있나요?

편집 : idsTable이 반환되는 부분을 추가하지 않았습니다.

답변

0

관련없는, 그러나 : 당신은 정말 그것에 대한 루프가 필요하지 않습니다. 그리고 한 번만 INSERT을 쓰면 기능을 단순화 할 수 있습니다. 당신은 또한 당신의 기능에서 뭔가를 반환하는 것을 잊었습니다. returns table으로 다음과 같이 선언되어 있으므로 :

CREATE OR REPLACE FUNCTION createid(idslist varchar[], objecttype varchar) 
    RETURNS TABLE(original_id varchar, new_id varchar) as 
$$ 
declare 
    l_prefix text; 
BEGIN 
    IF LOWER(objectType) = 'global' THEN 
    l_prefix := 'GID'; 
    ELSE 
    l_prefix := 'ORG'; 
    END IF; 

    RETURN QUERY --<< return the result of the insert 
    INSERT INTO idstable(original_id, new_id) 
    select t.x, l_prefix||nextval('mapSquema.globalid')::TEXT 
    from unnest(idslist) as t(x) 
    returning * 

END; 
$$ LANGUAGE plpgsql; 
+0

감사합니다. 좋은 조언입니다. 시험해 보겠습니다. –

관련 문제