Kullanıcı tanımlı işlev - User-defined function

Bir kullanıcı tanımlı bir işlev ( UDF ) a, fonksiyonu normal varsayım fonksiyonları programı ya da çevreye yerleşik olmasıdır bir bağlamda bir program veya çevrenin, kullanıcı tarafından sağlanan. UDF'ler genellikle yaratıcısının gereksinimi için yazılır.

TEMEL dil

BASIC programlama dilinin bazı eski uygulamalarında , kullanıcı tanımlı işlevler "DEF FN" sözdizimi kullanılarak tanımlanır. BASIC'in daha modern lehçeleri , kodun çoğunun veya tamamının kullanıcı tanımlı işlevler veya prosedürler olarak yazıldığı ve kavramın pratik olarak gereksiz hale geldiği yapılandırılmış programlama paradigmasından etkilenir .

veritabanları

Gelen ilişkisel veritabanı yönetim sistemleri , bir kullanıcı tanımlı bir işlev işlevselliğini genişletmek için bir mekanizma sağlar veritabanı sunucusu standart sorgulama dili (genellikle değerlendirilebilir bir işlev ekleyerek, SQL ) tabloların. SQL arasındaki standart farklılaşacaktır sayıl ve masa fonksiyonları. Bir skaler işlev yalnızca tek bir değer (veya NULL ) döndürürken, bir tablo işlevi, her satırda bir veya daha fazla sütun bulunan sıfır veya daha fazla satır içeren (ilişkisel) bir tablo döndürür.

SQL'de kullanıcı tanımlı fonksiyonlar CREATE FUNCTIONdeyim kullanılarak bildirilir. Örneğin, Celsius'u Fahrenheit'e çeviren bir fonksiyon şöyle bildirilebilir:

CREATE FUNCTION dbo.CtoF(Celsius FLOAT)
  RETURNS FLOAT
  RETURN (Celsius * 1.8) + 32

Oluşturulduktan sonra, SQL deyimlerindeki ifadelerde kullanıcı tanımlı bir işlev kullanılabilir . Örneğin, diğer çoğu içsel işleve izin verildiğinde çağrılabilir. Bu , işlevin veritabanındaki tablolarda depolanan verilere karşı kullanılabileceği SELECT deyimlerini de içerir . Kavramsal olarak, bu tür kullanımlarda işlev her satırda bir kez değerlendirilir. Örneğin, Elementsbilinen her kimyasal element için bir satır içeren adlı bir tablo varsayalım . Tablo, o elementin Celsius cinsinden kaynama noktası için Kaynama Noktası adlı bir sütuna sahiptir. Sorgu

SELECT Name, CtoF(BoilingPoint)
  FROM Elements

her satırdan adı ve kaynama noktasını alırdı. Sütundaki değeri Fahrenhayt cinsinden bir değere dönüştürmek için yukarıda belirtildiği gibi CtoF kullanıcı tanımlı işlevi çağırır.

Her kullanıcı tanımlı işlev, belirli özellikleri veya özellikleri taşır. SQL standardı aşağıdaki özellikleri tanımlar:

  • Dil - kullanıcı tanımlı işlevin uygulandığı programlama dilini tanımlar; örnekler arasında SQL, C, C# ve Java bulunur.
  • Parametre stili - işlevin uygulanması ile veritabanı sistemi arasında işlev parametrelerini ve sonuçları iletmek için kullanılan kuralları tanımlar (yalnızca dil SQL değilse uygulanabilir).
  • Özel ad - veritabanı içinde benzersiz olan işlev için bir ad. Aşırı yüklenmiş işlevler göz önüne alındığında, işlev adının benzersiz olması gerekmediğini unutmayın . Bazı SQL uygulamaları, bir veritabanı içinde işlev adlarının benzersiz olmasını gerektirir ve aşırı yüklenmiş işlevlere izin verilmez.
  • Determinizm - fonksiyonun deterministik olup olmadığını belirtir. Bir SQL deyimi derlenirken determinizm özelliğinin sorgu iyileştirici üzerinde etkisi vardır .
  • SQL-veri erişimi - veritabanı yönetim sistemine, fonksiyonun SQL ifadeleri içerip içermediğini (SQL YOK), SQL ifadeleri içerip içermediğini, ancak herhangi bir tablo veya görünüme erişmediğini (SQL İÇERİR), tablolardan veya görünümlerden veri okuyup okumadığını (SQL DATA OKUYOR) söyler. veya veritabanındaki verileri gerçekten değiştirir (MODIFIES SQL DATA).

Kullanıcı tanımlı işlevler, saklı yordamlarla karıştırılmamalıdır . Saklı prosedürler, kullanıcının bir dizi SQL komutunu gruplandırmasına izin verir. Bir prosedür parametreleri kabul edebilir ve bu parametrelere bağlı olarak SQL ifadelerini çalıştırabilir. Prosedür bir ifade değildir ve bu nedenle kullanıcı tanımlı işlevler gibi kullanılamaz.

Bazı veritabanı yönetim sistemleri, SQL dışındaki dillerde kullanıcı tanımlı işlevlerin oluşturulmasına izin verir. Örneğin Microsoft SQL Server , kullanıcının bu amaç için C# dahil .NET dillerini kullanmasına izin verir . DB2 ve Oracle, C veya Java programlama dillerinde yazılmış kullanıcı tanımlı işlevleri destekler.

SQL Server 2000

Microsoft SQL Server 2000'de üç tür UDF vardır : skaler işlevler , satır içi tablo değerli işlevler ve çok ifadeli tablo değerli işlevler.

Skaler işlevler, RETURNS yan tümcesi ile tek bir veri değeri (tablo değil) döndürür. Skaler işlevler, zaman damgası ve kullanıcı tanımlı veri türleri dışında tüm skaler veri türlerini kullanabilir. Satır içi tablo değerli işlevler, tek bir SELECT ifadesinin sonuç kümesini döndürür . Çok ifadeli tablo değerli işlevler, birçok TRANSACT-SQL ifadesiyle oluşturulmuş bir tablo döndürür.

Kullanıcı tanımlı işlevler, OBJECT_ID, UZUNLUK, DATEDIFF gibi yerleşik işlevler gibi bir sorgudan çağrılabilir veya saklı yordamlar gibi bir EXECUTE ifadesi aracılığıyla yürütülebilir.

Performans Notları: 1. Microsoft SQL Server 2000'de, bir Görünümü "saran" tablo değerli bir işlev, Görünümün kendisinden çok daha hızlı olabilir. Aşağıdaki MyFunction, temeldeki MyView görünümünden daha hızlı çalışan bir "işlev sarmalayıcı" örneğidir:

CREATE FUNCTION MyFunction()
    RETURNS @Tbl TABLE 
    (
        StudentID              VARCHAR(255),
        SAS_StudentInstancesID INT,
        Label                  VARCHAR(255),
        Value                  MONEY,
        CMN_PersonsID          INT
    )
AS
BEGIN
    INSERT @Tbl
    (
        StudentID,
        SAS_StudentInstancesID,
        Label,
        Value,
        CMN_PersonsID
    )
    SELECT 
        StudentID,
        SAS_StudentInstancesID,
        Label,
        Value,
        CMN_PersonsID
    FROM MyView -- where MyView selects (with joins) the same columns from large table(s)

    RETURN
END

2. Microsoft SQL Server 2005'te aynı kod yürütmesinin sonucu bunun tam tersidir: görünüm, "işlev sarmalayıcı"dan daha hızlı yürütülür.

Kullanıcı tanımlı işlevler, kodu yeniden kullanım için kapsüllemek için kullanılabilen bir veya daha fazla Transact-SQL ifadesinden oluşan alt rutinlerdir. Sıfır veya daha fazla argüman alır ve bir dönüş değeri değerlendirir. Saklı yordamlara benzer şekilde gövdesinde hem kontrol akışı hem de DML ifadeleri bulunur. Veritabanında veya dosya veya ağ gibi harici kaynaklarda yapılan değişiklikler gibi herhangi bir Genel Oturum Durumunda değişiklik yapılmasına izin vermez. Çıkış parametresini desteklemiyor. DEFAULT anahtar sözcüğü, parametrenin varsayılan değerini iletmek için belirtilmelidir. UDF'deki hatalar UDF'nin iptal edilmesine neden olur ve bu da UDF'yi çağıran ifadeyi iptal eder.

CREATE FUNCTION CubicVolume
-- Input dimensions in centimeters
(
    @CubeLength decimal(4,1), 
    @CubeWidth  decimal(4,1),
    @CubeHeight decimal(4,1)
)
    RETURNS decimal(12,3)
AS
BEGIN
  RETURN(@CubeLength * @CubeWidth * @CubeHeight)
END

Microsoft SQL Server 2000'de desteklenen veri türü Sonuçları depolamak için kullanılan geçici bir tablo gibi Çoğunlukla geçici bir tür (tablo) değişkenini ve bir UDF'nin dönüş değerini tanımlamak için kullanılır Kapsam, işlev, saklı yordam veya içinde bulunduğu toplu iş ile sınırlıdır. tanımlı (Tablo) değişkenleri arasında atama işlemine izin verilmez UDF'yi oluşturmak için SELECT, INSERT, UPDATE ve DELETE CREATE FUNCTION'da kullanılabilir UDF'nin özelliklerini değiştirmek için ALTER FUNCTION UDF'yi kaldırmak için DROP FUNCTION

Apaçi Kovanı

Apache Hive , normal kullanıcı tanımlı işlevlere (UDF) ek olarak, kullanıcı tanımlı toplama işlevleri (UDAF) ve tablo oluşturma işlevleri (UDTF) de tanımlar. Hive, geliştiricilerin Java ile kendi özel işlevlerini oluşturmalarını sağlar.

Referanslar

Dış bağlantılar