2012-03-09 5 views
0

以下は可能ですか?
私は私が辞書のような構造を関数に渡す必要がある意味、「行のコレクション」のようなパラメータなものとして受け取るPL/pgSQLで書かれた手順を持つようにしたい:PL/pgSQL行の配列

擬似コード:

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

答えて

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

私はあなたが複合型や配列引数を使用することができると思います。 (未テスト)のようなもの:

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; 

あなたはこの配列に重複keyvalue Sと同じキーと異なる値を持つkeyvalue Sを追加することができ、これは、真の辞書ではありません。しかし、引数を関数に渡すだけで十分です。

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)"}'); 

は、行の配列のための入力構文に注意してください!

関連する問題