PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

पीएल/पायथन और पोस्टग्रेएसक्यूएल:कई कॉलम की तालिका वापस करने का सबसे अच्छा तरीका क्या है?

इसे आजमाएं:

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

जो लौटता है:

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)

ग्रीनप्लम और एचएडब्ल्यूक्यू जैसे एमपीपी के लिए विचार करने के लिए कुछ ऐसे कार्यों के लिए प्रयास करना है जो डेटा को तर्क के रूप में लेते हैं और फ़ंक्शन में डेटा उत्पन्न करने के बजाय परिणाम लौटाते हैं। प्रत्येक खंड पर एक ही कोड निष्पादित होता है, इसलिए कभी-कभी अनपेक्षित दुष्प्रभाव हो सकते हैं।

SETOF . के लिए अपडेट करें प्रकार:

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

ध्यान दें, मूल उदाहरण से समान डेटा का उपयोग करने के लिए, मुझे प्रत्येक कॉलम को myType में संबंधित नामों से उपनाम देना था . साथ ही, आपको mysales . के सभी कॉलमों की गणना करनी होगी यदि आप इस मार्ग पर जा रहे हैं - CREATE TYPE foo LIKE tableBar का कोई सीधा तरीका नहीं है यद्यपि आप इसका उपयोग सभी नामों/प्रकारों की गणना के कुछ मैन्युअल कार्य को कम करने के लिए कर सकते हैं:

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 ;

जो लौटता है:

                              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. सक्रिय क्वेरी अंतर्निहित कर्सर को कैसे देखें

  2. पोस्टग्रेज टेबल पर राशि पढ़ें

  3. रिकर्सिव क्लॉज के साथ प्रयोग का चयन कैसे करें

  4. प्रत्येक से एक कॉलम का उपयोग करके दो तालिका कार्यों के परिणाम की तुलना करें

  5. अजगर, sqlalchemy और psycopg2 का उपयोग करके PostgreSQL डेटाबेस बनाते समय त्रुटि