PL-SQL PACKAGES

Paketler, mantıksal olarak ilişkili PL/SQL tipleri, alt programları gruplayan şema nesneleridir. Paketler bize modüllerlik, kolay uygulama dizaynı, iyi performans avantajı sağlar.  Paketler iki bölümden oluşur

  • Specification (Spec)
  • 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.

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.

Sistemde bulunan paketlere örnek olarak DBMS_OUTPUT paketi verilebilir.

Peki neden package ihtiyaç duyarız mesela küçük sistemlerde oluşturduğunuz procedure ve function yapılarının kontrolü problem çıkarmayacaktır fakat büyük sistemlerde belki yüzlerce,binlerce function ,procedure ,varray ,record vb. bulunabilir, bu tür büyük sistemlerde kodları logical olarak bir araya toplamak ve kolay erişimi sağlamak amacı ile paketler kullanılır. Package’ın avantajları olarak ;

  • Kullanım kolaylığını sağlaması.
  • Uygulama dizaynını kolaylaştırmak.
  • Modülerliği sağlması.
  • Performans arttırması

sayılabilir.

ÖRNEK BİR PACKAGE YAPISI

SPECK

CREATE OR REPLACE PACKAGE personel AS
    FUNCTION get_fullname(n_emp_id NUMBER)
    RETURN VARCHAR2;
    FUNCTION get_salary(n_emp_id NUMBER)
    RETURN NUMBER;
END personel;

BODY KISMI

CREATE OR REPLACE PACKAGE BODY personel IS
-- get employee's fullname
    FUNCTION get_fullname(n_emp_id NUMBER) RETURN VARCHAR2 IS
        v_fullname VARCHAR2(46);
    BEGIN
        SELECT first_name || ',' || last_name  INTO v_fullname  
        FROM employees   WHERE employee_id = n_emp_id;
        RETURN v_fullname;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            RETURN NULL;
        WHEN TOO_MANY_ROWS THEN
            RETURN NULL;
    END; -- end get_fullname
-- get salary
    FUNCTION get_salary(n_emp_id NUMBER) RETURN NUMBER IS
    n_salary NUMBER(8,2);
    BEGIN
        SELECT salary INTO n_salary 
        FROM employees WHERE employee_id = n_emp_id;
    RETURN n_salary;
        EXCEPTION
            WHEN NO_DATA_FOUND THEN
                RETURN NULL;
            WHEN TOO_MANY_ROWS THEN
                RETURN NULL;
    END;
END personel;

Çalıştır:

declare
    v_name EMPLOYEES.FIRST_NAME%type;
    v_salary    EMPLOYEES.SALARY%type;
begin 
    v_name:=personel.get_fullname(100);
    v_salary:=personel.get_salary(100);
    dbms_output.put_line('personel adı : '||v_name);
    dbms_output.put_line('personle maaşı : '|| v_salary);
end;

ÇIKTI
personel adı : Steven,King
personle maaşı : 24000