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
Bir yanıt yazın