У меня есть хранимая процедура в PostgreSQL 8.4, которая вызывает другую хранимую процедуру в зависимости от целочисленного значения, переданного в качестве параметра. Эти хранимые процедуры вызываются таким образом, что они должны возвращать отношение с одним целочисленным столбцом. Проблема, с которой я сталкиваюсь, заключается в том, что внешняя хранимая процедура всегда возвращает отношение с правильным количеством строк, но со всеми идентификаторами NULL.
Вот хранимая процедура, приведенная к простейшей форме:
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;
И если вы назовете это:
# select * from conditional_relation_return(1, 2);
id
----
(2 rows)
Или, точнее:
# select count(*) from conditional_relation_return(1, 2) where id is null;
count
-------
2
(1 row)
Но если вы вызовете одну из хранимых процедур, на которые ссылаетесь, вы получите правильные результаты :
# select * from spa(2);
id
----
1
2
(2 rows)
. Так почему же условное _отношение _возвращает все значения NULL?