パラメータとして渡された整数値に応じて別のストアドプロシージャを呼び出すストアドプロシージャがPostgreSQL8.4にあります。これらのストアドプロシージャは、1つの整数列との関係を返すように呼び出されます。私が抱えている問題は、外部ストアドプロシージャが常に正しい行数で、ただしIDのすべてが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)
では、なぜconditional_relation_returnがすべてのNULLを返すのでしょうか。