Postgres функция для возврата массива int - PullRequest
0 голосов
/ 22 января 2020

Я погружаю свой палец в мир Postgres хранимых процедур / функций и столкнулся с некоторыми трудностями при прорезывании зубов. Следуя документации и различным примерам, с которыми я сталкивался, я написал функцию

CREATE FUNCTION array_intersect(a INT[],b INT[]) RETURNS INT[] AS $$
BEGIN
 DECLARE result INT[];
 SELECT INTO result ARRAY(
 SELECT UNNEST($1) INTERSECT  SELECT UNNEST($2)
 return result;
END; $$ 
LANGUAGE plpgsql; 

только для того, чтобы увидеть ошибки, такие как

Ошибка в запросе: ОШИБКА: синтаксическая ошибка в или около " INTO "LINE 4: SELECT INTO ARRAY результата (CONTEXT: недопустимое имя типа" INTO ARRAY результата (SELECT UNNEST ($ 1) INTERSECT SELECT UNNEST ($ 2) возвращают результат "

Я явно что-то здесь не так делаю) но я не вижу, что это может быть. Насколько я могу судить, я

  • правильно объявил два параметра и их типы в функции
  • Указал, что функция должна возвращать массив int в качестве результата
  • Объявлена ​​переменная для хранения результата
  • Заполнить его с помощью select
  • вернуть результат

Я нахожу синтаксис функции Postgres довольно загадочным, но, возможно, это только из-за моего нового восприятия ie. Я был бы очень признателен за любую помощь в получении правильного синтаксиса

Ответы [ 2 ]

0 голосов
/ 22 января 2020

У вас есть несколько ошибок в вашей структуре PL / pg SQL:

Блок DECLARE должен быть до первого НАЧАЛА.

Часть INTO при сохранении результата запроса в переменную идет после списка SELECT.

Не ошибка, но нет необходимости ссылаться на параметры по позиции:

CREATE FUNCTION array_intersect(a INT[],b INT[]) RETURNS INT[] 
AS $$
DECLARE 
  result INT[];

BEGIN
  SELECT ARRAY(SELECT UNNEST(a) INTERSECT  SELECT UNNEST(b))
    into result;

  return result;

END; $$ 
LANGUAGE plpgsql; 

Но такие короткие функции гораздо лучше пишутся с language sql (как показано в ответе Лоренца ), не требуется PL / pg SQL.

0 голосов
/ 22 января 2020

У вас несбалансированные скобки, например.

Я полагаю, вы ищете

CREATE OR REPLACE FUNCTION array_intersect(int[], int[]) RETURNS int[]
LANGUAGE sql IMMUTABLE STRICT AS
'SELECT array_agg(a) FROM ((SELECT unnest($1) AS x) INTERSECT 
 (SELECT unnest($2) AS y)) AS a(a)';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...