Obsługa anyelement
jako typ zwracany jest opisany w Typy polimorficzne
:
Ten argument w twoim przypadku to relation_name
wpisany jako anyelement
i przekazując NULL::table1
, to rzeczywiście informuje planistę, że to konkretne wywołanie function1
powinien zwrócić SETOF table1
. Jak dotąd tak dobrze.
Problem polega na tym, że po wykonaniu funkcja nie zwraca SETOF table1
ale coś innego. Nie tego oczekiwał wykonawca, stąd błąd.
Mimo że tytuł pytania brzmi Jak zwrócić dynamiczne wiersze... , wydaje się, że potrzebujesz dynamicznych kolumn lub polimorficznych zestawów wyników.
A to jest podjazdowa walka z SQL, bo aby zbudować plan wykonania zapytania, planista musi znać każdą kolumnę z jej typem dla każdego wyniku pośredniego. Jeśli zaprojektujesz zapytanie z funkcją, która musi zostać wykonana, aby znaleźć strukturę wyniku, która tworzy problem z kurczakiem i jajkiem:planowanie musi poprzedzać wykonanie, nie może od niego zależeć.
Dzięki dynamicznej technice wnioskowania o typie zastosowanej do anyelement
, PostgreSQL już przesuwa kopertę, aby zaimplementować jak najwięcej polimorfizmu, biorąc pod uwagę to ograniczenie.