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