Обновить несколько записей подряд из одной функции - PullRequest
0 голосов
/ 17 ноября 2010

Я новичок в postgresql и могу использовать указатель для продвижения вперед.

Проблема: у меня есть таблица с несколькими полями.3 из них должны быть обновлены с результатом от функции, которая возвращает 3 числа.Как мне это сделать?

Пример (который, очевидно, не работает):

update gravitational_relations
установить x, y, z = SQL_CALCULATE_GRAVITY (большое число, которое приходит извыберите);

SQL_CALCULATE_GRAVITY возвращает 3 числа.

Если бы я только мог сохранить эти 3 числа в каждой собственной переменной и использовать их в обновлении
....
set ....
,
все было бы хорошо.

Если я перейду к новому дизайну, пожалуйста, скажите мне и приведите примеры.

Любая помощьоценил.

/ Майкл

Ответы [ 4 ]

1 голос
/ 08 мая 2011

Если «много чисел, которые происходят из выбора» не зависит не , зависит от каждой обновляемой записи, вы можете использовать:

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 голосов
/ 08 мая 2011

Вы должны иметь доступ к полям, например, так:

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

Если SQL_CALCULATE_GRAVITY () является стабильным / неизменным, он будет вызываться только один раз в строке.

0 голосов
/ 17 ноября 2010

Хотя я не могу понять, как функция 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;
0 голосов
/ 17 ноября 2010

Одним из способов является вызов вашего обновления из функции 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 и найдите выход, чтобы увидеть пример функции, которая возвращает выходные параметры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...