Параметр массива функций Postgresql 10 PL / pgSQL

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

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

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

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

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

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

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

0

Решение

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]