Özet: Veritabanında “package” kullanımı örneklerle anlatılıyor.

 

Oracle da paket (Package) olarak adlandırılan nesneler, birbiriyle ilişkili fonksiyon ve prosedürlerin bir isim altında gruplanmasıyla oluşturulur. Spec ve Body olarak iki bölümden oluşur. Spec kısmında paket içinde yer alan procedure/function ların kısaca tanımları ve eğer varsa parametreleri belirtilir. Body kısmında ise paket içinde yer alan plsql, prodecure/function ların kodları, içeriği yer alır.

PL/SQL paketleri sayesinde daha modüler programlar geliştirilebilir. Bir paket içerisindeki bir alt program çağrıldığında, tüm paket belleğe alınır ve bu paketle ilişkili diğer alt programlar bu sayede hızlı çalıştırılabilir.

PACKAGE paket_ismi IS
[değişkenlerin tanımlanması]
[cursor tanımlanması]
[modullerin tanımlanması]
END paket_ismi;

PACKAGE BODY paket_ismi IS
[değişkenlerin tanımlanması]
[select cümleciği ile cursor tanımlanması]
[modullerin içeriğinin tanımlanması]
[ BEGIN
dml işlemlerimiz]
[EXCEPTION
yakalanan hata tanımlamalarımız]
END paket_ismi;

Örnek 1)

Spec kısmı:

create or replace package paket1 as
procedure pro1;
function fonk1 return varchar2;
end paket1;
/

Body kısmı:

create or replace package body paket1 as
procedure pro1 is
begin
dbms_output.put_line('merhaba prosedür!');
end pro1;
function fonk1 return varchar2 is
begin
return ('merhaba fonksiyon!');
end fonk1;
end paket1;
/

3 farklı şekilde paket altındaki procedure veya fonskyionları çalıştırabiliriz;

exec paket1.pro1;
select paket1.fonk1 from dual;
declare
a varchar2(30);
begin
select paket1.fonk1 into a from dual;
dbms_output.put_line(a); 
end;

İhtiyaç durumunda başka bir user a bu paket için execute ve debug yetkisi verebiliriz;

grant execute on paket1 to ORHAN;
grant debug on paket1 to ORHAN;

Örnek -2)

CREATE OR REPLACE PACKAGE hasta_islem as
PROCEDURE hasta_kayit (hasta_id NUMBER, hasta_no NUMBER, hasta_adi VARCHAR2,klinik_id NUMBER);
PROCEDURE hasta_sil (hastaid NUMBER);
END hasta_islem;
/

CREATE OR REPLACE PACKAGE BODY hasta_islem as
PROCEDURE hasta_kayit (hasta_id NUMBER, hasta_no NUMBER, hasta_adi VARCHAR2,klinik_id NUMBER) IS
BEGIN
INSERT INTO hastalar2 VALUES (hasta_id, hasta_no, hasta_adi,klinik_id);
END hasta_kayit;
PROCEDURE hasta_sil (hastaid NUMBER) IS
BEGIN
DELETE FROM hastalar2 WHERE hasta_id = hastaid;
END hasta_sil;
END hasta_islem;
/

Aşağıdaki gibi paket altındaki procedure/function ları çalıştırabiliriz;

exec hasta_islem.hasta_kayit(85,787,'orhan',3);
exec hasta_islem.hasta_sil(85);