从PostgreSQL函数返回BIGINT []

时间:2019-01-14 23:11:10

标签: arrays postgresql function

我知道之前也有人问过类似的问题,但是没有一个答案对我有用! 我使用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 

我应该如何为该函数编写代码?

1 个答案:

答案 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