.\" http://belgeler.org \- 2018\-02\-08T10:38:20Z .TH "CREATE FUNCTION" 7 "" "PostgreSQL" "SQL \- Dil Deyimleri" .nh .PD 0 .SH İSİM CREATE FUNCTION \- yeni bir işlev tanımlar .SH KULLANIM .nf \fBCREATE\fR [\fBOR REPLACE\fR] \fBFUNCTION\fR \fIisim\fR ( [ [ \fIarg_ismi\fR ] \fIarg_türü\fR [, ...] ] ) \ \fBRETURNS\fR \fIdönüş_türü\fR \ { \fBLANGUAGE\fR \fIdil_ismi\fR \ | \fBIMMUTABLE\fR | \fBSTABLE\fR | \fBVOLATILE\fR \ | \fBCALLED ON NULL INPUT\fR | \fBRETURNS NULL ON NULL INPUT\fR | \fBSTRICT\fR \ | [ \fBEXTERNAL\fR ] \fBSECURITY INVOKER\fR | [ \fBEXTERNAL\fR ] \fBSECURITY DEFINER\fR \ | \fBAS\fR \N'39'\fItanım\fR\N'39' \ | \fBAS\fR \N'39'\fInesne_dosyası\fR\N'39', \N'39'\fIilintileme_sembolü\fR\N'39' \ } ... \ [ \fBWITH\fR ( \fIöznitelik\fR [, ...] ) ] .fi .SH AÇIKLAMA \fBCREATE FUNCTION\fR yeni bir işlev tanımlar. \fBCREATE OR REPLACE FUNCTION\fR ise ya yeni bir işlev oluşturur ya da bir mevcut işlev tanımını değiştirir. Eğer bir şema ismi belirtilmişse, işlev belirtilen şemada oluşturulur. Aksi takdirde, geçerli olan şemada oluşturulur. Yeni işlevin ismi, aynı şema içindeki aynı argüman türlerine sahip bir işlev ismi ile aynı olmamalıdır. Farklı argüman türlerine sahip aynı isimdeki işlevlere izin verilir. Mevcut bir işlevin tanımını güncellemek için \fBCREATE OR REPLACE FUNCTION\fR kullanılır. Ancak, bir işlevin ismini ya da argüman türlerini bu yöntemle değiştirmek mümkün değildir (eğer denerseniz, aslında ayrı ve yeni bir işlev oluşturmuş olursunuz). Ayrıca, \fBCREATE OR REPLACE FUNCTION\fR ile mevcut bir işlevin dönüş türünü değiştirmeye çalışmayın, bunu yapmak için işlevi önce silmeli, sonra yeniden oluşturmalısınız. Eğer bir işlevi silip yeniden oluşturursanız, yeni işlev eskisiyle aynı olmaz; mevcut kuralları, sanal tabloları, tetikleri, vs. de silmiş olursunuz. Bunları koruyarak işlev tanımını değiştirmek için \fBCREATE OR REPLACE FUNCTION\fR kullanın. İşlevi tanımlayan kullanıcı aynı zamanda sahibi olur. .SH PARAMETRELER .br .ns .TP \fIisim\fR Tanımlanacak işlevin ismi (şema nitelemeli olabilir). .TP \fIarg_ismi\fR Bir argümanın ismi. Bazı diller (şimdilik sadece PL/pgSQL) argüman ismini işlev gövdesinde kullanmanızı ister. Diğer diller için argüman ismi sadece ek bir bilgidir. .TP \fIarg_türü\fR İşlevin (varsa) argümanlarının veri türleri (şema nitelemeli olabilir). Argüman türleri temel, birleşik veya veri alanı türü olabileceği gibi bir tablo sütununun veri türüne başvurulu olabilir. Gerçeklenim diline bağımlılık sebebiyle, cstring gibi tanımlı türler de belirtilebilir. Argüman türü olarak tanımlı türler kısmen olabileceği gibi SQL veri türlerinin tamamen dışında türler olabilirler. Bir sütun türüne başvuruyu \fItablo_ismi\fR.\fIsütun_ismi\fR%TYPE yazarak belirtebilirsiniz. Bu özelliğin kullanımı bazan bir işlevin bir tablo tanımındaki değişikliklerden bağımsız olmasını sağlayabilir. .TP \fIdönüş_türü\fR İşlevin dönüş değerinin veri türü (şema nitelemeli olabilir). Dönüş türü temel, birleşik veya veri alanı türü olabileceği gibi bir tablo sütununun veri türüne başvurulu olabilir. \fBSETOF\fR değiştiricisi işlevin tek bir öğe ile değil, bir öğe kümesi ile döneceğini belirtir. Bir sütun türüne başvuruyu \fItablo_ismi\fR.\fIsütun_ismi\fR%TYPE yazarak belirtebilirsiniz. .TP \fIdil_ismi\fR İşlevin gerçeklendiği dilin ismi. SQL, C, internal veya kullanıcı tarafından belirtilecek yordamsal dillerden biri olabilir. Geriye uyumluluk için isim tek tırnak içine alınabilir. .TP \fBIMMUTABLE\fR, \fBSTABLE\fR, \fBVOLATILE\fR Çalışma anı eniyilemesi için işlevin çoklu değerlendirmelerinin tek bir değerlendirme ile değiştirilmesinin güvenli olup olmayacağını belirlerler. En fazla bir seçim belirtilebilir. Bunlardan hiçbiri belirtilmemişse \fBVOLATILE\fR öntanımlıdır. \fBIMMUTABLE\fR işlevin aynı argüman değerleriyle daima aynı sonucu döndüreceğini belirtir; yani, argümanlarının veritabanındaki değerlerden faydalanmayacağını ya da argüman olarak açıkça belirtilmemiş bilgileri kullanmayacağını belirtir. Eğer bu seçenek belirtilmişse, işlevin tamamen sabit argümanlı her çağrısı anında işlev değeriyle değiştirilebilir. \fBSTABLE\fR tek bir tablo taraması içinde işlevin aynı argüman değerleri için tutarlı olarak aynı sonucu döndüreceğini, ama sonucun SQL cümleleriyle değişebileceğini belirtir. Bu, sonuçları veritabanı aramalarına, parametrelerine, v.s. bağımlı işlevler için un uygun seçimdir. Ayrıca, değerleri bir hareket içinde değişmediğinden current_timestamp ailesindeki işlevler de \fBSTABLE\fR olarak nitelenmiştir. \fBVOLATILE\fR işlevin değerinin tek bir tablo taraması içinde bile değişebileceğini, dolayısıyla hiçbir eniyileme yapılamayacağını belirtir. Görece birkaç veritabanı işlevi bu anlamda oynaktır; bazı örnekler: random(), currval(), timeofday(). Yan etkiye sahip her işlevin, işlev sonucu tahmin edilebilir olsa bile, eniyilenmesini önlemek için \fBVOLATILE\fR olarak sınıflanması gerektiğini unutmayın; setval() buna bir örnektir. Ek ayrıntılar için .br http://www.postgresql.org/docs/8.0/static/xfunc\-volatility.html adresine bakınız. .TP \fBCALLED ON NULL INPUT\fR, \fBRETURNS NULL ON NULL INPUT\fR, \fBSTRICT\fR \fBCALLED ON NULL INPUT\fR (öntanımlıdır) işlevin bazı argümanları NULL olduğunda normal olarak çağrılacağını belirtir. Bundan sonra işlev yazarının yapacağı NULL değerleri sınamak ve gereğini yapmaktır. \fBRETURNS NULL ON NULL INPUT\fR veya \fBSTRICT\fR ise işlevin, argümanlarından herhangi birinin NULL olması durumunda daima NULL değer döndüreceğini belirtir. Eğer bu seçenek belirtilmişse, NULL argümanların varlığında işlev çalıştırılmayacak, onun yerine hemen bir NULL değer döndürülecektir. .TP .nf [ \fBEXTERNAL\fR ] \fBSECURITY INVOKER\fR [ \fBEXTERNAL\fR ] \fBSECURITY DEFINER\fR .fi \fBSECURITY INVOKER\fR işlevin kendisini çağıran kullanıcının izinleriyle çalıştırılacağını belirtir. \fBSECURITY DEFINER\fR ise işlevin kendisini oluşturan kullanıcının izinleriyle çalıştırılacağını belirtir. \fBEXTERNAL\fR sözcüğü SQL uyumluluğu için varsa da isteğe bağlı olmasından dolayı, SQL\N'39'in tersine bu özellik harici işlevlere uygulanmaz. .TP \fItanım\fR İşlevi tanımlayan bir dizge sabiti; anlamlandırılması dile bağımlıdır. Bir dahili işlev ismi olabileceği gibi bir nesne dosyasının yolu, bir SQL komutu veya bir yordamsal dilde yazılmış bir metin olabilir. .TP \fInesne_dosyası\fR, \fIilintileme_sembolü\fR \fBAS\fR sözcüğünün bu biçimi özdevimli yüklenebilen C dili işlevleri için, işlevin C dili kaynak kodundaki ismi, bir SQL işlevinin ismiyle aynı değilse, kullanılır. \fInesne_dosyası\fR dizgesi ile özdevimli yüklenebilen nesneyi içeren dosyanın ismi belirtilir. \fIilintileme_sembolü\fR ise işlevin C dili kaynak kodundaki ismi olarak işlevin ilintileme sembolüdür. Eğer ilintileme sembolü belirtilmezse, tanımlandığı SQL işlevinin ismiyle aynı olduğu kabul edilir. .TP \fIöznitelik\fR İşlev hakkında bilgi içeren isteğe bağlı parçaları belirtmenin tarihi bir yolu. Burada belirtilebilecek öznitelikler şunlardır: .RS .br .ns .TP isStrict \fBSTRICT\fR veya \fBRETURNS NULL ON NULL INPUT\fR\N'39'a eşdeğerdir. .TP isCachable \fBIMMUTABLE\fR\N'39'ın atıl olmuş eşdeğeridir; hala geriye uyumluluk adına kabul edilmektedir. .PP .RE .IP Öznitelik isimleri harf büyüklüğüne duyarlıdır. .PP .SH EK BİLGİ İşlevlerin yazılması hakkında bilgi edinmek için .br http://www.postgresql.org/docs/8.0/static/xfunc.html adresine bakınız. Girdi argümanları ve dönüş değeri için tamamen SQL türü sözdizimine izin verilmektedir. Ancak, temel işlev gerçekleniminin sorumlusu olduğu tür belirtiminin bazı ayrıntıları (sayısal türlerdeki hassasiyet alanı gibi) \fBCREATE FUNCTION\fR tarafından sessizce sineye çekilir (yani, ne tanınır ne de uygulanır). PostgreSQL, argümanları farklı olmak şartıyla işlevler için aynı isimlerin kullanımına izin verir. Ancak, C dilinde tüm işlev isimlerinin farklı olması gerekir, bu nedenle bu tür C işlevlerine farklı C isimleri vermelisiniz. (örneğin, C isimlerinin parçası olarak argüman türleri kullanılabilir). \fBCREATE FUNCTION\fR aynı nesne dosyası için defalarca çağrıldığında dosya sadece bir kere yüklenir. Dosyayı tekrar tekrar yüklemeniz gerekiyorsa (geliştirme amaçlı) \fBLOAD\fR [load(7)] komutunu kullanın. Kullanıcı tanımlı işlevleri kaldırmak için \fBDROP FUNCTION\fR [drop_function(7)] kullanılır. İşlev tanımlarını yazarken tek tırnak içine almak yerine dolar işaretleri arasında yazmak çoğunlukla daha çok tercih edilen bir yöntemdir .br (http://www.postgresql.org/docs/8.0/static/sql\-syntax.html#SQL\-SYNTAX\-DOLLAR\-QUOTING adresine bakınız). Dolar işaretleri arasında yazma yöntemi kullanılmadığı zaman, işlev tanımı içindeki tek tırnaklar veya tersbölülerin öncelenmesi gerekir. Bir işlevin tanımlanabilmesi için kullanıcının dil üzerinde \fBUSAGE\fR iznine sahip olması gerekir. .SH ÖRNEKLER Burada, başlangıç olarak yardımcı olacak önemsiz bir örneğe yer verilmiştir. Daha fazla bilgi edinmek ve başka örnekler için .br http://www.postgresql.org/docs/8.0/static/xfunc.html adresine bakınız. .RS 4 .nf CREATE FUNCTION add(integer, integer) RETURNS integer \ AS \N'39'select $1 + $2;\N'39' \ LANGUAGE SQL \ IMMUTABLE \ RETURNS NULL ON NULL INPUT; .fi .RE \fBPL/pgSQL\fR dilinde bir argüman ismi kullanarak bir tamsayı arttırımı: .RS 2 .nf CREATE OR REPLACE FUNCTION increment(i integer) RETURNS integer AS $$ \ BEGIN \ RETURN i + 1; \ END; $$ LANGUAGE plpgsql; .fi .RE .SH UYUMLULUK SQL:1999 ve sonrasında bir \fBCREATE FUNCTION\fR tanımlıdır. PostgreSQL sürümü de benzer olmakla birlikte tamamen uyumlu değildir. Ne öznitelikler taşınabilirdir ne de farklı diller kullanılabilmektedir. .SH İLGİLİ BELGELER \fBALTER FUNCTION\fR [alter_function(7)], \fBDROP FUNCTION\fR [drop_function(7)], \fBGRANT\fR [grant(7)], \fBLOAD\fR [load(7)], \fBREVOKE\fR [revoke(7)], \fBcreatelang(1)\fR. .SH ÇEVİREN Nilgün Belma Bugüner , Nisan 2005