sql >> Databáze >  >> RDS >> PostgreSQL

PL/Python &postgreSQL:Jaký je nejlepší způsob, jak vrátit tabulku s mnoha sloupci?

Zkuste toto:

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';

který vrátí:

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)

U MPP jako Greenplum a HAWQ je třeba zvážit snahu o funkce, které berou data jako argument a vracejí výsledek, spíše než aby data pocházely z funkce samotné. Na každém segmentu se spustí stejný kód, takže občas může dojít k nezamýšleným vedlejším účinkům.

Aktualizace pro SETOF varianta:

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';

Všimněte si, že pro použití stejných dat z původního příkladu jsem musel alias každého ze sloupců na odpovídající názvy v myType . Také budete muset vyjmenovat všechny sloupce mysales pokud půjdete touto cestou - neexistuje přímý způsob, jak CREATE TYPE foo LIKE tableBar i když byste to mohli použít ke zmírnění části ruční práce s výčtem všech jmen/typů:

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 ;

který vrátí:

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



  1. Příklady DATEDIFF() – MySQL

  2. Mohly by se simultánní transakce vzájemně rušit? php/mysql

  3. Jak můžete vidět, jakou úroveň izolace transakcí používá libovolná relace oracle

  4. Jak získat spouštěče přidružené k pohledu nebo tabulce v PostgreSQL