2012-03-09 2 views
0

다음 작업이 가능합니까?PL/pgSQL 행 배열

의사 코드 :

function_name({key1:val1,key2:val2, key3:val3 [, ...] }) 

나는 "행의 모음"과 같은 매개 변수 뭔가, 내가 사전 같은 구조를 함수에 전달할 필요가 뜻을 취 PL/pgSQL의 작성 절차를 갖고 싶어

답변

1

이 사이트를 방문하여 http://postgres.cz/wiki/PostgreSQL_SQL_Tricks을 검색하고 테이블에 배열을 검색하십시오. 최신 버전에는 다른 방법이있을 수 있지만 잠시 후 내 북마크에이 방법이 있습니다. 웹 사이트에서 출처 :

CREATE OR REPLACE FUNCTION unpack(anyarray) 
RETURNS SETOF anyelement AS $$ 
SELECT $1[i] 
    FROM generate_series(array_lower($1,1), 
         array_upper($1,1)) g(i); 
$$ LANGUAGE sql STRICT IMMUTABLE; 

select unpack(array['a','b','c']); 
0

는 당신이 복합 형과 배열 인수를 사용할 수 있다고 생각합니다. (안된)와 같은 뭔가 :이 배열에 같은 키와 다른 값으로 keyvalue들과 keyvalue의를 중복 추가 할 수

create type keyvalue as (
    key text, 
    value text 
); 

create function function_name(keyvalue[]) returns null as $$ 
declare 
    keyvalue x; 
begin 
    foreach x in array $1 loop 
    insert into tablename(key,value) values (x.key, x.value); 
    end loop 
end; 
$$ language plpgsql; 

이, 진정한 사전되지 않습니다. 그러나 인수를 함수에 전달하기 만하면 충분합니다.

JustBob에 의해 언급 된 unpack()을 사용하면 SQL-y가 아닌 루프를 사용하지 않고이 어레이를 집합으로 취급 할 수 있습니다.

+0

답장을 보내드립니다. – biera

6

현대의 PostgreSQL에서는 이러한 기능을 단순화 할 수 있습니다.
테스트 설정은 :

CREATE TABLE tbl1 (id int, value text); 

(유형은 테이블 행 기반으로하는 경우)이 경우에 명시 적으로 형식을 만들 필요가 없습니다, 그것은 암시 적으로 모든 테이블에 생성됩니다.
기능 :

CREATE FUNCTION f_insert_rows_into_tbl1(tbl1[]) 
    RETURNS VOID AS 
$BODY$ 
    INSERT INTO tbl1 (id,value) 
    SELECT (a).* 
    FROM (SELECT unnest($1) AS a) x; 
$BODY$ LANGUAGE sql; 

호출 : 행의 배열

SELECT f_insert_rows_into_tbl1('{"(1,foo)","(2,bar)"}'); 

주 입력 구!