PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana cara mengirimkan parameter tabel ke fungsi ini?

Semuanya diuji di Postgres 9.4 .

Postgres memiliki beberapa titik lemah dalam sintaks untuk menangani tipe ROW. Anda tidak dapat melakukan cast dari tabel (alias) secara langsung:

SELECT w::waypoint FROM waypoints w;

Solusinya hanya satu langkah lagi:dekomposisi baris dalam subquery, lalu pemerannya berfungsi. Dengan cara ini, nilai kolom didekomposisi dan dibungkus ke dalam tipe baru secara langsung, tanpa mentransmisikan ke text dan kembali. Tidak perlu mencantumkan semua kolom satu per satu dan Anda juga tidak perlu membuat pemeran khusus:

SELECT (w.*)::waypoint FROM (SELECT * FROM waypoints) w;

Atau lebih pendek:

SELECT w.*::waypoint FROM (TABLE waypoints) w;

Atau lebih pendek lagi:

SELECT w::waypoint FROM (TABLE waypoints) w;

SQL Fiddle

Itu lebih pendek dan lebih cepat, dalam pengujian cepat dengan 30 ribu baris dan jenis sederhana 10x lebih cepat dari casting ke text dan kembali. Jika Anda memiliki jsonb (besar) kolom atau jenis kompleks apa pun (konversi mahal ke/dari text ), perbedaannya akan jauh lebih besar.

Lebih penting lagi, Anda tidak membutuhkan jenis komposit kustom (ROW) lainnya. Setiap tabel sudah memiliki baris yang didefinisikan sebagai tipe secara otomatis. Cukup gunakan jenis waypoints yang ada bukannya waypoint (jika memungkinkan). Maka yang Anda butuhkan hanyalah:

SELECT w FROM waypoints w;

Atau, sebagai contoh Anda:

SELECT everything(t) FROM temp t;  -- using type waypoints
SELECT everything(t::waypoint) FROM (TABLE temp) t;  -- using type waypoint

Selain:

  • Tabel tidak memiliki "argumen" tetapi kolom.
  • Anda bukan meneruskan table parameter to this function , melainkan nilai baris . Begitulah cara Anda melewati tabel dengan nama:

    Anda tidak dapat "melewati seluruh tabel" sebagai parameter secara langsung di Postgres, tidak ada variabel tabel. Anda akan menggunakan kursor atau tabel sementara untuk itu.

Fungsi

Fungsi Anda memiliki deklarasi tipe yang tidak valid dan kompleks yang tidak perlu. Saya sangat ragu Anda ingin membuat tampilan:

CREATE FUNCTION everything(_wp waypoint)  -- or use type waypoints
  RETURNS TABLE(node int, xy text[]) AS
$func$
BEGIN
   RETURN QUERY
   SELECT ...
END
$func$ LANGUAGE plpgsql;

text array bukan sintaks yang valid, menggunakan text[] alih-alih mendeklarasikan larik text .

Daripada menggunakan tabel / ketik nama waypoints sebagai nama parameter fungsi, yang membuka Anda untuk kesalahan yang membingungkan.

Atau cukup gunakan fungsi SQL sederhana jika kasus Anda sesederhana yang ditunjukkan:

CREATE FUNCTION everything(_wp waypoint)  -- or use type waypoints
  RETURNS TABLE(node int, xy text[]) AS
$func$
   SELECT ...
$func$ LANGUAGE sql;

Jangan mengutip nama bahasa. Ini adalah pengenal.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Memasukkan klausa SELECT Kustom dalam kueri ActiveRecord

  2. Postgresql pencarian teks lengkap bagian dari kata-kata

  3. Bagaimana Atan2() Bekerja di PostgreSQL

  4. PostgreSQL:beberapa masalah untuk dimasukkan dari pilih dengan konflik

  5. buat tabel di postgreSQL