PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

PL / Python &postgreSQL:Cách tốt nhất để trả về một bảng gồm nhiều cột là gì?

Hãy thử điều này:

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

trả về:

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)

Điều cần xem xét đối với MPP như Greenplum và HAWQ là cố gắng tạo ra các hàm lấy dữ liệu làm đối số và trả về kết quả, thay vì bắt nguồn dữ liệu trong chính hàm. Cùng một mã thực thi trên mọi phân đoạn nên đôi khi có thể có các tác dụng phụ không mong muốn.

Cập nhật cho SETOF biến thể:

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

Lưu ý, để sử dụng cùng một dữ liệu từ ví dụ ban đầu, tôi phải đặt bí danh cho từng cột thành các tên tương ứng trong myType . Ngoài ra, bạn sẽ phải liệt kê tất cả các cột của mysales nếu đi theo con đường này - không có cách nào đơn giản để CREATE TYPE foo LIKE tableBar mặc dù bạn có thể sử dụng điều này để giảm bớt một số công việc thủ công là liệt kê tất cả các tên / loại:

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 ;

trả về:

Các cộ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. không thể trích xuất các phần tử từ một đại lượng vô hướng

  2. Giao dịch không thể xử lý các lệnh song song thông qua Tác vụ.

  3. Tạo chuỗi ký tự trên postgreSQL

  4. Tìm giá trị băm của một hàng trong postgresql

  5. Mẹo để giám sát PostgreSQL cho Moodle