0

我曾经在邮件列表http://archives.postgresql.org/pgsql-hackers/2005-06/msg01481.php中读过这个条目

SELECT *
FROM foo_func(
    c => current_timestamp::timestamp with time zone,
    a => 2,
    b => 5
);

现在我需要这种可以将关联数组参数传递给函数的解决方案。我是否需要制作一个虚拟表,然后将该表用作参数类型?或者有什么直接的解决方法吗?或者这个黑客已经实施了吗?

或者我可以使用 pl/python 模拟相同的吗?

4

2 回答 2

2

这是在9.0 版本中实现的:

4.3.2. 使用命名符号

在命名符号中,每个参数的名称都使用 := 指定,以将其与参数表达式分开。例如:

SELECT concat_lower_or_upper(a := 'Hello', b := 'World');
 concat_lower_or_upper 
-----------------------
 hello world
(1 row)
于 2012-04-08T08:49:49.873 回答
2

以下是使用 hstore 和 PG-8.4 for debian 回答的步骤。

1)如果尚未安装,请安装 contrib 包

# apt-get 安装 postgresql-contrib-8.4

2)在相关数据库中安装hstore

$ psql -U postgres -d 数据库名
# \i /usr/share/postgresql/8.4/contrib/hstore.sql

2bis) 如果没有安装plpgsql语言,安装它(还是在psql里面作为postgres用户)

# 创建语言 plpgsql;

3) 创建以 hstore 作为输入的函数。这是 plpgsql 中的一个示例,它仅枚举键和值:

CREATE OR REPLACE function enum_hstore(in_h hstore) returns void
as $$
declare
  kv record;
begin
  for kv in select * from (select (each(in_h)).*) as f(k,v) loop
    raise notice 'key=%,value=%',kv.k,kv.v;
  end loop;
end
$$ language plpgsql;

4)调用函数。由于键和值是文本类型,因此可能需要将非文字条目转换为文本,就像问题中的 current_timestamp 调用一样。例子:

  select enum_hstore(
    hstore('c',current_timestamp::text) ||
    'a=>2,b=>5'::hstore
  );

上述函数的预期结果:

注意:键=a,值=2
 注意:键=b,值=5
 注意:key=c,value=2012-04-08 16:12:59.410056+02
于 2012-04-08T14:17:02.640 回答