Provided by:
manpages-tr_1.0.5.1-1.1_all 
İSİM
CREATE FUNCTION - yeni bir işlev tanımlar
KULLANIM
CREATE [OR REPLACE] FUNCTION isim ( [ [ arg_ismi ] arg_türü [, ...] ] )
RETURNS dönüş_türü
{ LANGUAGE dil_ismi
| IMMUTABLE | STABLE | VOLATILE
| CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
| [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
| AS 'tanım'
| AS 'nesne_dosyası', 'ilintileme_sembolü'
} ...
[ WITH ( öznitelik [, ...] ) ]
AÇIKLAMA
CREATE FUNCTION yeni bir işlev tanımlar. CREATE OR REPLACE FUNCTION 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 CREATE OR REPLACE FUNCTION
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, CREATE OR REPLACE
FUNCTION 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 CREATE OR
REPLACE FUNCTION kullanın.
İşlevi tanımlayan kullanıcı aynı zamanda sahibi olur.
PARAMETRELER
isim Tanımlanacak işlevin ismi (şema nitelemeli olabilir).
arg_ismi
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.
arg_türü
İş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 tablo_ismi.sütun_ismi%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.
dönüş_türü
İş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.
SETOF 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 tablo_ismi.sütun_ismi%TYPE yazarak
belirtebilirsiniz.
dil_ismi
İş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.
IMMUTABLE, STABLE, VOLATILE
Ç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 VOLATILE öntanımlıdır.
IMMUTABLE 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.
STABLE 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
STABLE olarak nitelenmiÅŸtir.
VOLATILE 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 VOLATILE olarak sınıflanması
gerektiğini unutmayın; setval() buna bir örnektir.
Ek ayrıntılar için
http://www.postgresql.org/docs/8.0/static/xfunc-volatility.html
adresine bakınız.
CALLED ON NULL INPUT, RETURNS NULL ON NULL INPUT, STRICT
CALLED ON NULL INPUT (ö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.
RETURNS NULL ON NULL INPUT veya STRICT 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.
SECURITY INVOKER işlevin kendisini çağıran kullanıcının izinleriyle çalıştırılacağını belirtir. SECURITY DEFINER ise işlevin kendisini oluşturan kullanıcının izinleriyle çalıştırılacağını belirtir.
EXTERNAL sözcüğü SQL uyumluluğu için varsa da isteğe bağlı olmasından dolayı, SQL'in tersine bu özellik harici işlevlere uygulanmaz.
tanım İş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.
nesne_dosyası, ilintileme_sembolü
AS 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. nesne_dosyası dizgesi ile özdevimli yüklenebilen nesneyi içeren dosyanın ismi belirtilir. ilintileme_sembolü 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.
öznitelik
İşlev hakkında bilgi içeren isteğe bağlı parçaları belirtmenin tarihi bir yolu. Burada belirtilebilecek öznitelikler şunlardır:
isStrict
STRICT veya RETURNS NULL ON NULL INPUT'a eÅŸdeÄŸerdir.
isCachable
IMMUTABLE'ın atıl olmuş eşdeğeridir; hala geriye uyumluluk adına kabul edilmektedir.
Öznitelik isimleri harf büyüklüğüne duyarlıdır.
EK BİLGİ
İşlevlerin yazılması hakkında bilgi edinmek için
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) CREATE FUNCTION 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).
CREATE FUNCTION 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ı) LOAD [load(7)] komutunu kullanın.
Kullanıcı tanımlı işlevleri kaldırmak için DROP FUNCTION
[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
(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 USAGE
iznine sahip olması gerekir.
Ö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
http://www.postgresql.org/docs/8.0/static/xfunc.html adresine bakınız.
CREATE FUNCTION add(integer, integer) RETURNS integer
AS 'select $1 + $2;'
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;
PL/pgSQL dilinde bir argüman ismi kullanarak bir tamsayı arttırımı:
CREATE OR REPLACE FUNCTION increment(i integer) RETURNS integer AS $$
BEGIN
RETURN i + 1;
END;
$$ LANGUAGE plpgsql;
UYUMLULUK
SQL:1999 ve sonrasında bir CREATE FUNCTION 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.
İLGİLİ BELGELER
ALTER FUNCTION [alter_function(7)], DROP FUNCTION [drop_function(7)],
GRANT [grant(7)], LOAD [load(7)], REVOKE [revoke(7)], createlang(1).
ÇEVİREN
Nilgün Belma Bugüner <nilgun (at) belgeler·gen·tr>, Nisan 2005