Хранимая процедура PostgreSQL с RETURNS TABLE (id integer ), возвращающая все значения NULL

У меня есть хранимая процедура в 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?

9
задан drsnyder 13 July 2012 в 23:24
поделиться