İ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