Tengo un procedimiento almacenado en PostgreSQL 8.4 que llama a otro procedimiento almacenado según el valor entero pasado como parámetro. Esos procedimientos almacenados se denominan de forma que devuelvan una relación con una columna entera. El problema que estoy teniendo es que el procedimiento almacenado externo siempre devuelve una relación con el número correcto de filas, pero con todas las identificaciones NULL.Procedimiento almacenado de PostgreSQL con RETURNS TABLE (entero de identificación) que devuelve todos los NULL
Aquí está el procedimiento almacenado reducido a su forma más simple:
CREATE OR REPLACE FUNCTION spa(count integer)
RETURNS TABLE (id integer) AS $$
BEGIN
RETURN QUERY SELECT generate_series(1, count);
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION spb(count integer)
RETURNS TABLE (id integer) AS $$
BEGIN
RETURN QUERY SELECT generate_series(1, count);
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION conditional_relation_return(objectType integer, count integer)
RETURNS TABLE (id integer) AS $$
BEGIN
IF objectType = 1 THEN
RETURN QUERY SELECT id FROM spa(count);
ELSIF objectType = 2 OR objectType = 3 THEN
RETURN QUERY SELECT id FROM spb(count);
END IF;
END;
$$ LANGUAGE plpgsql;
Y si lo llaman:
# select * from conditional_relation_return(1, 2);
id
----
(2 rows)
O más concretamente:
# select count(*) from conditional_relation_return(1, 2) where id is null;
count
-------
2
(1 row)
Pero si llamas uno de los procedimientos almacenados a los que se hace referencia, obtendrá los resultados correctos:
# select * from spa(2);
id
----
1
2
(2 rows)
¿Por qué conditional_relation_return devuelve todos los valores NULL?
¿Cómo divertido. Tienes razón. 8.4 se traga silenciosamente el error de identificación ambiguo. ¡Gracias! – drsnyder