【问题标题】:How can I revise this pl/pgsql functions?如何修改这个 pl/pgsql 函数?
【发布时间】:2014-10-06 14:54:12
【问题描述】:

我想要一个PostgreSQL扩展函数,它可以首先检查表face_area(face int, area float)中是否有一行,如果没有,计算并插入表中。返回应该是区域(float),输入应该是面(int)。我在下面写了一个函数,但是结果只能是setof float,如何修改函数让返回的结果只是一个float?

CREATE FUNCTION get_area (face integer) RETURNS setof float AS $$
BEGIN
RETURN query  SELECT area  FROM face_area WHERE face_area.face=$1;
IF NOT FOUND THEN
    INSERT INTO face_area VALUES ($1,calc_area($1));
END IF;           
END;
$$ LANGUAGE plpgsql;

select get_area(1);
select * from face_area;

【问题讨论】:

  • 你能澄清一下 WHERE 子句吗?您将 face_area 描述为 (id int, area float) 但使用列“face”...?
  • @AndrewWolfe 我已经修改过了。
  • 另外,为什么 SETOF 浮动?为什么需要返回查询结果?
  • @AndrewWolfe 我需要返回 area=get_area(face) 以便在另一个查询中我可以使用 WHERE get_area(face)>5;所以,我不想要 setof float ,我只想浮动。但我不知道如何修改查询...
  • 这可以通过一条语句完成:insert into face_area (face, area) select 42, calc_area(42) where not exists (select 1 from face_area where face = 42) returning face_area.area。你也不应该使用floatfloating-point-gui.de

标签: postgresql


【解决方案1】:

试试这个:

CREATE or replace FUNCTION get_area (face integer) RETURNS  float AS $$
DECLARE
        RSLT float;
BEGIN
SELECT area into rslt FROM face_area WHERE face_area.face=$1;
IF NOT FOUND THEN
    rslt := calc_area ($1);
    INSERT INTO face_area VALUES ($1,rslt);
END IF;   
return rslt;
END;
$$ LANGUAGE plpgsql;

您需要有一个 RETURN 语句。我添加了 RSLT 变量来保存计算的面积值并返回它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 2013-11-15
    • 1970-01-01
    相关资源
    最近更新 更多