Postgres sql返回值

时间:2016-12-22 17:44:45

标签: postgresql function stored-procedures

我尝试从两列中的所有记录中使用不同的表并在彼此之间划分,但我只得到第一行的结果而不是所有行的结果我如何解决这个问题?

CREATE FUNCTION human() RETURNS integer AS $$
    DECLARE person integer;
    size integer;
    def integer;
    Begin

    Select sizex into size from region;
     Select defx into def from humans;
    osoba = def / size;
    return person;
    END;
$$ LANGUAGE 'plpgsql';

select human();

1 个答案:

答案 0 :(得分:1)

假设你的"人类"表和"地区"表都有一个ID字段。并且假设您的人员表有一个regionId字段,在两个表之间建立关系,我建议您执行以下操作:

CREATE FUNCTION human(arg_humanId int) RETURNS decimal AS $$
    DECLARE
      div_result decimal;
    Begin

      SELECT h.defx/r.sizex
        INTO result
        FROM humans h
        JOIN region r on r.ID = h.RegionID
       WHERE h.ID = arg_humanId;
      RETURN div_result;
    END;
$$ LANGUAGE 'plpgsql';

SELECT human(h.ID)
  FROM humans h;

注意我已将数据类型从整数更改为十进制,因为除法通常会产生小数位。

另一种选择是返回 setof 小数并执行函数内的所有逻辑:

CREATE FUNCTION human() RETURNS setof decimal AS $$
    DECLARE
      div_result decimal;
    Begin
      RETURN QUERY
      SELECT h.defx/r.sizex
        FROM humans h
        JOIN region r on r.ID = h.RegionID;
    END;
$$ LANGUAGE 'plpgsql';

SELECT *
  FROM human();