我知道之前也有人问过类似的问题,但是没有一个答案对我有用! 我使用POSTGRESQL 8.4,并尝试从函数返回BIGINT值的数组。 我的查询如下:
Extract is introduced in Typescript 2.8. Which explains the errors.
,我想按以下方式使用该功能:
CREATE OR REPLACE FUNCTION public.bigint_func(
in "in_arg" BIGINT)
RETURNS SETOF BIGINT
AS
$body$
DECLARE bigint_list BIGINT [ ];
BEGIN
SELECT
id
FROM
table1
INTO bigint_list;
RETURN NEXT;
END
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER;
但出现以下错误:
SELECT *
FROM
table1
JOIN (SELECT ids
FROM bigint_func(123))t2 ON table1.id = t2.id
我应该如何为该函数编写代码?
答案 0 :(得分:2)
看起来您可能正在混合两种尝试完成的方法。遍历并一次返回一个值,或者将所有内容作为查询返回。
我认为这两种方法都可以。
循环并一次返回一行。
CREATE OR REPLACE FUNCTION bigint_func(
in "in_arg" BIGINT)
RETURNS SETOF BIGINT
AS
$body$
DECLARE
bigint_list BIGINT [ ];
my_id bigint;
BEGIN
for my_id in
SELECT
id
FROM
table1
loop
RETURN NEXT my_id;
END loop;
end;
$body$
LANGUAGE 'plpgsql'
VOLATILE
或将整个查询作为数据集返回。
CREATE OR REPLACE FUNCTION bigint_func(
in "in_arg" BIGINT)
RETURNS SETOF BIGINT
AS
$body$
DECLARE
bigint_list BIGINT [ ];
BEGIN
return query
SELECT
id
FROM
table1;
end;
$body$
LANGUAGE 'plpgsql'
VOLATILE
-编辑-
要使查询正常工作,可以将返回类型更改为表:
CREATE OR REPLACE FUNCTION bigint_func(in "in_arg" BIGINT)
RETURNS table (id bigint)
AS
$body$
BEGIN
return query
SELECT
table1.id
FROM
table1;
end;
$body$
LANGUAGE 'plpgsql'
VOLATILE;
然后,您可以将字段命名为任意名称(在这种情况下为id)
SELECT *
FROM
table1
join bigint_func(123) t2
ON table1.id = t2.id