以下可能吗?
我想有写在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