Sayıyı yazıya dönüştürmek-plsql
Bazı muhasebesel formlarda tutar değerini yazı olarak yazdırmamız gerekebilir,
Bu amaçla verilen sayıyı metin olarak geri döndüren pl/sql fonksiyonu..
CREATE OR REPLACE FUNCTION Convert_Number_To_Text(num_value_ IN NUMBER)
RETURN VARCHAR2 IS
text1_ VARCHAR2(2000);
text2_ VARCHAR2(2000);
number1_ NUMBER := floor(abs(num_value_));
number2_ NUMBER := round(abs(num_value_) - floor(abs(num_value_)), 2);
TYPE numarray IS TABLE OF VARCHAR2(20) INDEX BY BINARY_INTEGER;
birler_ numarray;
onlar_ numarray;
diger_ numarray;
code_ VARCHAR2(3);
PROCEDURE Set_Values IS
BEGIN
birler_(1) := 'BIR';
birler_(2) := 'IKI';
birler_(3) := 'ÜÇ';
birler_(4) := 'DÖRT';
birler_(5) := 'BES';
birler_(6) := 'ALTI';
birler_(7) := 'YEDI';
birler_(8) := 'SEKIZ';
birler_(9) := 'DOKUZ';
onlar_(1) := 'ON';
onlar_(2) := 'YIRMI';
onlar_(3) := 'OTUZ';
onlar_(4) := 'KIRK';
onlar_(5) := 'ELLI';
onlar_(6) := 'ALTMIS';
onlar_(7) := 'YETMIS';
onlar_(8) := 'SEKSEN';
onlar_(9) := 'DOKSAN';
diger_(1) := 'BIN';
diger_(2) := 'MILYON';
diger_(3) := 'MILYAR';
diger_(4) := 'TRILYON';
END Set_Values;
FUNCTION Convert_It(num_to_convert_ IN NUMBER) RETURN VARCHAR2 IS
ret_ VARCHAR2(2000) := NULL;
subtext_ VARCHAR2(2000);
str_ VARCHAR2(2000);
part_ VARCHAR2(2000);
pos_ NUMBER;
prev_ VARCHAR2(20);
prev_prev_ VARCHAR2(20);
len_ NUMBER := length(num_to_convert_);
BEGIN
str_ := to_char(num_to_convert_);
pos_ := 0;
WHILE str_ IS NOT NULL LOOP
pos_ := pos_ + 1;
part_ := substr(str_, -1);
str_ := substr(str_, 1, length(str_) - 1);
subtext_ := NULL;
IF pos_ < len_ THEN
prev_ := substr(num_to_convert_, len_ - pos_, 1);
ELSE
prev_ := NULL;
END IF;
IF pos_ + 1 < len_ THEN
prev_prev_ := substr(num_to_convert_, len_ - pos_ - 1, 1);
ELSE
prev_prev_ := NULL;
END IF;
IF part_ = '0' THEN
IF pos_ IN (4, 7, 10, 13, 16) and
(NVL(prev_, '0') <> '0' OR NVL(prev_prev_, '0') <> '0') THEN
subtext_ := diger_(floor(pos_ / 3));
END IF;
ELSE
IF pos_ IN (1, 4, 7, 10, 13) THEN
IF part_ = '1' and pos_ = 4 and NVL(prev_, '0') = '0' AND
NVL(prev_prev_, '0') = '0' THEN
NULL;
ELSE
subtext_ := birler_(to_number(part_));
END IF;
IF pos_ <> 1 THEN
subtext_ := subtext_ || diger_(floor(pos_ / 3));
END IF;
END IF;
IF pos_ IN (2, 5, 8, 11, 14) THEN
subtext_ := onlar_(to_number(part_));
END IF;
IF pos_ IN (3, 6, 9, 12, 15) THEN
IF part_ = '1' THEN
subtext_ := 'YÜZ';
ELSE
subtext_ := birler_(to_number(part_)) || 'YÜZ';
END IF;
END IF;
END IF;
ret_ := subtext_ || ret_;
END LOOP;
RETURN ret_;
END Convert_It;
BEGIN
IF num_value_ IS NULL THEN
RETURN to_char(null);
END IF;
Set_Values;
IF number1_ = 0 THEN
text1_ := 'SIFIR';
ELSE
text1_ := Convert_It(number1_);
END IF;
RETURN text1_;
END Convert_Number_To_Text;
Test edelim fonksiyonumuzu;
SELECT Convert_Number_To_Text(344)FROM dual;
ÜÇYÜZKIRKDÖRT
SELECT Convert_Number_To_Text(134567876)FROM dual;
YÜZOTUZDÖRTMILYONBESYÜZALTMISYEDIBINSEKIZYÜZYETMISALTI