16 Şubat 2009 Pazartesi

Rakamı yazıya dönüştüren oracle foksiyonu

Fonsiyon virgulden sonraki iki basamağı dikkate alır ve yuvarlama yapmaz.

Kullanımı
**************
select rakam2yazi(153922.69, 'YTL') from dual

Sonuç
**************
YÜZELLİÜÇBİNDOKUZYÜZYİRMİİKİ YTL ALTMIŞDOKUZ KURUS

create or replace FUNCTION rakam2yazi (MY_RAKAM NUMBER, PARABIRIMI VARCHAR2) RETURN VARCHAR2
AS
MY_ARTIS NUMBER(18):=0;
MY_ARA NUMBER(18):=0;
MY_UZUNLUK NUMBER(18):=0;
MY_UZUN NUMBER(18):= NVL(LENGTH(TO_CHAR(TRUNC(MY_RAKAM))), 0) + 1;
MY_DEGER NUMBER(18):= NVL(LENGTH(TO_CHAR(TRUNC(MY_RAKAM))), 0);
MY_BIRLER VARCHAR2(54):='bir iki üç dört beş altı yedi sekiz dokuz ';
MY_ONLAR VARCHAR2(54):='on yirmi otuz kırk elli altmışyetmişseksendoksan';
MY_BINLER VARCHAR2(50):='bin milyon milyar trilyon kattrilyon';
MY_YAZIL VARCHAR2(54) :=NULL;
MY_YAZIM VARCHAR2(300):=NULL;
MY_SAYI VARCHAR2(3) :=NULL;
VAR VARCHAR2(1);
MY_YAZI VARCHAR2(2000);
HATA VARCHAR2(2000);
VIRGULDEN_SONRAKI_KISIM VARCHAR2(500);
BEGIN
IF (TRUNC(MY_RAKAM) - MY_RAKAM < 0) AND (PARABIRIMI <> 'GECXXYY') THEN --eger ondalik kisim var ise
IF (PARABIRIMI = 'YTL') OR (PARABIRIMI = 'TL') THEN
VIRGULDEN_SONRAKI_KISIM := substr( trunc(MY_RAKAM * 100),length(trunc(MY_RAKAM * 100))-1, 2 );
VIRGULDEN_SONRAKI_KISIM := rakam2yazi(to_number(VIRGULDEN_SONRAKI_KISIM),'GECXXYY');
VIRGULDEN_SONRAKI_KISIM := VIRGULDEN_SONRAKI_KISIM || ' KURUS';
ELSE
VIRGULDEN_SONRAKI_KISIM := substr( trunc(MY_RAKAM * 100),length(trunc(MY_RAKAM * 100))-1, 2 );
VIRGULDEN_SONRAKI_KISIM := &PKG..rakam2yazi(VIRGULDEN_SONRAKI_KISIM,'GECXXYY');
VIRGULDEN_SONRAKI_KISIM := VIRGULDEN_SONRAKI_KISIM || ' CENT';
END IF;
END IF;
MY_YAZI := NULL;
LOOP
MY_ARTIS := MY_ARTIS + 1;
MY_ARA := 1;
MY_YAZIM := NULL;
IF MY_UZUN >= 4 THEN
MY_UZUNLUK := 3;
MY_UZUN := MY_UZUN - 3;
ELSE MY_UZUNLUK := MY_UZUN - 1;
MY_UZUN :=1;
END IF;
MY_SAYI := SUBSTR(to_char(MY_RAKAM),MY_UZUN,MY_UZUNLUK);
FOR VAR IN 1 .. MY_UZUNLUK LOOP
IF SUBSTR(MY_SAYI,MY_ARA,1) = 1 AND MY_UZUNLUK = 3 THEN
MY_YAZIM := MY_YAZIM || 'yüz';
GOTO DONGU_SONU;
END IF;
IF MY_ARTIS = 2 AND MY_SAYI = 1 THEN
GOTO DONGU_SONU;
END IF;
IF SUBSTR(MY_SAYI,MY_ARA,1) > 0 THEN
IF MY_UZUNLUK = 2 THEN MY_YAZIL := MY_ONLAR;
ELSE MY_YAZIL := MY_BIRLER;
END IF;
MY_YAZIM := MY_YAZIM || SUBSTR(MY_YAZIL,
(to_number(SUBSTR(MY_SAYI,MY_ARA,1))-1)*6+1,6);
IF MY_UZUNLUK = 3 THEN
MY_YAZIM := MY_YAZIM || 'yüz';
END IF;
END IF;
<>
MY_ARA := MY_ARA + 1;
MY_UZUNLUK := MY_UZUNLUK - 1;
END LOOP;
IF MY_DEGER >= 4 AND MY_ARTIS != 1 AND MY_SAYI != 0 THEN
MY_YAZIM:= MY_YAZIM || SUBSTR(MY_BINLER,(MY_ARTIS-1)*10+1-10,10);
END IF;
MY_YAZI := REPLACE(MY_YAZIM,' ','') || MY_YAZI;
EXIT WHEN MY_UZUN = 1;
END LOOP;
HATA:= 0;
IF PARABIRIMI = 'GECXXYY' THEN
RETURN MY_YAZI ;
ELSE
RETURN MY_YAZI || ' ' || PARABIRIMI || ' ' ||VIRGULDEN_SONRAKI_KISIM;
END IF;
EXCEPTION
WHEN OTHERS THEN RETURN MY_YAZI; --HATA := ' ';
END;

1 yorum:

  1. oracle 11g de aşağıdaki hatayı veriyor fonksiyonu olustururken

    15:05:32 ORA-24344: derleme hatası ile başardı
    15:05:32 26/28 PLS-00103: Encountered the symbol "&" when expecting one of the following:
    15:05:32 ( - + case mod new not null
    15:05:32
    15:05:32 avg count current exists max min prior
    15:05:32 sql stddev sum variance execute forall merge time timestamp
    15:05:32 interval date
    15:05:32
    15:05:32 pipe
    15:05:32
    15:05:32 ||
    15:05:32 multiset
    15:05:32 The symbol ")" was substituted for ";" to continue.
    15:05:32 60/1 PLS-00103: Encountered the symbol ">" when expecting one of the following:
    15:05:32 begin case declare end exit for goto if loop mod null pragma
    15:05:32 raise return select update while with
    15:05:32
    15:05:32 << close current delete fetch lock
    15:05:32 insert open rollback savepoint set sql execute commit forall
    15:05:32 merge pipe
    15:05:32 The symbol ">" was ignored.

    YanıtlaSil