Я решаю проблему с функцией PL / pgSQL и до сих пор не могу найти четкий ответ.
Мне нужно вызвать мою функцию в PHP (7.2) и отправить массив, как этот. Это массив массивов.
[
[value1(numeric), value2(timestamp)],
[value1(numeric), value2(timestamp)]
];
И тогда мне нужно перебрать этот массив и получить доступ к каждому значению.
Кто-нибудь знает, как это решить?
В общем, я знаю, что PHP (PDO) все еще не очень хорошо подготовлен к таким ситуациям.
Большое спасибо за ваши ответы и советы
Значение массива может быть создано как литерал или как функция или результат конструктора массива. Ты должен знать:
Поэтому для вашей цели, вероятно, вам следует создать собственный пользовательский тип, возможно, конструктор для этого пользовательского типа.
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.
Других решений пока нет …