sql >> Database teknologi >  >> RDS >> PostgreSQL

PL/Python &postgreSQL:Hvad er den bedste måde at returnere en tabel med mange kolonner på?

Prøv dette:

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

som returnerer:

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)

Noget at overveje for MPP som Greenplum og HAWQ er at stræbe efter funktioner, der tager data som et argument og returnerer et resultat, i stedet for at stamme dataene fra selve funktionen. Den samme kode udføres på hvert segment, så der kan lejlighedsvis være utilsigtede bivirkninger.

Opdatering for SETOF variant:

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

Bemærk, for at bruge de samme data fra det originale eksempel, var jeg nødt til at kalde hver af kolonnerne til tilsvarende navne i myType . Du bliver også nødt til at opregne alle kolonnerne i mysales hvis du går denne rute - der er ikke en ligetil måde at CREATE TYPE foo LIKE tableBar selvom du måske kan bruge dette til at lette noget af det manuelle arbejde med at opregne alle navne/typer:

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 ;

som returnerer:

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



  1. Fjernelse af en mængde fra flere rækker i en database

  2. MySQL Conditional Insert on Duplicate

  3. MySQL GRUPPE VED...AT HAVE forskellige værdier samme felt

  4. Find ud af, om Oracle-date er i en weekend?