Ö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;