Başlangıç > Database, Forms, Oracle, PL/SQL, Reports > pl/sql de procedure, function overloading işlemi

pl/sql de procedure, function overloading işlemi


overloadMerhaba,

Overload işlemi nedir ve neden ihtiyaç duyarız bunlara biz göz atalım ve pl/sql ile procedure ve function overload işlemi için hazırladığım örnek package kodlarımızı inceleyelim. Tabi overload deyince de aklımıza hemen yan taraftaki resim gibi izlenim oluşmasın. Bizim yapacağımız işlem kendi kontrolümüzde olacak ve yan taraftakine benzer bir senaryoya dönüşmeyecek.

Normal şartlar altında overload işlemine ihtiyacımız olmaz. Ama bazı durumlarda overload yapmamız gerekiyor. Örnek topla diye bir fonksiyon hazırladığımızı varsayalım ve bu fonksiyon içerisine aldığı iki değeri toplayıp bize geriye toplam sonucu döndürsün. Bu işlem sonrasında tekrardan bir toplama işlemine ihtiyacımız olduğunda bu sefer iki değil 3 ya da 4 sayıyı toplayıp bize sonucu döndüren bir fonksiyona ihtiyacımız olduğunda tekrardan yeni bir isim ile bu işlemi yapan fonksiyonu yazacaktık. Bunun yerine tüm fonksiyonların adı topla olsun ve ben içeriye kaç parametre gönderirsem sistem ilgili fonksiyonu kendisi çağırıp bana sonucu döndürsün. Böyle bir işlem yapınca overload işlemini gerçekleştirmiş oluyoruz.

Şimdi artık hazırladığım package ı kontrol edip birden fazla olan overload yöntemlerini ve örneklerimizi kontrol edelim. Pl/Sql ile overload işleminin prosedür için iki farklı yöntemi vardır;

  1. Prosedür içine gönderilen parametrenin tipine göre
  2. Prosedür içine gönderilen parametrelerin sayısına göre.

Bu işlem fonksiyon için iki değil üç farklı yöntem ile yapılır ve ilk iki yöntem prosedür ile aynıdır . Bu yöntemler;

  1. Fonksiyon içine gönderilen parametrenin tipine göre
  2. Fonksiyon içine gönderilen parametrelerin sayısına göre
  3. Fonksiyonun dönüş tipine göre

Artık pl/sql ile overload işlemini nasıl yapacağımızı öğrendiğimize göre örneklere geçebiliriz sanırım. Öncelikle package kodlarımızı ekleyelim ve sonrasında da bu package kullanımı ile örnek sonuçlarımızı kontrol edelim.
[Package Spec]

create or replace package OverloadExample is

  -- Author  : Samet ÇELİKBIÇAK
  -- Created : 08.06.2013 20:24:42
  -- Purpose : Procedure ve function Overload işlemi örnekleri

  type OverloadType is record(
    pVarchar varchar2(100),
    pNumber  number(12),
    pDate    date);

  /*
  || Procedure Overload işlemleri
  || Aşağıdaki örnekler parametre sayıları ve yerleri değiştirilerek çoğaltılabilinir.
  */
  procedure ProcedureDegerver;
  /*--------------------------------------------------*/
  procedure ProcedureDegerver(pNumber in number);
  /*--------------------------------------------------*/
  procedure ProcedureDegerver(pVarchar in varchar2);
  /*--------------------------------------------------*/
  procedure ProcedureDegerver(pDate in date);
  /*--------------------------------------------------*/
  procedure ProcedureDegerver(pBoolean in boolean);
  /*--------------------------------------------------*/
  procedure ProcedureDegerver(pType in OverloadType);
  /*--------------------------------------------------*/
  procedure ProcedureDegerver(pNumber in number, pVarchar in varchar2,
                              pDate in date, pType in OverloadType);

  /*
  || Function Overload işlemleri
  || Aşağıdaki örnekler parametre sayıları ve yerleri değiştirilerek çoğaltılabilinir.
  */
  function FunctionDegerver return number;
  /*--------------------------------------------------*/
  function FunctionDegerver return varchar2;
  /*--------------------------------------------------*/
  function FunctionDegerver return date;
  /*--------------------------------------------------*/
  function FunctionDegerver return boolean;
  /*--------------------------------------------------*/
  function FunctionDegerver return OverloadType;
  /*--------------------------------------------------*/
  function FunctionDegerver(pNumber in number) return number;
  /*--------------------------------------------------*/
  function FunctionDegerver(pVarchar in varchar2) return varchar2;
  /*--------------------------------------------------*/
  function FunctionDegerver(pDate in date) return date;
  /*--------------------------------------------------*/
  function FunctionDegerver(pBoolean in boolean) return boolean;
  /*--------------------------------------------------*/
  function FunctionDegerver(pType in OverloadType) return OverloadType;
  /*--------------------------------------------------*/
  function FunctionDegerver(pNumber in number, pVarchar in varchar2,
                            pDate in date) return varchar2;
end OverloadExample;

Package spec kısmındaki açıklama ve örnek kodlardan da anlaşılcağı gibi hem prosedür hemde fonksiyon için overload işlemini hazırladık. Dikkat ettiyseniz hem prosedür isimleri aynı fakat parametre sayıları ve tipleri farklı aynı şekilde fonksiyon isimleri de aynı ve parametre sayıları, tipleri ve dönüş tipleri farklı. Artık package spec kısmı bize kodlar hakkında bilgi verdiğine göre pakcage body kısmını da görelim ve inceleyelim.
[Package Body]

create or replace package body OverloadExample is

  /*
  || Procedure Overload işlemleri
  || Aşağıdaki örnekler parametre sayıları ve yerleri değiştirilerek çoğaltılabilinir.
  */
  procedure ProcedureDegerver is
  begin
    dbms_output.put_line('ProcedureDegerver');
  end;
  /*--------------------------------------------------*/
  procedure ProcedureDegerver(pNumber in number) is
  begin
    dbms_output.put_line('ProcedureDegerver(pNumber in number) :pNumber:' ||
                         pNumber);
  end;
  /*--------------------------------------------------*/
  procedure ProcedureDegerver(pVarchar in varchar2) is
  begin
    dbms_output.put_line('ProcedureDegerver(pVarchar in varchar2) :pVarchar:' ||
                         pVarchar);
  end;
  /*--------------------------------------------------*/
  procedure ProcedureDegerver(pDate in date) is
  begin
    dbms_output.put_line('ProcedureDegerver(pDate in date) :pDate:' ||
                         pDate);
  end;
  /*--------------------------------------------------*/
  procedure ProcedureDegerver(pBoolean in boolean) is
  begin
    if pBoolean then
      dbms_output.put_line('ProcedureDegerver(pBoolean in boolean) :True');
    else
      dbms_output.put_line('ProcedureDegerver(pBoolean in boolean) :False');
    end if;
  end;
  /*--------------------------------------------------*/
  procedure ProcedureDegerver(pType in OverloadType) is
  begin
    dbms_output.put_line('ProcedureDegerver(pType in OverloadType) :' ||
                         chr(10) || 'pType.pVarchar:' || pType.pVarchar ||
                         chr(10) || 'pType.pNumber:' || pType.pNumber ||
                         chr(10) || 'pType.pDate:' || pType.pDate);
  end;
  /*--------------------------------------------------*/
  procedure ProcedureDegerver(pNumber in number, pVarchar in varchar2,
                              pDate in date, pType in OverloadType) is
  begin
    dbms_output.put_line('ProcedureDegerver(pNumber in number, pVarchar in varchar2, pDate in date,
                         pType in OverloadType) :' ||
                         chr(10) || 'pNumber:' || pNumber || chr(10) ||
                         'pVarchar:' || pVarchar || chr(10) || 'pDate:' ||
                         pDate || chr(10) || 'pType.pVarchar:' ||
                         pType.pVarchar || chr(10) || 'pType.pNumber:' ||
                         pType.pNumber || chr(10) || 'pType.pDate:' ||
                         pType.pDate);
  end;

  /*
  || Function Overload işlemleri
  || Aşağıdaki örnekler parametre sayıları ve yerleri değiştirilerek çoğaltılabilinir.
  */
  function FunctionDegerver return number is
  begin
    dbms_output.put_line('FunctionDegerver return number');
    return(0);
  end;
  /*--------------------------------------------------*/
  function FunctionDegerver return varchar2 is
  begin
    dbms_output.put_line('FunctionDegerver return varchar2');
    return('0');
  end;
  /*--------------------------------------------------*/
  function FunctionDegerver return date is
  begin
    dbms_output.put_line('FunctionDegerver return date');
    return(sysdate);
  end;
  /*--------------------------------------------------*/
  function FunctionDegerver return boolean is
  begin
    dbms_output.put_line('FunctionDegerver return boolean');
    return(true);
  end;
  /*--------------------------------------------------*/
  function FunctionDegerver return OverloadType is
    pType OverloadType;
  begin
    pType.pVarchar := 'FunctionDegerver return OverloadType';
    pType.pNumber  := 0;
    pType.pDate    := sysdate;
    dbms_output.put_line('FunctionDegerver return OverloadType');
    return(pType);
  end;
  /*--------------------------------------------------*/
  function FunctionDegerver(pNumber in number) return number is
  begin
    dbms_output.put_line('FunctionDegerver(pNumber in number) :pNumber:' ||
                         pNumber);
    return(pNumber);
  end;
  /*--------------------------------------------------*/
  function FunctionDegerver(pVarchar in varchar2) return varchar2 is
  begin
    dbms_output.put_line('FunctionDegerver(pVarchar in varchar2) :pVarchar:' ||
                         pVarchar);
    return(pVarchar);
  end;
  /*--------------------------------------------------*/
  function FunctionDegerver(pDate in date) return date is
  begin
    dbms_output.put_line('FunctionDegerver(pDate in date) :pDate:' ||
                         pDate);
    return(pDate);
  end;
  /*--------------------------------------------------*/
  function FunctionDegerver(pBoolean in boolean) return boolean is
  begin
    if pBoolean then
      dbms_output.put_line('FunctionDegerver(pBoolean in boolean) :True');
    else
      dbms_output.put_line('FunctionDegerver(pBoolean in boolean) :False');
    end if;
    return(pBoolean);
  end;
  /*--------------------------------------------------*/
  function FunctionDegerver(pType in OverloadType) return OverloadType is
  begin
    dbms_output.put_line('FunctionDegerver(pType in OverloadType) :' ||
                         chr(10) || 'pType.pVarchar:' || pType.pVarchar ||
                         chr(10) || 'pType.pNumber:' || pType.pNumber ||
                         chr(10) || 'pType.pDate:' || pType.pDate);
    return(pType);
  end;
  /*--------------------------------------------------*/
  function FunctionDegerver(pNumber in number, pVarchar in varchar2,
                            pDate in date) return varchar2 is
  begin
    dbms_output.put_line('FunctionDegerver(pNumber in number, pVarchar in varchar2, pDate in date) :' ||
                         chr(10) || 'pNumber:' || pNumber || chr(10) ||
                         'pVarchar:' || pVarchar || chr(10) || 'pDate:' || pDate);
    return('FunctionDegerver(pNumber in number, pVarchar in varchar2, pDate in date)');
  end;

end OverloadExample;

Package body içeriğini de gördüğümüze göre şimdi kotnrollerimizi yapabiliriz.Tüm prosedür ve fonksiyonları test edebilmek için aşağıdaki declare bloğu işimizi görecektir.
[Declare Bloğu]

declare
  pOverloadType    OverloadExample.OverloadType;
  pOverloadNumber  number;
  pOverloadVarchar varchar2(100);
  pOverloadDate    date;
  pOverloadBoolean boolean;
begin
  pOverloadType.pVarchar := 'Test Type';
  pOverloadType.pNumber  := '99';
  pOverloadType.pDate    := sysdate;

  dbms_output.put_line('-----------------------------------------------');
  dbms_output.put_line('/* Procedure Overload örnek kullanımları */');
  dbms_output.put_line('-----------------------------------------------');

  OverloadExample.ProcedureDegerver;
  dbms_output.put_line('-----------------------------------------------');
  OverloadExample.ProcedureDegerver(pNumber => 0);
  dbms_output.put_line('-----------------------------------------------');
  OverloadExample.ProcedureDegerver(pVarchar => 'Test 0');
  dbms_output.put_line('-----------------------------------------------');
  OverloadExample.ProcedureDegerver(pDate => sysdate);
  dbms_output.put_line('-----------------------------------------------');
  OverloadExample.ProcedureDegerver(pBoolean => true);
  dbms_output.put_line('-----------------------------------------------');
  OverloadExample.ProcedureDegerver(pType => pOverloadType);
  dbms_output.put_line('-----------------------------------------------');
  OverloadExample.ProcedureDegerver(pNumber => 1, pVarchar => 'Test',
                                    pDate => sysdate, pType => pOverloadType);

  dbms_output.put_line('-----------------------------------------------');
  dbms_output.put_line('/* Function Overload örnek kullanımları */');
  dbms_output.put_line('-----------------------------------------------');

  pOverloadNumber := OverloadExample.FunctionDegerver(pNumber => 1);
  dbms_output.put_line('-----------------------------------------------');
  pOverloadVarchar := OverloadExample.FunctionDegerver(pVarchar => 'Test 1');
  dbms_output.put_line('-----------------------------------------------');
  pOverloadDate := OverloadExample.FunctionDegerver(pDate => sysdate);
  dbms_output.put_line('-----------------------------------------------');
  pOverloadBoolean := OverloadExample.FunctionDegerver(pBoolean => false);
  dbms_output.put_line('-----------------------------------------------');
  pOverloadType := OverloadExample.FunctionDegerver(pType => pOverloadType);
  dbms_output.put_line('pOverloadType :' || pOverloadType.pVarchar || '-' ||
                       pOverloadType.pNumber || '-' || pOverloadType.pDate);
  dbms_output.put_line('-----------------------------------------------');
  pOverloadNumber := OverloadExample.FunctionDegerver(pNumber => 2);
  dbms_output.put_line('-----------------------------------------------');
  pOverloadVarchar := OverloadExample.FunctionDegerver(pVarchar => 'Test 2');
  dbms_output.put_line('-----------------------------------------------');
  pOverloadDate := OverloadExample.FunctionDegerver(pDate => sysdate);
  dbms_output.put_line('-----------------------------------------------');
  pOverloadBoolean := OverloadExample.FunctionDegerver(pBoolean => false);
  dbms_output.put_line('-----------------------------------------------');
  pOverloadType := OverloadExample.FunctionDegerver(pType => pOverloadType);
  dbms_output.put_line('-----------------------------------------------');
  pOverloadVarchar := OverloadExample.FunctionDegerver(pNumber => 1,
                                                       pVarchar => 'Test',
                                                       pDate => sysdate);
end;

Evet görüldüğü gibi artık tüm prosedür ve fonksiyonları overload işlemi ile kullanmış olduk. Bu kullanım sonrasında ise bizim için aşağıdaki gibi bir çıktı sonucu oluşacaktır.
[Declare Bloğu Çıktısı]

-----------------------------------------------
/* Procedure Overload örnek kullanımları */
-----------------------------------------------
ProcedureDegerver
-----------------------------------------------
ProcedureDegerver(pNumber in number) :pNumber:0
-----------------------------------------------
ProcedureDegerver(pVarchar in varchar2) :pVarchar:Test 0
-----------------------------------------------
ProcedureDegerver(pDate in date) :pDate:06/07/2013
-----------------------------------------------
ProcedureDegerver(pBoolean in boolean) :True
-----------------------------------------------
ProcedureDegerver(pType in OverloadType) :
pType.pVarchar:Test Type
pType.pNumber:99
pType.pDate:06/07/2013
-----------------------------------------------
ProcedureDegerver(pNumber in number, pVarchar in varchar2, pDate in date,
                         pType in OverloadType) :
pNumber:1
pVarchar:Test
pDate:06/07/2013
pType.pVarchar:Test Type
pType.pNumber:99
pType.pDate:06/07/2013
-----------------------------------------------
/* Function Overload örnek kullanımları */
-----------------------------------------------
FunctionDegerver(pNumber in number) :pNumber:1
-----------------------------------------------
FunctionDegerver(pVarchar in varchar2) :pVarchar:Test 1
-----------------------------------------------
FunctionDegerver(pDate in date) :pDate:06/07/2013
-----------------------------------------------
FunctionDegerver(pBoolean in boolean) :False
-----------------------------------------------
FunctionDegerver(pType in OverloadType) :
pType.pVarchar:Test Type
pType.pNumber:99
pType.pDate:06/07/2013
pOverloadType :Test Type-99-06/07/2013
-----------------------------------------------
FunctionDegerver(pNumber in number) :pNumber:2
-----------------------------------------------
FunctionDegerver(pVarchar in varchar2) :pVarchar:Test 2
-----------------------------------------------
FunctionDegerver(pDate in date) :pDate:06/07/2013
-----------------------------------------------
FunctionDegerver(pBoolean in boolean) :False
-----------------------------------------------
FunctionDegerver(pType in OverloadType) :
pType.pVarchar:Test Type
pType.pNumber:99
pType.pDate:06/07/2013
-----------------------------------------------
FunctionDegerver(pNumber in number, pVarchar in varchar2, pDate in date) :
pNumber:1
pVarchar:Test
pDate:06/07/2013

regular

Sonunda paketimizi hazırladık ve test işlemimizi yaparak sonuçlarını gördük. Basit bir şekilde bu kodları inceleyerek öğrendiğiniz overload işlemini artık sizde ihtiyacınız olduğu zaman rahatlıkla kullanabilirsiniz. Eğer overload nedir nasıl kullanılır tam olarak bilmez ve bu şekilde kullanmaya karar verirsek makalenin ilk başında eklediğim overload görselindeki durumdan farklı bir durum ortaya çıkmaz. Kargaşa kaos ortamı oluşur , kodlarımız takip edemeyiz doğru bir işlem elde etmeyi beklerken yanlış ve hatalı sonuçlar elde edebiliriz. Fakat overload nedir ve nasıl kullanır kısmını iyi irdeleyip öğrenerek kullanırsak sol taraftaki resimde olduğu gibi gayet basit düzenli bir sonuç elede ederiz ve hangi kodumuz ne işey yarıyor rahatlıkla takip edebiliriz.

Kolay gelsin.

  1. Henüz yorum yapılmamış.
  1. No trackbacks yet.

Yorum bırakın

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.