SQL kullanıcı tanımlı işlevleri (SQL UDF'leri), Java veya Python kodu yazmadan doğrudan SQL içinde yeniden kullanılabilir işlevler tanımlamanızı sağlar. Java veya Python UDF'lerinden farklı olarak SQL UDF'leri derleme aşaması, kaynak yükleme veya ayrı bir kayıt iş akışı gerektirmez; işlev gövdesini bir SQL ifadesi olarak yazıp hemen çağırabilirsiniz.
SQL UDF'leri ayrıca işlev türünde parametreleri destekler; bu sayede yerleşik işlevleri, diğer UDF'leri veya anonim işlevleri bağımsız değişken olarak iletebilirsiniz (Lambda ifadelerine benzer şekilde).
Temel kavramlar
| Kavram | Açıklama |
|---|---|
| Kalıcı SQL UDF | CREATE SQL FUNCTION ile oluşturulur. MaxCompute meta veri sisteminde saklanır, işlev listesinde görünür ve herhangi bir betikten veya oturumdan çağrılabilir. |
| Geçici SQL UDF | FUNCTION ile oluşturulur (CREATE SQL öneki olmadan). Yalnızca tanımlandığı betik içinde var olur ve başka yerlerden çağrılamaz. |
| İşlev türünde parametre | Değer olarak bir işlevi kabul eden giriş parametresidir; yerleşik bir işlev, başka bir UDF veya anonim bir işlev olabilir. |
| SQL betik modu | SQL UDF'leri tanımlarken gereken yürütme modudur. Bir UDF'i ortak SQL düzenleme modunda tanımlamak hataya neden olabilir. |
Ön koşullar
Başlamadan önce şunlara sahip olduğunuzdan emin olun:
SQL betik modunda çalışan bir ortam. Ayrıntılar için bkz. Betik modunda SQL.
Kullanmayı planladığınız giriş parametresi veri türlerinin MaxCompute tarafından desteklendiğini doğrulayın. Tam liste için bkz. MaxCompute V2.0 veri türü sürümü.
Alibaba Cloud hesabınızda gerekli işlev düzeyi izinleri. Ayrıntılar için bkz. MaxCompute izinleri.
Kalıcı bir SQL UDF oluşturun
Kalıcı SQL UDF'leri MaxCompute meta veri sisteminde saklanır. Oluşturulduktan sonra işlev listesinde görünür ve herhangi bir aşamada çağrılabilir.
Sözdizimi
CREATE SQL FUNCTION <function_name>(@<parameter_in1> <datatype>[, @<parameter_in2> <datatype>...])
[RETURNS @<parameter_out> <datatype>]
AS [BEGIN]
<function_expression>
[END];
Parametreler
| Parametre | Zorunlu | Açıklama |
|---|---|---|
function_name |
Evet | SQL UDF'inin adı. Proje içinde benzersiz olmalı ve herhangi bir yerleşik işlev adıyla eşleşmemelidir. Her ad yalnızca bir kez kaydedilebilir. Çakışmaları kontrol etmek için LIST FUNCTIONS komutunu çalıştırın. |
parameter_in |
Evet | Giriş parametreleri. Her biri @ önekiyle başlar. Parametreler işlev türünde olabilir — bkz. Bir işlevi parametre olarak iletin. |
datatype |
Evet | Her giriş parametresinin veri türü. MaxCompute tarafından desteklenen bir veri türü olmalıdır. |
RETURNS @parameter_out |
Hayır | Dönüş değişkeni. Atlanırsa varsayılan olarak function_name değeri döndürülür. |
function_expression |
Evet | İşlev mantığını uygulayan SQL ifadesi. Yerleşik operatörlere, yerleşik işlevlere veya diğer UDF'lere başvurabilir. |
BEGIN / END |
Hayır | İsteğe bağlı. İşlev gövdesi birden fazla ifade içerdiğinde çoklu ifade mantığını sarmak için kullanılır. |
Örnekler
Basit işlev — BIGINT girişine 1 ekleyin:
CREATE SQL FUNCTION my_add(@a BIGINT) AS @a + 1;
BEGIN / END kullanan çoklu ifade işlevi:
CREATE SQL FUNCTION my_sum(@a BIGINT, @b BIGINT, @c BIGINT) RETURNS @my_sum BIGINT
AS BEGIN
@temp := @a + @b;
@my_sum := @temp + @c;
END;
Geçici bir SQL UDF oluşturun
Geçici SQL UDF'leri MaxCompute'da saklanmaz. Yalnızca tanımlandıkları SQL betiği içinde var olurlar ve diğer oturumlarda veya betiklerde çağrılamazlar.
Sözdizimi
FUNCTION <function_name>(@<parameter_in1> <datatype>[, @<parameter_in2> <datatype>...])
[RETURNS @<parameter_out> <datatype>]
AS [BEGIN]
<function_expression>
[END];
Parametreler CREATE SQL FUNCTION ile aynıdır. Geçici bir UDF oluşturmak için CREATE SQL kısmını atlayın.
Örnek
FUNCTION my_add(@a BIGINT) AS @a + 1;
Bir SQL UDF sorgulayın
Yalnızca kalıcı SQL UDF'leri sorgulanabilir; geçici UDF'ler MaxCompute'da saklanmaz.
MaxCompute istemcisinden (odpscmd) DESC FUNCTION komutunu çalıştırmak için istemciyi 0.34.0 veya sonraki bir sürüme yükseltin. Kurulum ve yükseltme talimatları için bkz. MaxCompute istemcisi (odpscmd) .
Sözdizimi
DESC FUNCTION <function_name>;
Örnek
DESC FUNCTION my_add;
Çıktı:
Name my_add
Owner ALIYUN$s***_****@**.aliyunid.com
Created Time 2021-05-08 11:26:02
SQL Definition Text CREATE SQL FUNCTION MY_ADD(@a BIGINT) AS @a + 1
Bir SQL UDF çağırın
Bir SQL UDF'ini yerleşik bir işlevi çağırdığınız gibi çağırın.
Kalıcı SQL UDF'leri herhangi bir aşamada çağrılabilir.
Geçici SQL UDF'leri yalnızca tanımlandıkları betik içinde çağrılabilir.
İlettiğiniz bağımsız değişkenlerin veri türleri UDF'de tanımlanan veri türleriyle eşleşmelidir.
Sözdizimi
SELECT <function_name>(<column_name>[, ...]) FROM <table_name>;
Örnek
-- Create a table and insert sample data.
CREATE TABLE src (c BIGINT, d STRING);
INSERT INTO TABLE src VALUES (1, '100.1'), (2, '100.2'), (3, '100.3');
-- Call my_add on column c.
SELECT my_add(c) FROM src;
Çıktı:
+------------+
| _c0 |
+------------+
| 2 |
| 3 |
| 4 |
+------------+
Bir SQL UDF silin
Sözdizimi
DROP FUNCTION <function_name>;
Örnek
DROP FUNCTION my_add;
Bir işlevi parametre olarak iletin
SQL UDF'leri işlev türünde parametreleri destekler. Bir parametreyi FUNCTION (<input_type>) RETURNS <output_type> olarak bildirdiğinizde, çağıran kişi uyumlu herhangi bir işlevi (yerleşik bir işlev, diğer UDF'ler [Java, Python veya SQL] veya anonim bir işlev) iletebilir.
Örnek
-- Define a SQL UDF.
FUNCTION add(@a BIGINT) AS @a + 1;
-- Define a higher-order UDF that accepts a function as an argument.
FUNCTION op(@a BIGINT, @fun FUNCTION (BIGINT) RETURNS BIGINT) AS @fun(@a);
-- Call op, passing different functions as the second argument.
-- add is a SQL UDF; abs is a MaxCompute built-in function.
SELECT op(key, add), op(key, abs) FROM VALUES (1), (2) AS t(key);
Çıktı:
+------------+------------+
| _c0 | _c1 |
+------------+------------+
| 2 | 1 |
| 3 | 2 |
+------------+------------+
_c0 değeri add(key) sonucudur (1 ekler). _c1 değeri ise abs(key) sonucudur (mutlak değer). ABS işlevi hakkında ayrıntılı bilgi için bkz. Matematiksel işlevler.
MaxCompute'da Lambda ifadelerini kullanmayla ilgili dikkat edilmesi gereken noktalar için bkz. Lambda işlevleri .
Anonim işlevleri kullanın
İşlev türünde parametreye sahip bir UDF çağırırken adlandırılmış bir işlev yerine satır içi anonim bir işlev iletin. Derleyici, anonim işlevin parametre türlerini UDF imzasından çıkarır.
Örnek
FUNCTION op(@a BIGINT, @fun FUNCTION (BIGINT) RETURNS BIGINT) AS @fun(@a);
-- Pass an anonymous function as the second argument.
SELECT op(key, FUNCTION (@a) AS @a + 1) FROM VALUES (1), (2) AS t(key);
FUNCTION (@a) AS @a + 1 ifadesi anonim işlevdir. Parametre türü op imzasından çıkarılır; açık bir tür bildirimi gerekmez.
Örnek: Tekrarlanan SQL mantığını basitleştirin
Senaryo: Tarih dizelerini yyyy-mm-dd biçiminden yyyymmdd biçimine dönüştürün. Giriş tarihleri 2020-11-21, 2020-1-01, 2019-5-1 ve 19-12-1 şeklindedir.
SQL UDF kullanarak (önerilen)
Dönüşüm mantığını bir kez tanımlayın, ardından gerektiğinde işlevi çağırın:
CREATE SQL FUNCTION y_m_d2yyyymmdd(@y_m_d STRING) RETURNS @yyyymmdd STRING
AS BEGIN
@yyyymmdd := CONCAT(
LPAD(SPLIT_PART(@y_m_d, '-', 1), 4, '0'),
LPAD(SPLIT_PART(@y_m_d, '-', 2), 2, '0'),
LPAD(SPLIT_PART(@y_m_d, '-', 3), 2, '0')
);
END;
SELECT y_m_d2yyyymmdd(d) FROM VALUES ('2020-11-21'), ('2020-1-01'), ('2019-5-1'), ('19-12-1') AS t(d);
Çıktı:
+------------+
| _c0 |
+------------+
| 20201121 |
| 20200101 |
| 20190501 |
| 00191201 |
+------------+
SQL UDF kullanmadan
Tam ifadeyi her çağrı noktasında satır içi olarak yazın; mantığın değişmesi gerektiğinde bakımı daha zordur ve hata yapma olasılığı daha yüksektir.
SELECT CONCAT(
LPAD(SPLIT_PART(d, '-', 1), 4, '0'),
LPAD(SPLIT_PART(d, '-', 2), 2, '0'),
LPAD(SPLIT_PART(d, '-', 3), 2, '0')
) FROM VALUES ('2020-11-21'), ('2020-1-01'), ('2019-5-1'), ('19-12-1') AS t(d);
Sınırlamalar
| Sınır | Ayrıntılar |
|---|---|
| Yürütme modu | SQL UDF'leri SQL betik modunda tanımlanmalıdır. Bir UDF'i ortak SQL düzenleme modunda tanımlamak hataya neden olabilir. Bkz. Betik modunda SQL. |
| Veri türü uyumluluğu | Giriş parametresi veri türleri MaxCompute tarafından desteklenen türler olmalıdır. Bir SQL UDF'i çağırırken iletilen bağımsız değişkenlerin veri türleri UDF'de tanımlanan türlerle eşleşmelidir. Bkz. MaxCompute V2.0 veri türü sürümü. |
| İzinler | Bir SQL UDF'i oluşturmak, sorgulamak, çağırmak veya silmek için işlev düzeyi izinler gerekir. Bkz. MaxCompute izinleri. |
| İşlev adı benzersizliği | İşlev adları bir proje içinde benzersiz olmalı ve yerleşik işlev adlarıyla eşleşmemelidir. Her ad yalnızca bir kez kaydedilebilir. |
| Geçici UDF kapsamı | Geçici SQL UDF'leri yalnızca tanımlandıkları betik içinde çağrılabilir. Saklanmazlar ve işlev listesinde sorgulanamazlar. |
| Sorgu istemci sürümü | odpscmd istemcisinden DESC FUNCTION ile bir SQL UDF'i sorgulamak için istemci sürümünün 0.34.0 veya üzeri olması gerekir. |