Package olarak bahsettiğimiz yapılar çeşitli PL\SQL tiplerinin, fonksiyonların, procedure’leriin ve alt programcıkların toplandığı object’lerdir. Peki neden package ihtiyaç duyarız mesela küçük sistemlerde oluşturduğunuz procedure ve function yapılarının kontrolü çok büyük bir problem çıkarmayacaktır fakat büyük sistemlerde belki yüzlerce,binlerce function ,procedure ,varray ,record vs bulunabilir, bu tür büyük sistemlerde kodları mantıksal olarak bir araya toplamak ve kolay erişimi sağlamak amacı ile paketler kullanılır. Örnek vermek gerekirse bir bankada core finans için bir package, CRM için bir package, emeklilik sistemi için bir package gibi düşünebiliriz. Bu bilgilerden yola çıkarak package’ın avantajları olarak aşağıdakileri düşünebiliriz;

  • Kullanım kolaylığını sağlar.
  • Uygulama dizaynını kolaylaştırır.
  • Modülerliği sağlar.
  • Performansı artırır.

Paket yapılarının zorunlu olan iki alanı vardır.

  1. Specification
  2. Body

Specification : Package’in interface(arayüz)’i olarak düşünebilirsiniz. Paket içerisinde bulunan fonksiyon ve prosedürlerin içerik bilgisi haricinde sadece tipi ve aldığı parametreleri gördüğümüz kısımdır. Paket oluştururken ilk önce Spec kısmı oluşturulur.

CREATE PACKAGE cust_sal AS
   PROCEDURE find_sal(v_id hr.employees.employee_id%type);
END cust_sal;
/

Body : Paketin gövdesidir. Tüm tanımlamalar, fonksiyonlar ,prosedürler bu kısımda yazılır. Spec içerisinde tanımlanan yapıların içerikleri burada bulunur. Spec kısmı oluşturulan paketin body içeriğini aşağıdaki gibi oluştururuz.

CREATE OR REPLACE PACKAGE BODY cust_sal AS
   PROCEDURE find_sal(v_id hr.employees.employee_id%TYPE) IS
   v_sal hr.employees.salary%TYPE;
   BEGIN
      SELECT salary INTO v_sal FROM hr.employees WHERE id = v_id;
      dbms_output.put_line('Salary : '|| v_sal);
   END find_sal;
END v_sal;
/

Paketimizin spec ve body kısımlarını oluşturduktan sonra artık sıra paketi nasıl çağıracağımız konusuna geldi. Paket içerisinde tanımladığımız fonksiyon veya prosedür yapılarını çağırırken (.) operatörünü kullanırız.

DECLARE
   code hr.employees.employee_id%type := &cc_id;
BEGIN
   cust_sal.find_sal(code);
END;
/

Örnek;

CREATE OR REPLACE PACKAGE matematik IS
   FUNCTION toplama (p_sayi1 IN NUMBER, p_sayi2 IN NUMBER)
      RETURN NUMBER;

   FUNCTION carpma (p_sayi1 IN NUMBER, p_sayi2 IN NUMBER)
      RETURN NUMBER;

   PROCEDURE topla_ve_ekrana_yazdir (p_sayi1 IN NUMBER, p_sayi2 IN NUMBER);
END;
/

CREATE OR REPLACE PACKAGE BODY matematik IS
   PROCEDURE sonucu_ekrana_yazdir (p_sonuc IN NUMBER);

   FUNCTION toplama (p_sayi1 IN NUMBER, p_sayi2 IN NUMBER)
      RETURN NUMBER
   IS v_sonuc   NUMBER;
   BEGIN
      v_sonuc := p_sayi1 + p_sayi2;
	  RETURN v_sonuc;
   END;

   FUNCTION carpma (p_sayi1 IN NUMBER, p_sayi2 IN NUMBER)
      RETURN NUMBER
   IS v_sonuc   NUMBER;
   BEGIN
      v_sonuc := p_sayi1 * p_sayi2;
      RETURN v_sonuc;
   END;

   PROCEDURE topla_ve_ekrana_yazdir (p_sayi1 IN NUMBER, p_sayi2 IN NUMBER)
   IS v_sonuc   NUMBER;
   BEGIN
      v_sonuc := toplama (p_sayi1, p_sayi2);
      sonucu_ekrana_yazdir (v_sonuc);
   END;

   PROCEDURE sonucu_ekrana_yazdir (p_sonuc IN NUMBER) IS
   BEGIN
      DBMS_OUTPUT.put_line ('Sonuc : ' || p_sonuc);
   END;
END;
/

BEGIN
   matematik.topla_ve_ekrana_yazdir (3, 5);
END;
/

Yararlı olması Dilegiyle …
Yazar : Mustafa Bektaş Tepe

Kaynaklar;
http://www.tutorialspoint.com/plsql/plsql_basic_syntax.htm
https://developersdaily.wordpress.com
http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/
https://docs.oracle.com/cd/E11882_01/appdev.112/e40758/toc.htm
https://oracle-base.com/articles/misc/introduction-to-plsql

3,244 total views, 2 views today