以下可能嗎?
我想有寫在PL/pgSQL的一個過程,它接受作爲參數類似「行集」,我的意思是我需要傳遞給函數類似字典的結構:PL/pgSQL Array of Rows
僞代碼:
function_name({key1:val1,key2:val2, key3:val3 [, ...] })
以下可能嗎?
我想有寫在PL/pgSQL的一個過程,它接受作爲參數類似「行集」,我的意思是我需要傳遞給函數類似字典的結構:PL/pgSQL Array of Rows
僞代碼:
function_name({key1:val1,key2:val2, key3:val3 [, ...] })
訪問此網站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']);
我想你可以使用複合類型和數組參數。喜歡的東西(未經測試):
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,但將此數組作爲一個集合處理。
隨着現代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)"}');
注意的行的一組輸入語法!
感謝您的回覆! – biera 2012-03-10 12:05:15