Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
CREATE FUNCTION
Membuat fungsi skalar baru yang ditentukan pengguna (UDF) menggunakan SQL SELECT klausa atau program Python.
Untuk informasi selengkapnya dan contoh tambahan, lihat Fungsi yang ditentukan pengguna di Amazon Redshift.
Hak istimewa yang diperlukan
Anda harus memiliki izin dengan salah satu cara berikut untuk menjalankan CREATE ATAU REPLACEFUNCTION:
Untuk CREATEFUNCTION:
Superuser dapat menggunakan bahasa tepercaya dan tidak tepercaya untuk membuat fungsi.
Pengguna dengan hak FUNCTION istimewa CREATE [ORREPLACE] dapat membuat fungsi dengan bahasa tepercaya.
Untuk REPLACEFUNCTION:
Superuser
Pengguna dengan hak FUNCTION istimewa CREATE [ORREPLACE]
Pemilik fungsi
Sintaks
CREATE [ OR REPLACE ] FUNCTION f_function_name ( { [py_arg_name py_arg_data_type | sql_arg_data_type } [ , ... ] ] ) RETURNS data_type { VOLATILE | STABLE | IMMUTABLE } AS $$ { python_program | SELECT_clause } $$ LANGUAGE { plpythonu | sql }
Parameter
- ATAU REPLACE
-
Menentukan bahwa jika fungsi dengan nama yang sama dan tipe data argumen masukan, atau tanda tangan, karena ini sudah ada, fungsi yang ada diganti. Anda hanya dapat mengganti fungsi dengan fungsi baru yang mendefinisikan kumpulan tipe data yang identik. Anda harus menjadi superuser untuk mengganti fungsi.
Jika Anda mendefinisikan fungsi dengan nama yang sama dengan fungsi yang ada tetapi tanda tangan yang berbeda, Anda membuat fungsi baru. Dengan kata lain, nama fungsi kelebihan beban. Untuk informasi selengkapnya, lihat Nama fungsi overloading.
- f_function_name
-
Nama fungsi. Jika Anda menentukan nama skema (seperti
myschema.myfunction
), fungsi dibuat menggunakan skema yang ditentukan. Jika tidak, fungsi dibuat dalam skema saat ini. Untuk informasi selengkapnya tentang nama yang valid, lihatNama dan pengenal.Kami menyarankan Anda untuk mengawali semua UDF nama dengan
f_
. Amazon Redshift mencadangkanf_
awalan untuk UDF nama, jadi dengan menggunakanf_
awalan, Anda memastikan bahwa nama Anda tidak akan bertentangan dengan UDF nama fungsi bawaan Amazon Redshift yang ada atau yang akan datang. SQL Untuk informasi selengkapnya, lihat Mencegah konflik UDF penamaan.Anda dapat mendefinisikan lebih dari satu fungsi dengan nama fungsi yang sama jika tipe data untuk argumen masukan berbeda. Dengan kata lain, nama fungsi kelebihan beban. Untuk informasi selengkapnya, lihat Nama fungsi overloading.
- py_arg_name py_arg_data_type | sql_arg_data_type
-
Untuk PythonUDF, daftar nama argumen input dan tipe data. Untuk SQLUDF, daftar tipe data, tanpa nama argumen. Dalam PythonUDF, lihat argumen menggunakan nama argumen. Dalam a SQLUDF, lihat argumen menggunakan $1, $2, dan seterusnya, berdasarkan urutan argumen dalam daftar argumen.
Untuk a SQLUDF, tipe data input dan pengembalian dapat berupa tipe data Amazon Redshift standar apa pun. Untuk PythonUDF, tipe data input dan return dapat berupaSMALLINT,,,,INTEGER,BIGINT,DECIMAL,REAL, DOUBLEPRECISION,BOOLEAN, CHAR VARCHARDATE, atau. TIMESTAMP Selain itu, fungsi yang ditentukan pengguna Python (UDFs) mendukung tipe data. ANYELEMENT Ini secara otomatis dikonversi ke tipe data standar berdasarkan tipe data dari argumen terkait yang diberikan saat runtime. Jika beberapa argumen digunakanANYELEMENT, mereka semua menyelesaikan ke tipe data yang sama saat runtime, berdasarkan ANYELEMENT argumen pertama dalam daftar. Untuk informasi selengkapnya, silakan lihat Tipe data Python UDF dan Jenis data.
Anda dapat menentukan maksimal 32 argumen.
- RETURNSdata_type
-
Tipe data dari nilai yang dikembalikan oleh fungsi. Tipe RETURNS data dapat berupa tipe data Amazon Redshift standar apa pun. Selain itu, Python UDFs dapat menggunakan tipe dataANYELEMENT, yang secara otomatis dikonversi ke tipe data standar berdasarkan argumen yang disediakan saat runtime. Jika Anda menentukan ANYELEMENT tipe data yang dikembalikan, setidaknya satu argumen harus digunakanANYELEMENT. Tipe data pengembalian aktual cocok dengan tipe data yang disediakan untuk ANYELEMENT argumen ketika fungsi dipanggil. Untuk informasi selengkapnya, lihat Tipe data Python UDF.
- VOLATILE | STABLE | IMMUTABLE
-
Menginformasikan pengoptimal kueri tentang volatilitas fungsi.
Anda akan mendapatkan optimasi terbaik jika Anda memberi label fungsi Anda dengan kategori volatilitas ketat yang berlaku untuk itu. Namun, jika kategorinya terlalu ketat, ada risiko bahwa pengoptimal akan salah melewatkan beberapa panggilan, yang mengakibatkan set hasil yang salah. Dalam urutan keketatan, dimulai dengan yang paling ketat, kategori volatilitas adalah sebagai berikut:
-
VOLATILE
-
STABLE
-
IMMUTABLE
VOLATILE
Dengan argumen yang sama, fungsi dapat mengembalikan hasil yang berbeda pada panggilan berturut-turut, bahkan untuk baris dalam satu pernyataan. Pengoptimal kueri tidak dapat membuat asumsi apa pun tentang perilaku fungsi volatile, jadi kueri yang menggunakan fungsi volatile harus mengevaluasi kembali fungsi untuk setiap baris input.
STABLE
Dengan argumen yang sama, fungsi dijamin mengembalikan hasil yang sama untuk semua baris yang diproses dalam satu pernyataan. Fungsi ini dapat mengembalikan hasil yang berbeda ketika dipanggil dalam pernyataan yang berbeda. Kategori ini memungkinkan pengoptimal untuk mengoptimalkan beberapa panggilan fungsi dalam satu pernyataan ke satu panggilan untuk pernyataan.
IMMUTABLE
Mengingat argumen yang sama, fungsi selalu mengembalikan hasil yang sama, selamanya. Saat kueri memanggil
IMMUTABLE
fungsi dengan argumen konstan, pengoptimal mengevaluasi fungsi tersebut terlebih dahulu. -
- AS $$ pernyataan $$
-
Sebuah konstruksi yang melampirkan pernyataan yang akan dijalankan. Kata kunci literal
AS $$
dan$$
diperlukan.Amazon Redshift mengharuskan Anda untuk melampirkan pernyataan dalam fungsi Anda dengan menggunakan format yang disebut kutipan dolar. Apa pun di dalam kandang dilewatkan persis seperti apa adanya. Anda tidak perlu melarikan diri dari karakter khusus apa pun karena isi string ditulis secara harfiah.
Dengan kutipan dolar, Anda menggunakan sepasang tanda dolar ($$) untuk menandakan awal dan akhir pernyataan yang akan dijalankan, seperti yang ditunjukkan pada contoh berikut.
$$
my statement
$$Secara opsional, di antara tanda-tanda dolar di setiap pasangan, Anda dapat menentukan string untuk membantu mengidentifikasi pernyataan tersebut. String yang Anda gunakan harus sama di awal dan akhir pasangan enklosur. String ini peka huruf besar/kecil, dan mengikuti batasan yang sama dengan pengenal yang tidak dikutip kecuali bahwa string ini tidak dapat berisi tanda dolar. Contoh berikut menggunakan string
test
.$test$
my statement
$test$Untuk informasi lebih lanjut tentang kutipan dolar, lihat “Konstanta String yang dikutip Dolar” di bawah Struktur Leksikal
dalam dokumentasi Postgre. SQL - python_program
-
Sebuah program Python executable valid yang mengembalikan nilai. Pernyataan bahwa Anda meneruskan dengan fungsi harus sesuai dengan persyaratan lekukan seperti yang ditentukan dalam Panduan Gaya untuk Kode Python di situs web Python
. Untuk informasi selengkapnya, lihat Dukungan bahasa Python untuk UDFs. - SQL_klausa
-
Sebuah SQL SELECT klausa.
SELECTKlausa tidak dapat menyertakan salah satu dari jenis klausa berikut:
-
FROM
-
INTO
-
WHERE
-
GROUPOLEH
-
ORDEROLEH
-
LIMIT
-
- LANGUAGE{plpythonu | sql}
-
Untuk Python, tentukan.
plpythonu
UntukSQL, tentukansql
. Anda harus memiliki izin untuk penggunaan bahasa untuk SQL atau plpythonu. Untuk informasi selengkapnya, lihat UDFkeamanan dan izin.
Catatan penggunaan
Fungsi bersarang
Anda dapat memanggil fungsi lain SQL yang ditentukan pengguna (UDF) dari dalam a. SQL UDF Fungsi bersarang harus ada saat Anda menjalankan CREATE FUNCTION perintah. Amazon Redshift tidak melacak dependensi untukUDFs, jadi jika Anda menghapus fungsi bersarang, Amazon Redshift tidak mengembalikan kesalahan. Namun, UDF akan gagal jika fungsi bersarang tidak ada. Misalnya, fungsi berikut memanggil f_sql_greater
fungsi dalam SELECT klausa.
create function f_sql_commission (float, float ) returns float stable as $$ select f_sql_greater ($1, $2) $$ language sql;
UDFkeamanan dan hak istimewa
Untuk membuatUDF, Anda harus memiliki izin untuk penggunaan pada bahasa untuk SQL atau plpythonu (Python). Secara default, USAGE ON LANGUAGE SQL diberikan kepadaPUBLIC. Namun, Anda harus secara eksplisit memberikan USAGE ON LANGUAGE PLPYTHONU kepada pengguna atau grup tertentu.
Untuk mencabut penggunaanSQL, pertama-tama cabut penggunaan dari. PUBLIC Kemudian berikan penggunaan SQL hanya untuk pengguna atau grup tertentu yang diizinkan untuk membuat SQLUDFs. Contoh berikut mencabut penggunaan SQL sejak PUBLIC kemudian memberikan penggunaan ke grup pengguna. udf_devs
revoke usage on language sql from PUBLIC; grant usage on language sql to group udf_devs;
Untuk menjalankanUDF, Anda harus memiliki izin eksekusi untuk setiap fungsi. Secara default, izin eksekusi untuk new UDFs diberikan kepadaPUBLIC. Untuk membatasi penggunaan, cabut izin eksekusi dari PUBLIC fungsi tersebut. Kemudian berikan hak istimewa kepada individu atau kelompok tertentu.
Contoh berikut mencabut izin eksekusi pada fungsi f_py_greater
dari PUBLIC kemudian memberikan penggunaan ke grup pengguna. udf_devs
revoke execute on function f_py_greater(a float, b float) from PUBLIC; grant execute on function f_py_greater(a float, b float) to group udf_devs;
Superuser memiliki semua hak istimewa secara default.
Untuk informasi selengkapnya, silakan lihat GRANT dan REVOKE.
Contoh
Contoh Skalar Python UDF
Contoh berikut menciptakan Python UDF yang membandingkan dua bilangan bulat dan mengembalikan nilai yang lebih besar.
create function f_py_greater (a float, b float) returns float stable as $$ if a > b: return a return b $$ language plpythonu;
Contoh berikut menanyakan SALES tabel dan memanggil f_py_greater
fungsi baru untuk mengembalikan salah satu COMMISSION atau 20 persenPRICEPAID, mana yang lebih besar.
select f_py_greater (commission, pricepaid*0.20) from sales;
Contoh skalar SQL UDF
Contoh berikut menciptakan fungsi yang membandingkan dua angka dan mengembalikan nilai yang lebih besar.
create function f_sql_greater (float, float) returns float stable as $$ select case when $1 > $2 then $1 else $2 end $$ language sql;
Query berikut memanggil f_sql_greater
fungsi baru untuk query SALES tabel dan mengembalikan salah satu COMMISSION atau 20 persen dariPRICEPAID, mana yang lebih besar.
select f_sql_greater (commission, pricepaid*0.20) from sales;