Özet: Veritabanında “function” tanımı ve kullanımı örneklerle anlatılıyor.
Fonksiyonlar sadece tek değer döndürürler. Bu tek değer; koşullara göre true/false, 1/0 veya da bir veri olabilir. Daha çok matematiksel ifadeleri ve SUBSTR, LENGTH, REPLACE, TO_DATE vs. gibi hazır fonksiyonları da kullanarak veri tipi veya veri çevirileri, veri maskeleme vb. işlemlerimiz için kullanırız.
Aşağıdaki function ‘deneme fonksiyon’ ifadesini döner;
CREATE OR REPLACE FUNCTION deneme RETURN VARCHAR2 IS BEGIN RETURN 'deneme fonksiyon'; END deneme; / select deneme from dual; DENEME ----------------- deneme fonksiyon
Aşağıdaki fonksiyon iki tarih arasındaki farkı döner;
CREATE OR REPLACE FUNCTION date_fark (max_date DATE, min_date DATE)
RETURN PLS_INTEGER
IS
BEGIN
RETURN max_date - min_date;
EXCEPTION
WHEN OTHERS
THEN
RETURN NULL;
END date_fark;
SELECT date_fark(to_date('02/20/1983', 'MM/DD/YYYY'),to_date('05/25/1982', 'MM/DD/YYYY')) FROM dual;
Aşağıdaki fonksiyon yaş hesabı yapar;
CREATE OR REPLACE FUNCTION yas_hesapla (dtar DATE)
RETURN NUMBER
IS
BEGIN
RETURN (TRUNC ( (SYSDATE - dtar) / 365.25));
END yas_hesapla;
select yas_hesapla(to_date('02/20/1982', 'MM/DD/YYYY')) from dual;
Aşağıdaki fonksiyon örneğin TL yi eski 6 sıfırlı haline çevirir;
CREATE OR REPLACE FUNCTION eski_lira (tutar NUMBER) RETURN NUMBER IS sonuc NUMBER (25, 5); bolum NUMBER; carpan NUMBER; tamsayi INTEGER; carpim NUMBER; BEGIN IF NVL (tutar, 0) = 0 THEN RETURN (0); ELSE carpan := 1000000; carpim := tutar * carpan; sonuc := carpim; RETURN (sonuc); END IF; END; select hasta_adi,hasta_no,eski_lira(hasta_no) as lira from hastalar;
Aşağıdaki fonksiyon girilen klinik_id parametresine göre klinik adını döner;
CREATE OR REPLACE FUNCTION fonk_klinik_ad (vklinik_id number) return varchar2 IS vklinik_ad varchar2(20); cursor cur_klinik_ad is select klinik_adi from klinik where klinik_id = vklinik_id; BEGIN open cur_klinik_ad; fetch cur_klinik_ad into vklinik_ad; close cur_klinik_ad; return vklinik_ad; END; / select * from klinik where klinik_adi=fonk_klinik_ad(1);
bir diğer kullanım örneği;
CREATE OR REPLACE FUNCTION fonk_klinik_ad2 (vklinik_id number)
return varchar2 IS
vklinik_ad varchar2(20);
begin
select klinik_adi into vklinik_ad from klinik where klinik_id = vklinik_id;
return(vklinik_ad);
exception when others then
return('');
end;
/
select * from klinik where klinik_adi=fonk_klinik_ad2(1);
Aşağıdaki fonksiyon girilen hasta no parametresine göre hasta adını döner;
CREATE OR REPLACE FUNCTION fonk_hasta_ad_bul (no in number)
return varchar2 is
hasta_ad varchar2(20);
begin
if no is not null then
BEGIN
SELECT hasta_adi
INTO hasta_ad
FROM hastalar h
WHERE h.hasta_no =no;
return hasta_ad;
EXCEPTION
WHEN OTHERS THEN return null;
END;
else
return null;
end if;
end;
/
select * from hastalar;
insert into hastalar(hasta_id,hasta_no,hasta_adi,klinik_id) values(75,'','orhan',1);
select * from hastalar;
select * from hastalar where hasta_adi=fonk_hasta_ad_bul('100');
select * from hastalar where hasta_adi=fonk_hasta_ad_bul('');
Aşağıdaki fonksiyon minumum tarih bilgisini döner;
CREATE OR REPLACE FUNCTION fonk_min_tarih (hastaid NUMBER) RETURN DATE IS tarih DATE; BEGIN BEGIN SELECT MIN (son_update) INTO tarih FROM hastalar WHERE hasta_id = hastaid; EXCEPTION WHEN OTHERS THEN tarih := ''; END; RETURN tarih; END; / select fonk_min_tarih(10) from dual;
Aşağıdaki fonksiyon türkçe karakterleri ingilizce karakterlere çevirir;
CREATE OR REPLACE FUNCTION turkce_ingilizce (kelime VARCHAR2)
RETURN VARCHAR2
IS
uzun NUMBER;
deger VARCHAR2 (32760);
yeni VARCHAR2 (32760);
BEGIN
IF kelime IS NULL
THEN
RETURN (NULL);
END IF;
uzun := LENGTH (kelime);
deger := kelime;
FOR k IN 1 .. uzun
LOOP
IF SUBSTR (deger, k, 1) = 'Ç'
THEN
yeni := yeni || 'C';
ELSIF SUBSTR (deger, k, 1) = 'Ğ'
THEN
yeni := yeni || 'G';
ELSIF SUBSTR (deger, k, 1) = 'İ'
THEN
yeni := yeni || 'I';
ELSIF SUBSTR (deger, k, 1) = 'Ö'
THEN
yeni := yeni || 'O';
ELSIF SUBSTR (deger, k, 1) = 'Ü'
THEN
yeni := yeni || 'U';
ELSIF SUBSTR (deger, k, 1) = 'Ş'
THEN
yeni := yeni || 'S';
ELSIF SUBSTR (deger, k, 1) = 'ç'
THEN
yeni := yeni || 'c';
ELSIF SUBSTR (deger, k, 1) = 'ı'
THEN
yeni := yeni || 'i';
ELSIF SUBSTR (deger, k, 1) = 'ö'
THEN
yeni := yeni || 'o';
ELSIF SUBSTR (deger, k, 1) = 'ü'
THEN
yeni := yeni || 'u';
ELSIF SUBSTR (deger, k, 1) = 'ğ'
THEN
yeni := yeni || 'g';
ELSIF SUBSTR (deger, k, 1) = 'ş'
THEN
yeni := yeni || 's';
ELSE
yeni := yeni || SUBSTR (deger, k, 1);
END IF;
END LOOP;
RETURN (yeni);
END;
select turkce_ingilizce('ÇAĞATAY') from dual;
select turkce_ingilizce(hasta_adi) from hastalar;
Aşağıdaki fonksiyon da yukarıdakinin bir başka versiyonu;
CREATE OR REPLACE FUNCTION STRING_DUZENLE (str_ VARCHAR2) RETURN VARCHAR2 IS ret_ VARCHAR2 (4000); BEGIN ret_ := REPLACE (REPLACE (str_, 'ç', 'c'), 'Ç', 'C'); ret_ := REPLACE (REPLACE (ret_, 'ğ', 'g'), 'Ğ', 'G'); ret_ := REPLACE (REPLACE (ret_, 'ı', 'i'), 'İ', 'I'); ret_ := REPLACE (REPLACE (ret_, 'ö', 'o'), 'Ö', 'O'); ret_ := REPLACE (REPLACE (ret_, 'ş', 's'), 'Ş', 'S'); ret_ := REPLACE (REPLACE (ret_, 'ü', 'u'), 'Ü', 'U'); ret_ := REPLACE ( REPLACE ( REPLACE ( REPLACE (REPLACE (REPLACE (ret_, ',', '.'), '-', ' '), ':', '.'), '/', ' '), '\', ' '), ';', '.'); RETURN ret_; END;
select REPLACE (REPLACE ('ÇAĞATAY', 'ç', 'c'), 'Ç', 'C') from dual;
select turkce_ingilizce('ÇAĞATAY') from dual;
select
REPLACE (
REPLACE (
REPLACE (
REPLACE (REPLACE (REPLACE ('ÇAĞATAY,ahmet-ayşe/ali;fatma', ',', '.'), '-', ' '),
':',
'.'),
'/',
' '),
'\',
' '),
';',
'.') from dual;