我需要将数据作为文本获取并从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
有人可以帮我吗?
答案 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;
$$