从单个函数连续更新多个记录

时间:2010-11-17 13:06:16

标签: postgresql

我是postgresql的新手,可以使用指针前进。

问题: 我有一张桌子上有几个字段。其中3个需要使用返回3个数字的函数的结果进行更新。我该怎么做?

示例(显然不起作用):

更新gravitational_relations
设置x,y,z = SQL_CALCULATE_GRAVITY(很多来自选择的数字);

SQL_CALCULATE_GRAVITY返回3个数字。

如果我只能在每个变量中保存这3个数字并在中使用它们 更新....
设置....

 一切都会好的。

如果我要继续使用新设计,请告诉我并举例说明。

感谢任何帮助。

/迈克尔

4 个答案:

答案 0 :(得分:1)

如果“来自选择的很多数字”依赖于每个正在更新的记录,您可以使用:

UPDATE gravitational_relations
SET (x, y, z) = (f.output_param_name1, f.output_param_name2, f.output_param_name3)
FROM SQL_CALCULATE_GRAVITY(a lot of numbers which come from a select) AS f;

否则,如果“来自选择的很多数字”取决于每个更新的记录,您可以使用类似的东西:

UPDATE gravitational_relations
SET (x, y, z) = ((f).output_param_name1, (f).output_param_name2, (f).output_param_name3)
FROM (SELECT id, SQL_CALCULATE_GRAVITY(a lot of numbers which come from a select) AS f FROM gravitational_relations) AS x
WHERE gravitational_relations.id = x.id;

答案 1 :(得分:0)

一种方法是从plpgsql函数中调用更新,并在更新函数中调用重力函数,返回3个输出值。例如Out1,out2和out3。比您的更新使用这些值。

伪代码:

BEGIN FUNCTION
    EXECUTE SQL_CALCULATE_GRAVITY(out1,out2,out3);

    update gravitational_relations
    set x = out1,
        y = out2,
        z = out3;
END FUNCTION

请参阅http://www.postgresql.org/docs/9.0/interactive/plpgsql-declarations.html并搜索输出以查看返回输出参数的函数示例。

答案 2 :(得分:0)

虽然我无法真正看到SQL_CALCULATE_GRAVITY函数如何返回3个单独的数字,如果你确定它会这样,那么你可以使用三个变量来读取这3个数字:

SELECT INTO x, y, z SQL_CALCULATE_GRAVITY();

然后您可以使用这些变量更新另一个表:

UPDATE table1 SET field1=x, field2=y, field3=z WHERE some_id=some_number;

答案 3 :(得分:0)

您应该可以直接访问这些字段:

UPDATE foo
SET    bar1 = (SQL_CALCULATE_GRAVITY(numbers...)).bar1,
       bar2 = (SQL_CALCULATE_GRAVITY(numbers...)).bar2,
       ...

如果SQL_CALCULATE_GRAVITY()是稳定/不可变的,那么每行只会调用一次。