PL/SQL OOP
Oracle PL/SQL ile OOP veya NYP yöntemine göre geliştirme de kullanılan attributes, methods, procedures, constructor, static, inheritance, abstract ile ilgili bilgiler yer alıyor.
OOP
OOP (Object Oriented Programming) veya NYP (Nesne Yönelimli Programlama) temel olarak geliştirilen uygulamaya ait komutların daha anlaşılabilir olması için kullanılan programlama paradigmasıdır-yöntemidir.
NYP özellikleri;
- Encapsulation (Kapsülleme) – Sınıf içerisinde yer alan özellik ve metotların bir isim altında saklanmasını sağlar.
- Inheritance (Kalıtım) – Sınıfların kalıtım alınarak genişletilebilir olmasını sağlar.
- Polymorphism (Çok biçimlilik) – Sınıflara kalıtım aldıkları sınıfın referansıyla erişimi sağlar.
NYP uzun yıllar C++, Java, C# gibi bir çok programlama dilinde kullanılmaktadır.
PL/SQL OOP
Oracle PL/SQL NYP yöntemine göre geliştirme yapmayı sağlar.
PL/SQL ile nesnelerin tanımlandığı-tarif edildiği yapıya sınıf (class) denir ve aşağıdaki gibi tanımlanır.
CREATE OR REPLACE TYPE kisi AS OBJECT (
-- özellik tanımları
-- prosedür-metot tanımları
) NOT FINAL; -- Sınıf nitelelikleri
Tanımlar yapıldıktan sonra BODY kısmında prosedür, fonksiyon gibi yapıların içeriği yazılır.
CREATE OR REPLACE TYPE BODY kisi AS
-- prosedür-metot komutları
END;
Tanımlanan sınıf kullanıcı tanımlı veri türleri, paketler gibi kullanılabilir.
DECLARE
v_yusuf kisi;
BEGIN
-- v_yusuf.ozellik
-- v_yusuf.metot()
END;
NOT: PL/SQL sınıf tanımı paket tanımına benzer.
Attributes
Sınıf içerisinde yer alan değişkenler özellik veya nitelik olarak adlandırılır.
CREATE OR REPLACE TYPE kisi AS OBJECT (
kisi_sira NUMBER,
kisi_adi VARCHAR2(100),
kisi_soyadi VARCHAR2(100),
kisi_eposta VARCHAR2(80)
);
Özellikler aşağıdaki gibi kullanılır.
SET SERVEROUTPUT ON;
DECLARE
v_yusuf kisi := new kisi(null, null, null, null);
BEGIN
v_yusuf.kisi_sira := 1;
v_yusuf.kisi_adi := 'Yusuf';
v_yusuf.kisi_soyadi := 'SEZER';
v_yusuf.kisi_eposta := '[email protected]';
DBMS_OUTPUT.put_line(v_yusuf.kisi_sira);
DBMS_OUTPUT.put_line(v_yusuf.kisi_adi);
DBMS_OUTPUT.put_line(v_yusuf.kisi_soyadi);
DBMS_OUTPUT.put_line(v_yusuf.kisi_eposta);
END;
Methods ve Procedures
PL/SQL sınıf içerisinde yer alan fonksiyonlara metot denir.
Metot ve prosedür içerisinde nesne ile ilgili işlemler yer alır.
CREATE OR REPLACE TYPE kisi AS OBJECT (
kisi_sira NUMBER,
kisi_adi VARCHAR2(100),
kisi_soyadi VARCHAR2(100),
kisi_eposta VARCHAR2(80),
MEMBER PROCEDURE YAZDIR,
MEMBER FUNCTION ADSOYAD RETURN VARCHAR2
);
Tanımlanan prosedür ve metot içeriği BODY içerisine yazılır.
CREATE OR REPLACE TYPE BODY kisi AS
MEMBER PROCEDURE YAZDIR IS
BEGIN
DBMS_OUTPUT.put_line(SELF.kisi_sira);
DBMS_OUTPUT.put_line(SELF.kisi_adi);
DBMS_OUTPUT.put_line(SELF.kisi_soyadi);
DBMS_OUTPUT.put_line(SELF.kisi_eposta);
END;
MEMBER FUNCTION ADSOYAD RETURN VARCHAR2 IS
BEGIN
RETURN SELF.kisi_adi || ' ' || SELF.kisi_soyadi;
END;
END;
NOT: SELF anahtar kelimesi sınıf içerisindeki özellik, metot ve prosedürlere ulaşmak için kullanılır.
SET SERVEROUTPUT ON;
DECLARE
v_yusuf kisi := new kisi(null, null, null, null);
BEGIN
v_yusuf.kisi_sira := 1;
v_yusuf.kisi_adi := 'Yusuf';
v_yusuf.kisi_soyadi := 'SEZER';
v_yusuf.kisi_eposta := '[email protected]';
DBMS_OUTPUT.put_line('Kişi adı soyadı: ' || v_yusuf.ADSOYAD());
v_yusuf.YAZDIR;
END;
Constructor
Nesne oluşturulurken çalıştırılan metot constructor veya kurucu olarak adlandırılır.
Oracle PL/SQL varsayılan olarak tüm özelliklere değer atayan kurucuya sahiptir.
Kurucuların metotlardan bir farkı yoktur.
Kurucuları özel yapan nesne oluşturulduğunda otomatik olarak çalıştırılmasıdır.
Kurucu içerisinde genellikle sınıf içerisinde yer alan özelliklere değer atanır.
Örnek kurucu kullanımı aşağıda yer almaktadır.
SET SERVEROUTPUT ON;
DECLARE
v_yusuf kisi := new kisi(null, null, null, null); -- Kurucu ile değerlere NULL değeri atandı.
BEGIN
v_yusuf.kisi_sira := 1;
v_yusuf.kisi_adi := 'Yusuf';
v_yusuf.kisi_soyadi := 'SEZER';
v_yusuf.kisi_eposta := '[email protected]';
DBMS_OUTPUT.put_line('Kişi adı soyadı: ' || v_yusuf.ADSOYAD());
v_yusuf.YAZDIR;
END;
Örnek kurucu kullanımı aşağıda yer almaktadır.
SET SERVEROUTPUT ON;
DECLARE
v_yusuf kisi := new kisi(1, 'Yusuf', 'SEZER', '[email protected]'); -- Kurucu ile özelliklere değer atandı.
BEGIN
DBMS_OUTPUT.put_line('Kişi adı soyadı: ' || v_yusuf.ADSOYAD());
v_yusuf.YAZDIR;
END;
Kurucular varsayılan olarak Oracle PL/SQL tarafından oluşturulduğu için tekrar tanımlamaya ihtiyaç yoktur.
Ancak farklı bir kurucu tanımlaması için aşağıdaki kurucu metot imzası kullanılabilir.
CONSTRUCTOR FUNCTION SINIF_ADI(PARAMETRE1, PARAMETRE2) RETURN SELF AS RESULT DETERMINISTIC;
NOT: Kurucuları görevinin dışında kullanmak tavsiye edilmez.
Map ve Order
Nesneler varsayılan olarak birbiriyle karşılaştırılmaz.
PL/SQL nesneleri karşılaştırma operatörüyle kullanmak için map ve order anahtar kelimeleri kullanır.
Örnek kullanım aşağıdaki gibidir.
MAP MEMBER FUNCTION KARSILASTIR RETURN NUMBER
Metot içeriği aşağıdaki gibidir.
MAP MEMBER FUNCTION KARSILASTIR RETURN NUMBER IS
BEGIN
RETURN SELF.kisi_sira;
END;
Tanımlama sonrası nesne PL/SQL içerisinde yer alan karşılaştırma operatörleri kullanılarak karşılaştırılabilir.
Yukarıdaki tanımlamada karşılaştırma işlemi için sınıf içerisinde yer alan kisi_sira özelliği kullanılmıştır.
Static
Nesne oluşturmadan kullanılabilen metot ve prosedürlere statik metot ve prosedür denir.
Statik metot ve prosedürler STATIC anahtar kelimesi ile tanımlanırlar.
CREATE OR REPLACE TYPE kisi AS OBJECT (
kisi_sira NUMBER,
kisi_adi VARCHAR2(100),
kisi_soyadi VARCHAR2(100),
kisi_eposta VARCHAR2(80),
MEMBER PROCEDURE YAZDIR,
MEMBER FUNCTION ADSOYAD RETURN VARCHAR2,
MAP MEMBER FUNCTION KARSILASTIR RETURN NUMBER,
STATIC PROCEDURE YAZDIR2(METIN IN VARCHAR2) -- Statik prosedür tanımı
);
Prosedür içeriği aşağıda yer almaktadır.
CREATE OR REPLACE TYPE BODY kisi AS
MEMBER PROCEDURE YAZDIR IS
BEGIN
kisi.YAZDIR2(SELF.kisi_sira); -- Statik metot sınıfadı.metot olarak çağrıldı.
kisi.YAZDIR2(SELF.kisi_adi);
kisi.YAZDIR2(SELF.kisi_soyadi);
kisi.YAZDIR2(SELF.kisi_eposta);
END;
MEMBER FUNCTION ADSOYAD RETURN VARCHAR2 IS
BEGIN
RETURN SELF.kisi_adi || ' ' || SELF.kisi_soyadi;
END;
MAP MEMBER FUNCTION KARSILASTIR RETURN NUMBER IS
BEGIN
RETURN SELF.kisi_sira;
END;
STATIC PROCEDURE YAZDIR2(METIN IN VARCHAR2) IS
BEGIN
DBMS_OUTPUT.put_line(METIN);
END;
END;
NOT: Statik metot ve prosedürler sınıf içerisinde yer alan özellik ve metotlara erişemez.
Inheritance
Sınıf içerisinde yer alan özellik ve metotların başka sınıf tarafından devralınmasıdır.
PL/SQL sınıflarının kalıtım özelliğini kullanabilmesi için NOT FINAL ile belirtilmesi gerekir.
CREATE OR REPLACE TYPE kisi AS OBJECT () NOT FINAL; -- Kalıtım
Kalıtım almak için UNDER anahtar kelimesi kullanılır.
CREATE OR REPLACE TYPE ogrenci UNDER kisi () NOT FINAL;
Sınıf içerisinde yer alan prosedür ve metotlara NOT FINAL anahtar kelimesi eklenerek prosedür ve metotların ezilmesi sağlanır.
Kalıtım ile alınan prosedür ve metotların ezilmesi için kalıtım alan sınıfta metodun başına OVERRIDING anahtar kelimesi eklenir.
NOT: Ezme işlemi prosedür ve metotların içeriği değiştirilmek istendiğinde kullanılır.
Abstract
Sınıflardan örnek bir nesne oluşturulmasına izin verilmeyen sınıflara soyut sınıf (Abstract) denir.
Soyut sınıflar nesneleri modellemek için kullanılır.
Bir sınıfı soyut sınıf olarak belirlemek için NOT INSTANTIABLE anahtar kelimesi kullanılır.
CREATE OR REPLACE TYPE insan AS OBJECT () NOT INSTANTIABLE NOT FINAL; -- Soyut sınıf ve kalıtım
Sınıfları tablolarda kullanmak
PL/SQL içerisinde yer alan sınıfların önemli bir özelliği tablolarda kullanılmasıdır.
CREATE TABLE KISILER (
KISI KISI
);
Tabloya veri ekleme işlemi aşağıdaki gibi yapılabilir.
INSERT INTO KISILER VALUES ( new kisi(1, 'Yusuf', 'SEZER', '[email protected]') );
Tabloya eklenen veriye aşağıdaki gibi erişim sağlanabilir.
DECLARE
v_bulunan kisi;
BEGIN
SELECT * INTO v_bulunan FROM KISILER WHERE ROWNUM = 1;
v_bulunan.YAZDIR;
END;
Benzer şekilde UPDATE ve DELETE işlemleri de yapılabilir.
Polymorphism
Kalıtım alınan sınıflara taban sınıf ile erişmeyi sağlar.
Insan sınıfından kalıtım almış Ogrenci, Ogretmen, Calisan gibi sınıflar olduğunu varsayalım.
Çok biçimlilik sayesinde bu sınıflara taban sınıf olan Insan sınıfının referansıyla erişilir.
Yani Ogrenci sınıfına Ogrenci olarak değil Insan olarak erişmek,
Ogremeten sınıfına Ogretmen olarak değil Insan olarak erişmek örnek olarak verilebilir.
Sonuç
Oracle PL/SQL NYP özelliği;
- Komutların daha anlaşılır olmasını sağlar.
- Uygulamaların Records gibi düzenli bir şekilde saklanmasını sağlar.
- Tekrar kullanılabilirliği arttırır.
- Kalıtım ile genişletilebilir olmasını sağlar.
NYP yöntemi ile geliştirmeyi C++, Java, C# gibi programlama dillerinde öğrenmek faydalı olacaktır.
PL/SQL Derslerine buradan ulaşabilirsiniz.
Hayırlı günler dilerim.