Wszystko przetestowane w Postgresie 9.4 .
Postgres ma kilka słabych punktów w składni do obsługi typów ROW. Nie możesz przesyłać bezpośrednio z tabeli (aliasu):
SELECT w::waypoint FROM waypoints w;
Rozwiązanie jest tylko jeden krok dalej:rozłóż wiersz w podzapytaniu, a następnie rzutowanie działa. W ten sposób wartości kolumn są rozkładane i umieszczane bezpośrednio w nowym typie, bez rzutowania na text
i z powrotem. Nie musisz wymieniać wszystkich kolumn osobno i nie musisz tworzyć niestandardowej obsady, ani:
SELECT (w.*)::waypoint FROM (SELECT * FROM waypoints) w;
Lub krócej:
SELECT w.*::waypoint FROM (TABLE waypoints) w;
Lub jeszcze krócej:
SELECT w::waypoint FROM (TABLE waypoints) w;
To krócej i szybciej, w szybkim teście z 30 tys. wierszy i prostymi typami 10 razy szybciej niż przesyłanie do text
i z powrotem. Jeśli masz (duży) jsonb
kolumny lub dowolny złożony typ (kosztowna konwersja do/z text
), różnica będzie jednak znacznie większa.
Co ważniejsze, nie potrzebujesz inny niestandardowy typ złożony (ROW). Każda tabela ma już swój wiersz zdefiniowany automatycznie jako typ. Po prostu użyj istniejącego typu waypoints
zamiast waypoint
(Jeśli to możliwe). Wszystko czego potrzebujesz to:
SELECT w FROM waypoints w;
Lub na przykład:
SELECT everything(t) FROM temp t; -- using type waypoints
SELECT everything(t::waypoint) FROM (TABLE temp) t; -- using type waypoint
Poza tym:
- Tabela nie zawiera „argumentów”, ale kolumny.
-
nie jesteś przekazywanie
table parameter to this function
, ale raczej wartość wiersza . W ten sposób podajesz tabelę według nazwy:Nie możesz "przekazać całej tabeli" jako parametru bezpośrednio w Postgresie, nie ma zmiennych tabel. Możesz użyć do tego kursora lub tabeli tymczasowej.
Funkcja
Twoja funkcja ma nieprawidłową deklarację typu i jest niepotrzebnie skomplikowana. Poważnie wątpię, czy chcesz utworzyć widok:
CREATE FUNCTION everything(_wp waypoint) -- or use type waypoints
RETURNS TABLE(node int, xy text[]) AS
$func$
BEGIN
RETURN QUERY
SELECT ...
END
$func$ LANGUAGE plpgsql;
text array
nie jest poprawną składnią, używając text[]
zamiast tego zadeklarować tablicę text
.
Raczej nie używaj tabeli / wpisz nazwę waypoints
jako nazwę parametru funkcji, który otwiera cię na mylące błędy.
Lub po prostu użyj prostej funkcji SQL, jeśli Twój przypadek jest tak prosty, jak pokazano:
CREATE FUNCTION everything(_wp waypoint) -- or use type waypoints
RETURNS TABLE(node int, xy text[]) AS
$func$
SELECT ...
$func$ LANGUAGE sql;
Nie cytuj nazwy języka. To identyfikator.