如何从sql函数中获取循环数据

时间:2017-12-11 08:49:24

标签: postgresql

我需要将数据作为文本获取并从postgresql函数返回为数组。我有一个带有文件的剪辑媒体表,对于每个剪辑ID,我想从媒体剪辑中获取所有文件。我创建了这样的函数:

CREATE OR REPLACE FUNCTION clips_media_array(INT)
RETURNS text[] AS $$
  DECLARE
    r clips_media%ROWTYPE;
    t text[];
  BEGIN
  FOR r IN
    SELECT file_name
    FROM clips_media WHERE id_clips = $1 AND file_type = 2
  LOOP
    t := t.file_name;
  END LOOP;

  END;
$$
LANGUAGE plpgsql;

我有一个错误: ERROR: invalid input syntax for integer: "bfeO4RbZ5R1CUT8.jpg" CONTEXT: PL/pgSQL function clips_media_array(integer) line 6 at FOR over SELECT rows

有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

你太复杂了。

你不需要循环 - 你甚至不需要PL / pgSQL功能。

您可以使用单个SQL查询将其放入一个简单的SQL函数中:

CREATE OR REPLACE FUNCTION clips_media_array(INT)
RETURNS text[] AS 
$$
  SELECT array_agg(file_name)
  FROM clips_media 
  WHERE id_clips = $1 
    AND file_type = 2;
$$
LANGUAGE sql;

当然,您可以直接在代码中使用该SQL查询,而无需使用函数的开销。

如果你需要一个PL / pgSQL函数,你需要从循环内的游标变量中连接值:

以下代码错误:

LOOP
   t := t.file_name;
END LOOP;

应该是:

LOOP
  t := t || R.file_name;
END LOOP;

要从循环记录中引用该列,您需要使用R.file_name并向元素添加元素,您需要使用||

您还需要初始化结果变量,否则它null

DECLARE
  r clips_media%ROWTYPE;
  t text[] := array[]::text[];

最后你错过了一个return声明:

  LOOP
    t := t || r.file_name;
  END LOOP;
  return t; --<< required to return something from a PL/pgSQL function
END;
$$