sql >> Database >  >> RDS >> PostgreSQL

PL/Python &postgreSQL:Wat is de beste manier om een ​​tabel met veel kolommen te retourneren?

Probeer dit:

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

die retourneert:

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)

Iets om te overwegen voor MPP zoals Greenplum en HAWQ is om te streven naar functies die gegevens als argument nemen en een resultaat retourneren, in plaats van de gegevens in de functie zelf te laten ontstaan. Dezelfde code wordt uitgevoerd op elk segment, dus af en toe kunnen er onbedoelde bijwerkingen zijn.

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

Let op, om dezelfde gegevens uit het originele voorbeeld te gebruiken, moest ik elk van de kolommen een alias geven naar de overeenkomstige namen in myType . U moet ook alle kolommen van mysales . opsommen als je deze route volgt - er is geen eenvoudige manier om CREATE TYPE foo LIKE tableBar TE MAKEN hoewel je dit misschien kunt gebruiken om een ​​deel van het handmatige werk van het opsommen van alle namen/typen te verlichten:

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 ;

die retourneert:

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



  1. Hoe bouw ik een UNION-query met ORDER BY en GROUP BY in de querybuilder van Kohana?

  2. Onbedoelde bijwerkingen - Slaapsessies die sloten vasthouden

  3. Gegevens invoegen om op te nemen in sqlite

  4. gebruik WHERE CLAUSE voor zoekgegevens van A-datum tot B-datum