2012-03-09 73 views
0

以下可能嗎?
我想有寫在PL/pgSQL的一個過程,它接受作爲參數類似「行集」,我的意思是我需要傳遞給函數類似字典的結構:PL/pgSQL Array of Rows

僞代碼:

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

回答

1

訪問此網站http://postgres.cz/wiki/PostgreSQL_SQL_Tricks並搜索Array to table。新版本可能還有其他方法,但我在一段時間後在書籤中添加了這些內容。 來源網站:

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的相同的密鑰和不同的價值,這個數組。但僅僅爲了傳遞一個函數的參數就足夠了。

使用unpack()提到的JustBob將允許不使用循環,它不是非常SQL-y,但將此數組作爲一個集合處理。

+0

感謝您的回覆! – biera 2012-03-10 12:05:15

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

注意的行的一組輸入語法!