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 := 'yusufsezer@mail.com';
    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 := 'yusufsezer@mail.com';
    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 := 'yusufsezer@mail.com';
    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', 'yusufsezer@mail.com');  -- 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', 'yusufsezer@mail.com') );

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.

Yusuf SEZER

Yusuf SEZER

Computer Engineer who interested about web technologies, algorithms, artificial intelligence and embedded systems; constantly exploring new technologies.


Bunlara'da bakmalısın!