PL/SQL Split Functions

Selamlar,

bu yazımda PL/SQL’de split function (ayrıştırma fonksiyonu) örnekleri yapıcam. Split den kastım; belli bir karakter kullanılarak düzenlenmiş bir şekilde gelen string’i alıp, verilen karaktere göre ayrıştırıcam. Ben örneklerimde karakter olarak virgül(,) kullandım.

Aslında bu fonksiyonu yazmanın bir çok yolu var. Ben aşağıda bir kaç örnek yapmaya çalıştım.

Örnek – 1

Bu örnektte gelen string değeri önce ayrıştırdım daha sonra kendi istediğim formata soktum.

CREATE OR REPLACE FUNCTION GetSplittedString(p_String IN VARCHAR2) 
 RETURN VARCHAR2 
  IS
  v_FormattedString VARCHAR2(1000);
  v_String          VARCHAR2(1000);
  vs_Substring      VARCHAR2(1000);
  v_CharCount       NUMBER;
BEGIN
  v_String    := p_String;
  v_CharCount := REGEXP_COUNT(v_String, ',');

  FOR i IN 1 .. v_CharCount + 1 LOOP
    vs_Substring := TRIM(REGEXP_SUBSTR(v_String, '[^,]+', 1, i));
    IF vs_Substring IS NOT NULL THEN
      v_FormattedString := v_FormattedString || '''' || vs_SubString || ''',';
    END IF;
  END LOOP;
  v_FormattedString := SUBSTR(v_FormattedString, 1, LENGTH(v_FormattedString) - 1);
  RETURN v_FormattedString;
END;

Test edelim.

select GetSplittedString('a,b,c,d') a,
       GetSplittedString(' a , b ,  c , d  ') b
  from dual;

split1

 

Örnek 2

İkinci örneğimizde REGEXP fonksiyonlarını kullanmadan ayrıştıralım.

CREATE OR REPLACE FUNCTION GetSplittedString(p_String VARCHAR2) 
 RETURN VARCHAR2 
  IS
  v_FormattedString VARCHAR2(1000);
  v_String          VARCHAR2(1000);
  v_Substring       VARCHAR2(1000);
  v_CharIndex       NUMBER;

BEGIN
  IF INSTR(p_String, ',') > 0 THEN
    v_String    := REPLACE(p_String, ' ', '');
    v_CharIndex := INSTR(v_String, ',', 1, 1);
  
    WHILE (v_CharIndex != 0) LOOP
      BEGIN
        v_Substring       := SUBSTR(v_String, 1, v_CharIndex - 1);
        v_FormattedString := v_FormattedString || '''' || v_Substring || ''',';
        v_String          := REPLACE(v_String, v_Substring || ',', '');
        v_CharIndex       := INSTR(v_String, ',', 1, 1);
        IF (v_CharIndex = 0) THEN
          v_Substring       := v_String;
          v_FormattedString := v_FormattedString || '''' || v_Substring || '''';
        END IF;
      END;
    END LOOP;
  END IF;
  RETURN v_FormattedString;
END;

Tekrar test edelim.

select GetSplittedString('a,b,c,d') a,
       GetSplittedString(' a , b ,  c , d  ') b
  from dual;

split2

Umarım faydalı olur. Kolay gelsin.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Connecting to %s