firebird’de sayıları yazıya çeviren procedure

Bir zamanlar yazmış olduğum, firebird veritabanı üzerinde sayıları yazıya çeviren procedure.

Kullanım:
SELECT p.TUTARYAZI FROM YAZIYLA(111023.03) p
TUTARYAZI
---------
YÜZONBİRBİNYİRMİÜÇ YTL ÜÇ YKR

Kaynak kodları…

SET TERM ^ ;

CREATE PROCEDURE BASAMAKYAZI( BASAMAK Integer, RAKAM Integer )
RETURNS ( YAZI Varchar(20) ) 
AS
BEGIN
    YAZI= 
    case basamak
    when 1 then
        case rakam
            when 1 then 'BİR'
            when 2 then 'İKİ'
            when 3 then 'ÜÇ'
            when 4 then 'DÖRT'
            when 5 then 'BEŞ'
            when 6 then 'ALTI'
            when 7 then 'YEDİ'
            when 8 then 'SEKİZ'
            when 9 then 'DOKUZ'
        end
    when 2 then
        case rakam
            when 1 then 'ON'
            when 2 then 'YİRMİ'
            when 3 then 'OTUZ'
            when 4 then 'KIRK'
            when 5 then 'ELLİ'
            when 6 then 'ALTMIŞ'
            when 7 then 'YETMİŞ'
            when 8 then 'SEKSEN'
            when 9 then 'DOKSAN'
        end
    when 3 then
        case rakam
        when 1 then 'YÜZ'
        when 2 then 'İKİYÜZ'
        when 3 then 'ÜÇYÜZ'
        when 4 then 'DÖRTYÜZ'
        when 5 then 'BEŞYÜZ'
        when 6 then 'ALTIYÜZ'
        when 7 then 'YEDİYÜZ'
        when 8 then 'SEKİZYÜZ'
        when 9 then 'DOKUZYÜZ'
    end
end;
SUSPEND;
END^
SET TERM ; ^

SET TERM ^ ;
CREATE PROCEDURE YAZIYLA ( TUTAR Numeric(18,2) )
RETURNS ( TUTARYAZI Varchar(300) )
AS
DECLARE VARIABLE tutarstr VARCHAR(50);
DECLARE VARIABLE yazi VARCHAR(50);
DECLARE VARIABLE len integer;
DECLARE VARIABLE tamsayistr VARCHAR(50);
DECLARE VARIABLE tamsayiuz integer;
DECLARE VARIABLE kesirstr VARCHAR(2);
DECLARE VARIABLE i integer;
DECLARE VARIABLE rakam integer;
DECLARE VARIABLE basamak integer;
DECLARE VARIABLE uclubasamak integer;
BEGIN

    tutarstr=tutar;
    len = 0;
    TUTARYAZI = '';
    len= CHAR_LENGTH(tutarstr);

    IF (len = 0) THEN
    BEGIN
        TUTARYAZI = 'SIFIR';
    END
    
    tamsayiuz = len-3;
    tamsayistr = SUBSTRING(tutarstr FROM 1 FOR tamsayiuz);
    kesirstr = SUBSTRING(tutarstr FROM len-1 FOR 2);

    i = 1;
    uclubasamak = tamsayiuz;
    WHILE (uclubasamak>3) DO BEGIN
        uclubasamak = uclubasamak-3;
    END

    -- Tam kısmı
    WHILE (i<=tamsayiuz) DO
    BEGIN
        rakam = SUBSTRING(tamsayistr FROM i FOR 1);
        basamak = tamsayiuz-i+1;
    
        IF ((tamsayiuz=1) AND rakam=0) THEN TUTARYAZI = 'SIFIR';

        IF (( rakam>0 ) and (not ( tamsayiuz = 4 and basamak = 4 and rakam = 1 ))) THEN
        BEGIN
            -- 1111 
            EXECUTE PROCEDURE BASAMAKYAZI(:uclubasamak,:rakam) RETURNING_VALUES :YAZI;
            TUTARYAZI = TUTARYAZI || TRIM(YAZI);
        END

        IF ((BASAMAK=4) AND (TUTARYAZI not like '%MİLYON' and TUTARYAZI not like '%MİLYAR')) THEN TUTARYAZI = TUTARYAZI||'BİN' ;
        IF ((BASAMAK=7) AND ( TUTARYAZI not like '%MİLYAR' )) THEN TUTARYAZI = TUTARYAZI || 'MİLYON';
        IF (BASAMAK=10) THEN TUTARYAZI = TUTARYAZI || 'MİLYAR';

        i = i + 1;
        uclubasamak = uclubasamak - 1;
        IF (uclubasamak = 0) THEN uclubasamak = 3;
    END
    
    TUTARYAZI = TUTARYAZI||' TL ';

    -- Kuruş Kısmı
    IF (CAST (kesirstr AS INTEGER)>0) THEN
    BEGIN
        rakam = SUBSTRING(kesirstr FROM 1 FOR 1);
        IF ( rakam > 0 ) THEN
        BEGIN
            EXECUTE PROCEDURE BASAMAKYAZI(2,:rakam) RETURNING_VALUES :YAZI;
            TUTARYAZI= TUTARYAZI||TRIM(YAZI);
        END

        rakam = SUBSTRING(kesirstr FROM 2 FOR 1);
        IF ( rakam > 0 ) THEN
        BEGIN
            EXECUTE PROCEDURE BASAMAKYAZI(1,:rakam) RETURNING_VALUES :YAZI;
            TUTARYAZI= TUTARYAZI||TRIM(YAZI);
        END
        TUTARYAZI= TUTARYAZI||' KR';
    END

SUSPEND;
END^
SET TERM ; ^

oracle substr fonksiyonu

SUBSTR (string, başlangıç [, uzunluk ])
Fonksiyonu string içerisinden başlangıç karakterinden uzunluk kadar olan kısmı alır.


SQL> select Substr('Zeki Güven',6,5) from dual;

SUBSTR('ZEKIGÜVEN',6,5)
--------------------------------
Güven

Eğer uzunluk belirtilmezse, string‘in başlangıç olarak belirtilen pozisyondan başlıyarak, string‘in tamamını alır.


SQL> select Substr('Zeki Güven',6) from dual;

SUBSTR('ZEKIGÜVEN',6)
--------------------------------
Güven

başlangıç pozisyonu pozitif bir sayı olursa string‘in başından, negatif bir sayı olursa string‘in son tarafından başlar.


SQL> select Substr('Zeki Güven',3) from dual;

SUBSTR('ZEKIGÜVEN',3)
--------------------------------
ki Güven

SQL> select Substr('Zeki Güven',-3) from dual;

SUBSTR('ZEKIGÜVEN',-3)
--------------------------------
ven

SQL> select Substr('Zeki Güven',-10,4) from dual;

SUBSTR('ZEKIGÜVEN',-10,4)
--------------------------------
Zeki

oracle replace fonksiyonu

REPLACE(string, aranacak_string [, değiştirilecek_string ] ) fonksiyonu string parametresi içerisinde aranacak_string arayıp, değiştirilecek_string ile değiştirir. Bütük küçük harf ayırımını dikkate alır. değiştirilecek_string belitilmezse aranacak_string, string içinden kaldırır.


SQL> select Replace('Zeki Güven','Z','C') from dual;

REPLACE('ZEKIGÜVEN','Z','C')
---------------------------------------------------
Ceki Güven

SQL> select Replace('Zeki Güven','z','C') from dual;

REPLACE('ZEKIGÜVEN','Z','C')
---------------------------------------------------
Zeki Güven

SQL> select Replace('Zeki Güven','e','x') from dual;

REPLACE('ZEKIGÜVEN','E','X')
---------------------------------------------------
Zxki Güvxn

SQL> select Replace('Zeki Güven','e',null) from dual;

REPLACE('ZEKIGÜVEN','E',NULL)
--------------------------------
Zki Güvn

SQL> select Replace('Zeki Güven','e') from dual;

REPLACE('ZEKIGÜVEN','E')
--------------------------------
Zki Güvn

oracle rtrim fonksiyonu

RTRIM(string[, çıkartılacak karakter ]) fonksiyonu çıkartılacak karakter belirtilmediği takdirde string‘in sonundaki ‘ ‘ (boşluk) karakterlerini kaldırır. Boşluk karakteri yerine başka bir karakter’in kaldırılması istenirse çıkartılacak karakter parametresi ile belirtilir.


SQL> select RTrim('Zeki Güven ') from dual;

RTRIM('ZEKIGÜVEN
--------------------------------
Zeki Güven

SQL> select RTrim('Zeki Güven*************','*') from dual;

RTRIM('ZEKIGÜVEN*************
--------------------------------
Zeki Güven

oracle ltrim fonksiyonu

LTRIM(string[, çıkartılacak karakter ]) fonksiyonu çıkartılacak karakter belirtilmediği takdirde string‘in başındaki ‘ ‘ (boşluk) karakterlerini kaldırır. Boşluk karakteri yerine başka bir karakter’in kaldırılması istenirse çıkartılacak karakter parametresi ile belirtilir.


SQL> select LTrim(' Zeki Güven') from dual;

LTRIM('ZEKIGÜVEN
--------------------------------
Zeki Güven

SQL> select LTrim('*************Zeki Güven','*') from dual;

LTRIM('*************ZEKIGÜVEN
--------------------------------
Zeki Güven

oracle trim fonksiyonu


TRIM([ { { LEADING | TRAILING | BOTH }
         [ çıkartılacak karakter ]
       | çıkartılacak karakter
       }
       FROM
     ]
     string
    )

TRIM fonksiyonu tek parametre ile kullanıldığında string‘in başındaki ve sonundaki ‘ ‘ (boşluk) karakterlerini çıkartır.


SQL> select Trim(' Zeki Güven ') from dual;

TRIM('ZEKIGÜVEN')
--------------------------------
Zeki Güven

Boşluk karakterinden farklı bir karakter çıkartmak için FROM kullanılır.


SQL> select Trim('-' from '----Zeki Güven----') from dual;

TRIM('-'FROM'----ZEKIGÜVEN---
--------------------------------
Zeki Güven

Sadece string1‘in başındaki karakterlerin çıkartılması için LEADING, sonundaki karakterlerin çıkartılması için TRAILING. Hem başındaki hem sonundaki karakterlerin çıkartılması için BOTH kullanılır.


SQL> select Trim(leading '-' from '----Zeki Güven----') from dual;

TRIM(LEADING'-'FROM'----ZEKIG
--------------------------------
Zeki Güven----

SQL> select Trim(trailing '-' from '----Zeki Güven----') from dual;

TRIM(TRAILING'-'FROM'----ZEKI
--------------------------------
----Zeki Güven

SQL> select Trim(both '-' from '----Zeki Güven----') from dual;

TRIM(BOTH'-'FROM'----ZEKIGÜVE
--------------------------------
Zeki Güven

LEADING , TRAILING , BOTH anahtar keimelerinden biri kullanılmazsa BOTH kullanılmış gibi sonuç üretilir


SQL> select Trim('-' from '----Zeki Güven----') from dual;

TRIM('-'FROM'----ZEKIGÜVEN---
--------------------------------
Zeki Güven

oracle upper fonksiyonu

UPPER(string) fonksiyonu, parametre olarak verilen string değerini büyük harfe çevirir.

SQL> select Upper('Zeki Güven') from dual;

UPPER('ZEKIGÜVEN')
--------------------------------
ZEKI GÜVEN

Türkçe karakter -özellikle İ- problemini yaşamak istemiyorsanız NLS_UPPER fonksiyonunu kullanmalısnız.

SQL> select NLS_UPPER('Zeki Güven','NLS_SORT = XTurkish') from dual;

UPPER('ZEKIGÜVEN')
--------------------------------
ZEKI GÜVEN

oracle rpad fonksiyonu

RPAD (string1,uzunluk [,string2])
string1 değerinin sağ tarafına, toplam uzunluğu parametre ile belirtilen uzunluğa eşit olana kadar string2‘den ekler.
string2 belirtilmezse ‘ ‘ (boşluk) karakteri kullanılır.
Eğer string1‘in uzunluğu uzunluk parametresinden büyükse, büyük olan kısım string1‘den kesilir.


SQL> select RPAD('Zeki Güven',20,'*') from dual;

RPAD('ZEKIGÜVEN',20,'*')
------------------------------------------------
Zeki Güven**********

SQL> select RPAD('Zeki Güven',20,'.:') from dual;

RPAD('ZEKIGÜVEN',20,'.:')
------------------------------------------------
Zeki Güven.:.:.:.:.:

SQL> select RPAD('Zeki Güven',5,'.:') from dual;

RPAD('ZEKIGÜVEN',5,'.:')
------------------------------------------------
Zeki

oracle lpad fonksiyonu

LPAD (string1,uzunluk [,string2])
string1 değerinin sol tarafına, toplam uzunluğu parametre ile belirtilen uzunluğa eşit olana kadar string2‘den ekler.
string2 belirtilmezse ‘ ‘ (boşluk) karakteri kullanılır.
Eğer string1‘in uzunluğu uzunluk parametresinden büyükse, büyük olan kısım string1‘den kesilir.


SQL> select LPAD('Zeki Güven',20,'*') from dual;

LPAD('ZEKIGÜVEN',20,'*')
------------------------------------------------
**********Zeki Güven

SQL> select LPAD('Zeki Güven',20,'.:') from dual;

LPAD('ZEKIGÜVEN',20,'.:')
------------------------------------------------
.:.:.:.:.:Zeki Güven

SQL> select LPAD('Zeki Güven',5,'.:') from dual;

LPAD('ZEKIGÜVEN',5,'.:')
------------------------------------------------
Zeki