Arşiv

Posts Tagged ‘function’

pl/slq de fibonacci sayı dizisini oluşturma

Merhaba
Hayatında herkes Fibonacci sayı dizisini duymuştur. Bu konuda detaylı bilgi Leonardo Fibonacci linkinden ve özet ve basit bilgiyi ise Fibonacci Dizisi adresinden görebilirsiniz.
Bilindiği gibi Fibonacci dizisi bir matematiksel işlemdir. Herhangi bir programlama dili ile bu dizi rahatlıkla oluşturulabilinir.Fibonacci dizisinin temel formülü F(n-1)+F(n-2) şeklindedir. Pl/Sql ile de bir Fibonacci dizisi oluşturabiliriz.

DECLARE
  fibo VARCHAR2(4000);

  FUNCTION fibonacci(n NUMBER) RETURN NUMBER IS
  BEGIN
    IF n = 0 OR n = 1 THEN
      RETURN n;
    ELSE
      RETURN fibonacci(n - 1) + fibonacci(n - 2);
    END IF;
  END;

BEGIN
  FOR i IN 0 .. 20 LOOP
    fibo := fibo || fibonacci(i) || ' ';
  END LOOP;
  dbms_output.put_line(fibo);
END;

Ben örnek olarak 0-20 arasındaki sayılar için Fibonacci dizisi oluşturdum fakat bilindiği gibi Fibonacci dizisi herhangi bir sayıdan başlanılarak da oluşturulabilinir.

0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 

0-20 arasındaki sayılar için yukarıda gibi bir Fibonacci dizisi oluşurken bu işlemi 5-20 arasında yaparsak bahsettiğim herhangi bir sayıdan başlanıp Fibonacci dizi oluşturulduğunu ve değerlerin değişmediğini görelim.

DECLARE
  fibo VARCHAR2(4000);

  FUNCTION fibonacci(n NUMBER) RETURN NUMBER IS
  BEGIN
    IF n = 0 OR n = 1 THEN
      RETURN n;
    ELSE
      RETURN fibonacci(n - 1) + fibonacci(n - 2);
    END IF;
  END;

BEGIN
  FOR i IN 5 .. 20 LOOP
    fibo := fibo || fibonacci(i) || ' ';
  END LOOP;
  dbms_output.put_line(fibo);
END;

5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 

Görüldüğü gibi dizide başlangıç değeri dışında değişen bir durum olmadı. Genel Fibonacci dizisi kuralı olan F(n-1)+F(n-2) durumu ile yazılım dili ne olursa olsun istenilen Fibonacci dizisi oluşturulabilinir.
NOT: Kodlarda da göreceğiniz gibi F(n-1)+F(n-2) işlemi yapmak için n>1 olması gerekiyor. n=1 ya da n=0 olduğu durumda kodlarda görülen işlemi yapmak n değerini olduğu gibi kullanmak gerekir.
Kolay gelsin.

pl/sql de metin içindeki karakter ya da sayısal değerleri bulma

Merhaba,
Database deki tablolarımız içerisinde kayıtlı olan karmaşık (karakter + sayısal değerler )verilerden sadece karakter içeriği ya da sayısal içeriği almak istediğimiz durumlar olabilir. Bu durumlarda küçük kod parçaları ile kontrol işlemleri yapmak yerine bu işlemi genelleştirip bir fonksiyon yardımı ile bu işlemi çözebiliriz. Bu durum için bir fonksiyon hazırlayalım.

CREATE OR REPLACE FUNCTION deger_bul(gelen_metin VARCHAR2, tip NUMBER) RETURN VARCHAR2 IS
  sonuc      VARCHAR2(4000);
  tmp_deger  VARCHAR2(10);
  tmp_number NUMBER;
  i          NUMBER;
BEGIN
  
  --tip=0 >> Karakter değerler
  --tip=1 >> Sayısal değerler
  
  sonuc     := NULL;
  tmp_deger := NULL;
  IF gelen_metin IS NULL THEN
    RETURN NULL;
  END IF;
  FOR i IN 1 .. length(gelen_metin) LOOP
    IF tip = 0 THEN
      tmp_deger := substr(gelen_metin, i, 1);
      IF tmp_deger NOT IN ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') THEN
        sonuc := sonuc || tmp_deger;
      END IF;
    ELSIF tip = 1 THEN
      BEGIN
        tmp_deger  := substr(gelen_metin, i, 1);
        tmp_number := to_number(tmp_deger);
        sonuc      := sonuc || tmp_deger;
      EXCEPTION
        WHEN OTHERS THEN
          NULL;
      END;
    ELSE
      RETURN('Girien Tip İçin Bir Çalışma Yapılamaz.!');
    END IF;
  END LOOP;
  RETURN sonuc;
END deger_bul;

Hazırladığımız bu fonksiyon ile artık istediğimiz metin içinden istediğimiz veri setini alabiliriz. İster karakter içeriği , ister sayısal içeriği. Hemen bir örnek ile daha iyi bu durumu kavrayalım. Aşağıdaki script ile fonksiyonumuzun üç farklı duruma göre aynı anda çalıştırarak sonuçlarını görelim.

SELECT deger_bul('Bu Metin İçinden Sadece Karakter Değerleri Bulacak.1234567890', 0) karakter,
       deger_bul('Bu Metin İçinden Sadece Sayısal Değerleri Bulacak.1234567890', 1) sayisal,
       deger_bul('Bu İşlem İçin Doğru Tip Değeri Olmadığından Fonksiyon Hata Dönecek', 2) sonuc_yok
  FROM dual;
 

Fonksiyonu çalıştırdıktan sonra verdiğimiz tip değerlerine göre aldığımız sonuç aşağıdaki gibi olacaktır. Alınan sonuçtan da anlaşılacağı gibi sadece belirttiğimiz tip değerine göre sonuçlarımızı alabiliyoruz. Tanımlanan tip değeri dışında bir değer ile fonksiyon çalıştırıldığında açıklamalı olarak girilen tip için çalışma yapılmayacağı bilgisini vermiş oluyoruz.

KARAKTER SAYISAL SONUC_YOK
Bu Metin İçinden Sadece Karakter Değerleri Bulacak. 1234567890 Girien Tip İçin Bir Çalışma Yapılamaz.!

Bu basit ve işlevsel fonksiyon daha ileri amaçlar için çeşitli değişiklikler ile daha da verimli hale getirilebilinir.
Kolay gelsin.

pl/sql de sabit metin içindeki belirli bir karakter sayısını bulma

10 Kasım 2010 1 yorum

Merhaba,

Database üzerinde kayıt olan bir metin içinde ya da herhangi bir sabit metin içerisinde bir kelimenin ya da karakterin kaç kere tekrar ettiği bilgisini bulmak için aşağıdaki pl/sql fonksiyonunu yazdım. Bu fonksiyon ile ister db üzerinde kayıtlı bir alandaki metinden ister sabit olarak fonksiyona gönderilen metin içerisinden istenilen karakter sayısı bulunabilinir. Fonksiyonun kodları ve kullanımı aşağıdadır.

CREATE OR REPLACE FUNCTION karakter_sayisi(metin VARCHAR2, aranan_karakter VARCHAR2) RETURN NUMBER IS
  karakter_adet    NUMBER;
  sonraki_karakter NUMBER;
  sabit_metin      VARCHAR2(4000);
  aranan_metin     VARCHAR2(4000);
BEGIN
  karakter_adet    := 0;
  sonraki_karakter := 1;
  sabit_metin      := lower(metin);
  aranan_metin     := lower(aranan_karakter);

  FOR i IN 1 .. length(sabit_metin) LOOP
    IF (length(aranan_metin) <= (length(sabit_metin) - sonraki_karakter + 1)) AND
       (substr(sabit_metin, sonraki_karakter, length(aranan_metin)) = aranan_metin) THEN
      karakter_adet := karakter_adet + 1;
    END IF;
    sonraki_karakter := sonraki_karakter + 1;
  END LOOP;

  RETURN karakter_adet;
END karakter_sayisi;

Örnek bir kaç kullanım aşağıdadır.

SELECT karakter_sayisi('sabit bir metin', 'i') "Karakter Sayısı" FROM dual;

SELECT karakter_sayisi('deneme olarak yazılan deneme bir sabit metin', 'deneme') "Karakter Sayısı" FROM dual;

Örneklerden de anlaşılacağı gibi sabit bir metin içerisinde ister sadece bir karakter isterse bir kelime araması yapılabilinir.

Kolay gelsin.

pl/sql package örnek

Merhaba,

Pl/sql de package kullanımına ve oluşturulmasına bir örnek. Çoğu zaman sıklıkla ya da belirli bir işlem için kullanılan birden fazla database işlemimiz var ise (procedure,function vb.) bu işlemlerin hem kullanımı hem de kolay takibi için package kullanılır. Örnek olarak aşağıda bir package oluşturulmuştur.

Package oluşturmak için öncelikle package spec bilgisini oluşturmalıyız. Package spec bilgisinde package içerisinde kullanacak olduğumuz procedure,funciton vb. database işlemimizi belirleriz.

CREATE OR REPLACE PACKAGE example_package IS

  -- Author  : SAMETCELIKBICAK
  -- Created : 08.06.2010 16:46:37
  -- Purpose : pl/sql package örnek

  FUNCTION example_function(param1 NUMBER, param2 NUMBER, param3 VARCHAR2) RETURN VARCHAR2;

END example_package;

Package spec aşamasında belirtmiş olduğumuz database işlemlerimizin içeriği ise package body kısmında doldurulur.

CREATE OR REPLACE PACKAGE BODY example_package IS

  FUNCTION example_function(param1 NUMBER, param2 NUMBER, param3 VARCHAR2) RETURN VARCHAR2 IS
    RESULT VARCHAR2(500);
  BEGIN
    IF param3 = '+' THEN
      RESULT := to_char(param1) || '+' || to_char(param2) || '=' || (param1 + param2);
    ELSIF param3 = '-' THEN
      RESULT := to_char(param1) || '-' || to_char(param2) || '=' || (param1 - param2);
    ELSIF param3 = '*' THEN
      RESULT := to_char(param1) || '*' || to_char(param2) || '=' || (param1 * param2);
    ELSIF param3 = '/' THEN
      RESULT := to_char(param1) || '/' || to_char(param2) || '=' || (param1 / param2);
    END IF;
    RETURN(RESULT);
  END;

BEGIN
  NULL;
END example_package;

Package body kısmında da ihtiyacımız olan database işlemlerini yaptıktan sonra şimdi sıra oluşturduğumuz package ve içindeki nesneleri kullanmaya geldi. örnek olarak da aşağıdaki gibi bir script yazılabilinir.

SELECT example_package.example_function(2, 5, '+') "Toplama",
       example_package.example_function(2, 5, '-') "Çıkarma",
       example_package.example_function(2, 5, '/') "Bölme",
       example_package.example_function(2, 5, '*') "Çarpma"
  FROM dual;

Bu scriptin çıktısıda aşağıdaki gibidir.

pl/sql type kullanımı örnek

Merhaba pl/sql ortamında bir type oluşturma ve kullanımına dair hazırlanmış bir örnek.Öncelikle type oluşturalım.

CREATE OR REPLACE TYPE example_type AS OBJECT
(
  nmber NUMBER,
  str   VARCHAR2(50),
  dt    DATE
);
CREATE OR REPLACE TYPE example_table IS TABLE OF example_type;

Bu scriptler ile type hazırlanmış oldu.Sıra geldi oluşturuan bu type ı kullanan bir function hazırlayama.Aşağıdaki script ile de function hazırlayabiliriz.

CREATE OR REPLACE FUNCTION example RETURN example_table IS
  RESULT example_table := example_table(example_type(NULL, NULL, NULL));

  CURSOR example_cursor IS
    SELECT rownum nmber,
           'Row' rw,
           SYSDATE dt
      FROM dual
    CONNECT BY rownum <= 10;

BEGIN

  FOR example_rec IN example_cursor LOOP

    RESULT(RESULT.LAST) := example_type(example_rec.nmber, example_rec.nmber || '.' || example_rec.rw, example_rec.dt);
    RESULT.EXTEND;
  END LOOP;

  RESULT.TRIM;
  RETURN(RESULT);

END;

Artık hem type hem de function umuz hazır. Şimdi de bunları bir sql ile kullanalım. Aşağıdaki gibi bir sql ile de type ve function kullanmış oluyoruz.

SELECT * FROM TABLE(CAST(example AS example_table));

Çalıştırdığımız sql in çıktısıda aşağıdaki gibi olacaktır.

Takip Et

Get every new post delivered to your Inbox.

Join 62 other followers