Sayıyı yazıya dönüştürmek-plsql

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

Tagged: , , , , , ,

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir