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