İ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