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

PL/Python i postgreSQL:Jaki jest najlepszy sposób na zwrócenie tabeli z wieloma kolumnami?

Spróbuj tego:

CREATE OR REPLACE FUNCTION myFunc02() 
RETURNS TABLE (like mysales) AS 
$$
rv = plpy.execute('SELECT * FROM mysales ORDER BY id;', 5)
d  = rv.nrows()
return rv[0:d]
$$ LANGUAGE 'plpythonu';

co zwraca:

gpadmin=# SELECT * FROM myFunc02();                             
 id | year | qtr | day |    region
----+------+-----+-----+---------------
  1 | 2014 |   1 |   1 | north america
  2 | 2002 |   2 |   2 | europe
  3 | 2014 |   3 |   3 | asia
  4 | 2010 |   4 |   4 | north-america
  5 | 2014 |   1 |   5 | europe
(5 rows)

Coś do rozważenia dla MPP, takich jak Greenplum i HAWQ, to dążenie do funkcji, które przyjmują dane jako argument i zwracają wynik, zamiast tworzyć dane w samej funkcji. Ten sam kod jest wykonywany w każdym segmencie, więc czasami mogą wystąpić niezamierzone skutki uboczne.

Aktualizacja dla SETOF wariant:

CREATE TYPE myType AS (id integer, x integer, y integer, s text);

CREATE OR REPLACE FUNCTION myFunc02a() 
RETURNS SETOF myType AS 
$$

# column names of myType ['id', 'x', 'y', 's']
rv = plpy.execute("SELECT id, year as x, qtr as y, region as s FROM mysales ORDER BY id", 5)
d  = rv.nrows()

return rv[0:d]
$$ LANGUAGE 'plpythonu';

Uwaga, aby użyć tych samych danych z oryginalnego przykładu, musiałem aliasować każdą kolumnę do odpowiadających im nazw w myType . Ponadto będziesz musiał wyliczyć wszystkie kolumny mysales jeśli idziesz tą drogą - nie ma prostego sposobu na CREATE TYPE foo LIKE tableBar chociaż możesz użyć tego, aby złagodzić część ręcznej pracy polegającej na wyliczeniu wszystkich nazw/typów:

select string_agg(t.attname || ' ' || t.format_type || ', ') as columns  from 
(
SELECT a.attname,
  pg_catalog.format_type(a.atttypid, a.atttypmod),
  (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128)
   FROM pg_catalog.pg_attrdef d
   WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef),
  a.attnotnull, a.attnum,
  a.attstorage ,
  pg_catalog.col_description(a.attrelid, a.attnum)
FROM pg_catalog.pg_attribute a
LEFT OUTER JOIN pg_catalog.pg_attribute_encoding e
ON   e.attrelid = a .attrelid AND e.attnum = a.attnum
WHERE a.attrelid = (SELECT oid FROM pg_class WHERE relname = 'mysales') AND a.attnum > 0 AND NOT a.attisdropped
ORDER BY a.attnum
) t ;

co zwraca:

kolumny
                              columns
-------------------------------------------------------------------
 id integer, year integer, qtr integer, day integer, region text,
(1 row)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nxlog im_dbi nie działa

  2. PostGIS odpowiednik ArcMap Union

  3. Wyzwania związane ze skalowaniem bazy danych Moodle PostgreSQL

  4. Wiersz poleceń Windows PSQL:czy istnieje sposób na umożliwienie logowania bez hasła?

  5. dlaczego pisze w tabeli zapobiega próżni w innym?