Параметр массива функций Postgresql 10 PL / pgSQL - PullRequest
0 голосов
/ 03 ноября 2018

Я решаю проблему с функцией PL / pgSQL, но все еще не могу найти ответ.

Мне нужно вызвать мою функцию в PHP (7.2) и отправить массив, подобный этому. Это массив массивов.

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

А затем мне нужно перебрать этот массив и получить доступ к каждому значению.

Кто-нибудь знает, как решить эту проблему?

В общем, я знаю, что PHP (PDO) все еще недостаточно подготовлен для таких ситуаций.

Большое спасибо за ваши ответы и советы

1 Ответ

0 голосов
/ 04 ноября 2018

Значение массива может быть создано как литерал или как функция или результат конструктора массива. Вы должны знать:

  • Массивы 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.

...