2010-11-17 11 views
0

Я новичок в postgresql и могу использовать указатель, чтобы двигаться вперед.Обновление нескольких записей в строке из одной функции

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

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

обновление gravitational_relations
множество х, у, г = SQL_CALCULATE_GRAVITY (много число, которое исходит от выбора);

SQL_CALCULATE_GRAVITY возвращает 3 номера.

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

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

Любая помощь приветствуется.

/Michael

+1

Функция SQL_CALCULATE_GRAVITY возвращает запись или массив? – jira

ответ

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() устойчиво/неизменен, он будет вызываться только один раз для каждой строки.

Смежные вопросы