PL / pgSQL行数组

时间:2012-03-09 19:51:24

标签: arrays postgresql plpgsql

以下是否可行?
我希望有一个用PL / pgSQL编写的过程,它的参数类似于“行的集合”,我的意思是我需要传递给类似字典的结构:

伪代码:

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

3 个答案:

答案 0 :(得分:7)

使用现代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)"}');

注意行数组的输入语法!

答案 1 :(得分: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']);

答案 2 :(得分: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;

这不是真正的字典,因为您可以为此数组添加具有相同键和不同值的重复keyvaluekeyvalue。但只是将参数传递给函数就足够了。

使用JustBob提到的unpack()将不允许使用不是SQL-y的循环,而是将此数组视为一个集合。

相关问题