2012-04-09 2 views
1

Код ниже дает ошибку на w_add_ax_extra(1, 'k', 'v') ранее это было w_add_ax_extra(some_id, kv.k, kv.v) я изменил его на k, v воспроизвести ту же ошибкуPL/PgSQL вызов функции внутри цикла дает ошибку

declare 
    kv record; 
begin 
    -- Lines skipped 
    for kv in select * from (select (each(extras)).*) as f(k,v) loop 
    raise notice 'key=%,value=%',kv.k,kv.v; 
    w_add_ax_extra(1, 'k', 'v'); 
    end loop; 
    -- Lines Skipped 
end 

Я получаю Ошибку синтаксиса, но могу не понимаю, что мне не хватает

ERROR: syntax error at or near "w_add_ax_extra" 
LINE 1: w_add_ax_extra(1, 'k', 'v') 

Однако если я dummy = w_add_ax_extra(1, 'k', 'v') это работает. Да, эта функция возвращает целое число. Но мне не нужно хранить его здесь. Обязательно ли хранить возвращаемое значение?

ответ

6

Из fine manual:

39.5.2. Выполнение команды без результата

[...]

Иногда полезно оценить выражение или SELECT, запрос, но отказаться от результата, например, когда вызова функции, которая имеет побочные эффекты, но нет полезное значение результата. Для того, чтобы сделать это в PL/PgSQL, используйте ВЫПОЛНЕНИЕ заявление:

PERFORM query; 

курсив мой. Вы не вызывая функцию, говоря что-то вроде f();, вам нужно perform f(); или select f() into ...;:

for kv in select * from (select (each(extras)).*) as f(k,v) loop 
    raise notice 'key=%,value=%',kv.k,kv.v; 
    perform w_add_ax_extra(1, 'k', 'v'); 
end loop; 
+0

Спасибо. Он исправлен. Но все неясно :(Я копирую вставку, что 'f (k, v)' однако работает только 'f', поэтому я удалил часть' (k, v) 'О, извините, что это не работает без' (K, V) ' –