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

Dynamicznie definiuj zwracane typy wierszy na podstawie podanej tabeli w plpgsql?

Jeśli przez „na podstawie znanej tabeli” masz na myśli „dokładnie jak w znanej tabeli”, to tak .

SQL jest językiem ściśle typizowanym i funkcje muszą być tworzone z dobrze zdefiniowanym typem zwracanym. Możesz wrócić do anonimowych rekordów tak jak to zrobiłeś (z RETURNS SETOF record ), ale musisz dodać listę definicji kolumn dla każdego wywołania, tak jak mówi komunikat o błędzie. Coś takiego:

SELECT *
FROM   my_function('foo') AS foo (
          colum_name1 integer  -- name and data type for every column
        , colum_name2 text
        , colum_name3 real);

A to nie jest dynamiczne.

Twoje pytanie pozostawia pole do interpretacji, ale „na podstawie znanej tabeli” wskazuje, że funkcja polimorficzna może załatwić sprawę. Zwracany typ może być dynamicznie oparty na dowolnym zarejestrowanym typie wiersza, a dla każdej tabeli w systemie jest automatycznie jeden. Przykład kodu kadłubka:

CREATE OR REPLACE FUNCTION my_function(_rowtype anyelement)
  RETURNS SETOF anyelement AS
$func$
BEGIN
   RETURN QUERY EXECUTE format(
     'SELECT * FROM %s LIMIT 10'
    , pg_typeof(_rowtype)  -- pg_typeof() returns regtype, quoted where necessary
      );
END
$func$ LANGUAGE plpgsql;

Zadzwoń:

SELECT * FROM my_function(NULL::my_table);

Szczegółowe instrukcje w tej powiązanej odpowiedzi (patrz ostatni rozdział "Różne kompletne typy tabel" ):




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. zagnieżdżony wybór przy użyciu licznika do zliczania każdego wiersza w Postgres

  2. PostgreSQL Query WHERE data jest starsza niż 3 lata

  3. PostgreSQL:UPDATE za pomocą funkcji agregującej

  4. VBScript zawiesza się podczas uruchamiania pliku wsadowego za pomocą WShell.Script Run

  5. Zapobiegaj sekwencjonowaniu w celu usunięcia bazy danych w aplikacji node.js