Postgresql 10 PL / pgSQL函数数组参数

时间:2018-11-03 19:36:04

标签: php postgresql plpgsql

我正在解决PL / pgSQL函数的问题,但仍然找不到明确的要求。

我需要在PHP(7.2)中调用我的函数并发送一个像这样的数组。它是数组的数组。

[
    [value1(numeric), value2(timestamp)],
    [value1(numeric), value2(timestamp)]
];

然后我需要遍历此数组并访问每个值。

有人知道如何解决吗?

总的来说,我知道PHP(PDO)仍无法很好地应对这些情况。

非常感谢您的回答和建议

1 个答案:

答案 0 :(得分:1)

可以将数组值创建为文字或函数或数组构造函数结果。您必须知道:

  • PostgreSQL数组是多维的。
  • PostgreSQL支持复合类型数组
  • 不支持数组数组。
  • PostgreSQL的数组是同构的-只能保存一种类型的值。

因此,出于您的目的,您可能应该创建自己的自定义类型,也许是该自定义类型的构造函数。

CREATE mytype AS(value1 numeric, value2 timestamp);

CREATE OR REPLACE FUNCTION mytype_new(numeric, timestamp)
RETURNS mytype AS $$
SELECT ROW($1, $2)::mytype;
$$ LANGUAGE sql IMMUTABLE;

CREATE OR REPLACE FUNCTION myfunc(a mytype[])
RETURNS void AS $$
DECLARE i mytype;
BEGIN
  FOREACH i IN ARRAY a
  LOOP
    RAISE NOTICE '%', i;
  END LOOP;
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT;

您可以使用类型构造函数创建一个数组:

postgres=# select myfunc(array[mytype_new(1, current_timestamp::timestamp), mytype_new(2, current_timestamp::timestamp)]);
NOTICE:  (1,"2018-11-04 05:32:55.579313")
NOTICE:  (2,"2018-11-04 05:32:55.579313")

或者您可以将值输入为文字(注意,这些值应正确加引号并转义):

postgres=# select myfunc('{"(1,2018-11-04 05:32:28.44918)","(2,2018-11-04 05:32:28.44918)"}');
NOTICE:  (1,"2018-11-04 05:32:28.44918")
NOTICE:  (2,"2018-11-04 05:32:28.44918")

这最后两个选择可以从PHP运行。