Как передать вывод массива SQL-запроса в функцию PostgreSQL (PL / pgSQL)? - PullRequest
1 голос
/ 14 февраля 2011

Я могу сделать следующее в SQL, где «массив» user_ids передается в предложение where запроса SQL.

select * from users where id in (select user_id from profiles);

Я хотел бы сделать то же самое, нопередать массив в функцию PostgreSQL (PL / pgSQL), как показано ниже.Как мне объявить функцию и работать с «массивом» внутри функции?

select * from users_function(select user_id from profiles);

CREATE OR REPLACE FUNCTION users_function(....)
  RETURNS void AS
$BODY$
....

Ответы [ 2 ]

2 голосов
/ 14 февраля 2011

Объявите тип данных массива [] в функции, затем используйте агрегатную функцию array_agg, чтобы преобразовать оператор выбора в массив.

CREATE OR REPLACE FUNCTION users_function(myints integer[])
$$
 BEGIN
      -- you need to find the bounds with array_lower and array_upper
  FOR i in array_lower(myints, 1) .. array_upper(myints, 1) LOOP
     Raise Notice '%', myints[i]::integer;
  END LOOP;
 END;
$$

select * from users_function(array_agg((select user_id from profiles)));
0 голосов
/ 22 февраля 2011

Я не смог получить подход nate c array_agg, как я описал выше.Это опция:

select * from test_array('{1,2}');

CREATE OR REPLACE FUNCTION test_array(user_ids integer[])
  RETURNS void AS
$$
declare
begin
FOR i in array_lower(user_ids, 1) .. array_upper(user_ids, 1) LOOP
  RAISE NOTICE '%', user_ids[i]::integer;
END LOOP;
end
$$
LANGUAGE plpgsql;
...