将数组传递给存储到postgres

时间:2015-01-07 15:51:46

标签: arrays postgresql stored-procedures plpgsql

喜欢建议我链接到我之前的问题:
PL/pgSQL control structures for lists / arrays

我想将一个数字列表和一个字符列表传递给Postgres存储过程。之后我想用这两个数组做点什么。对于号码列表,你已经帮助了我。我使用CREATE OR REPLACE FUNCTION my_proc(p_amount_list numeric[])作为输入参数,当我调用该过程时,我使用了SELECT my_proc('{2,2,2}');

现在我想知道如何传递一个字符列表以及如何在此之后调用该过程。

1 个答案:

答案 0 :(得分:0)

可以构建一个函数,根据多态输入类型连接字符串或汇总数值:

CREATE OR REPLACE FUNCTION poly_sum_agg(_arr anyarray)
  RETURNS text AS
$func$
BEGIN

CASE (SELECT e.typcategory FROM pg_type e
      WHERE  e.oid = (SELECT typelem FROM pg_type WHERE oid = pg_typeof(_arr)))

WHEN 'S' THEN  -- string types: char, name, text, bpchar, varchar
   RETURN array_to_string(_arr, '');  -- no separator?

WHEN 'N' THEN  -- numeric: int8, int2, int4, oid, float4, float8, money, numeric
   RETURN (SELECT sum(elem)::text FROM unnest(_arr) elem);

ELSE
   RAISE EXCEPTION 'Unexpected array type!';

END CASE;

END
$func$ LANGUAGE plpgsql;

致电(请注意明确的类型广告):

SELECT poly_sum_agg('{1,2,3}'::int[]) AS int_arr; -- Returns '6'

或者:

SELECT poly_sum_agg('{1,2,3}'::text[]) AS text_arr; -- Returns '123'

SQL Fiddle.

这只是一个概念证明。它建立在系统目录pg_type中数组类型的内部表示之上,并且可能无法跨主要版本移植。以下是我从系统目录中检索信息的方法:

SQL Fiddle.

目前还不清楚你的目标是什么。根据您的实际需要,我很可能采取不同的方法。