2012-01-03 9 views
6

en plpgsql PostgreSQL regresar,en plpgsql, la forma de salir de la función de los registros

create function f1(p_i int) returns table(c1 int) as $$ 
begin 
    -- wish to exit, do not wish to return anything 
    if p_i < 0 then 
    -- cannot RETURN - since can only return record! 
    end if; 

    -- continue processing 
    return query select c2 from t1 where c1 = p_i; 
    ... 
end; 
$$ language plpgsql; 

acuerdo con doc, la única manera de salir de una función es RETORNO. pero un RETORNO aquí requiere RETURN QUERY o RETURN NEXT - parece que no hay forma de simplemente salir de la función.

+2

Si una función (como la suya) se define para volver tabla '() 'o' SETOF ... 'puede simplemente' RETURN; '. Debe estar pensando en funciones que devuelven un valor y no tienen definido el parámetro 'OUT'. ** Entonces ** necesita devolver un valor. –

Respuesta

7

Si p_i < 0 es en realidad un error entonces se podría raise an exception:

if p_i < 0 then 
    raise exception 'Don''t know what to do with %', p_i 
end if; 

Si p_i < 0 simplemente debe tranquilamente devolver nada, entonces se podría hacer algo como esto:

create or replace function f1(p_i int) returns table(c1 int) as $$ 
begin 
    if p_i < 0 then 
     return; 
    end if; 
    return query select c2 from t1 where c1 = p_i; 
end; 
$$ language plpgsql; 

Desde el fine manual:

39.6. 1.2. RETURN NEXT y RETORNO DE CONSULTA
[...]
los elementos individuales de regreso son especificados por una secuencia de comandos RETURN NEXT o RETURN QUERY, y luego se utiliza un último comando RETURN sin ningún argumento para indicar que la función ha terminado ejecutando.

Énfasis mío. Entonces puede usar su return query para devolver la consulta y solo un simple return; para rescatar sin hacer nada.

Por ejemplo, la versión return; me da cosas como esta:

=> select * from f1(-1); 
c1 
---- 
(0 rows) 
=> select * from f1(1); 
c1 
---- 
    1 
    1 
    ... 
(15 rows) 

y la versión excepción hace esto:

=> select * from f1(-1); 
ERROR: Don't know what to do with -1 
+0

buena idea para la tabla vacía. ahora no devuelve nada, más o menos lo mismo que devolver una mesa vacía, y parece funcionar. pero al igual que 'break 'es tan agradable de tener en un' loop', un 'return' que saldrá de la' función' sería bueno tenerlo. El problema es que 'return' toma dos tareas: return value y exit. –

+0

@ccyoung: Me faltaba algo obvio, no necesitas el truco 'generate_series', solo un' return; 'simple funcionará. –

+0

si haces un simple 'return' se genera un error: debe ser RETURN QUERY o RETURN NEXT. déjame revisar nuevamente, podría haber muerto cerebralmente. –

Cuestiones relacionadas