2010-11-17 38 views
0

我是新的postgresql,可以使用指針前進。從一個函數更新連續多條記錄

問題: 我有一個表有幾個字段。其中3個需要用返回3個數字的函數的結果進行更新。我怎麼做?

實施例(這顯然不工作):

更新gravitational_relations
組X,Y,Z = SQL_CALCULATE_GRAVITY(批號的其中來自一個選擇);

SQL_CALCULATE_GRAVITY返回3個數字。

如果我能在自己的每一個變量保存這些3個數字,並在
更新使用它們....
集....

一切都會很好。

如果我應該繼續進行新設計,請告訴我並舉例說明。

任何幫助表示讚賞。

/邁克爾

+1

SQL_CALCULATE_GRAVITY函數返回記錄或數組? – jira 2010-11-17 13:40:05

回答

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見並搜索輸出地看到,返回輸出參數的函數的一個例子。

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; 
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; 
0

您應該能夠訪問的字段直接像所以:

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

如果SQL_CALCULATE_GRAVITY()穩定/一成不變的,它會只能每行調用一次。