PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Динамично дефиниране на връщащи типове редове въз основа на предадена дадена таблица в plpgsql?

Ако под „въз основа на известна таблица“ имате предвид „точно като известна таблица“, тогава да .

SQL е строго типизиран език и функциите трябва да се създават с добре дефиниран тип връщане. Можете да се върнете към анонимни записи както очевидно сте направили (с RETURNS SETOF record ), но тогава от вас се изисква да добавите списък с дефиниции на колони за всяко повикване, както ви казва съобщението за грешка. Нещо като:

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

И това едва ли е динамично.

Вашият въпрос оставя място за тълкуване, но "въз основа на известна таблица" би означавало, че полиморфна функция може да свърши работа. Върнатият тип може да се основава на всеки регистриран динамичен тип ред и автоматично има по един за всяка таблица в системата. Пример за Barebone код:

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;

Обаждане:

SELECT * FROM my_function(NULL::my_table);

Подробни инструкции в този свързан отговор (вижте последната глава „Различни пълни типове таблици“ ):




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да преминете през JSON масиви в postgresql 9.3

  2. Postgres добавя колона с първоначално изчислени стойности

  3. Групиране по съкратена дата в JPA

  4. Как да съпоставите org.postgresql.geometric.PGpoint към Hibernate Type

  5. Извикване на дефинирана от потребителя функция, намираща се в postgres.c в postgreSQL, използвайки GUI, дефиниран от netbeans