2012-04-09 7 views
1

Der Code unten auf w_add_ax_extra(1, 'k', 'v') Fehler geben vorher war es w_add_ax_extra(some_id, kv.k, kv.v) ich es k, v änderte den gleichen Fehler zu reproduzierenPL/PgSQL eine Funktion in einer Schleife aufrufen Fehler geben

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 

I Syntax Error bin immer aber konnte nicht verstehen, was ich

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

jedoch Wenn ich es funktioniert tun dummy = w_add_ax_extra(1, 'k', 'v') bin fehlt. Ja, diese Funktion gibt eine ganze Zahl zurück. Aber ich muss es hier nicht speichern. Ist es zwingend erforderlich, den Rückgabewert zu halten?

Antwort

6

Vom fine manual:

39.5.2. Die Ausführung eines Befehls ohne Ergebnis

[...]

Manchmal ist es nützlich, einen Ausdruck oder eine SELECT-Abfrage zu bewerten, sondern das Ergebnis, beispielsweise verwerfen, wenn eine Funktion aufrufen, die Nebenwirkungen hat aber keine nützlicher Ergebniswert. Um dies zu tun in PL/pgSQL, verwenden Sie die Anweisung PERFORM:

PERFORM query; 

Hervorhebung von mir. Sie sind dem Aufruf der Funktion nicht so etwas wie f(); sagen, müssen Sie perform f(); oder 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

Dank. Es wurde behoben. Aber die Dinge sind nicht klar :(Ich kopiere eingefügt, dass 'f (k, v)' aber nur 'f' funktioniert auch. Also habe ich den' (k, v) 'Teil entfernt. Oh! Entschuldigung, es funktioniert nicht ohne' (k, v) ' –

Verwandte Themen