PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Restituisce setof record (tabella virtuale) dalla funzione

(Questo è tutto testato con postgresql 8.3.7-- hai una versione precedente? Sto solo guardando il tuo uso di "ALIAS FOR $1")

CREATE OR REPLACE FUNCTION storeopeninghours_tostring(numeric)
 RETURNS SETOF RECORD AS $$
DECLARE
 open_id ALIAS FOR $1;
 result RECORD;
BEGIN
 RETURN QUERY SELECT '1', '2', '3';
 RETURN QUERY SELECT '3', '4', '5';
 RETURN QUERY SELECT '3', '4', '5';
END
$$;

Se devi restituire un record o una variabile di riga (invece del risultato di una query), utilizza "RETURN NEXT" anziché "RETURN QUERY".

Per invocare la funzione devi fare qualcosa del tipo:

select * from storeopeninghours_tostring(1) f(a text, b text, c text);

Quindi devi definire cosa ti aspetti che lo schema della riga di output della funzione sia nella query. Per evitarlo, puoi specificare le variabili di output nella definizione della funzione:

CREATE OR REPLACE FUNCTION storeopeninghours_tostring(open_id numeric, a OUT text, b OUT text, c OUT text)
 RETURNS SETOF RECORD LANGUAGE 'plpgsql' STABLE STRICT AS $$
BEGIN
 RETURN QUERY SELECT '1'::text, '2'::text, '3'::text;
 RETURN QUERY SELECT '3'::text, '4'::text, '5'::text;
 RETURN QUERY SELECT '3'::text, '4'::text, '5'::text;
END
$$;

(non sono sicuro del motivo per cui sono richiesti i ::text cast extra... '1' è un varchar per impostazione predefinita, forse?)