PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak przekazać parametr tabeli do tej funkcji?

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;

Skrzypce SQL

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Różnica między dwiema datami postgresql w formacie Excel

  2. Jak przechowywać tablicę lub wiele wartości w jednej kolumnie?

  3. Zwracanie pojedynczych wartości null za pomocą postgres tablefunc crosstab()

  4. Zrezygnuj z roli z uprawnieniami

  5. Więcej moich ulubionych zapytań PostgreSQL – i dlaczego one również mają znaczenie