Oracle ÖRNEKLERLE PL/SQL Nesne Türleri Eğitimi
PL/SQL'de Nesne Türü Nedir?
Nesne Yönelimli Programlama, özellikle yeniden kullanılabilir bileşenler ve karmaşık uygulamalar oluşturmak için uygundur. "Eylemler" yerine "nesneler" etrafında düzenlenirler, yani programlar tek bir eylem yerine tüm nesneyle çalışmak ve etkileşim kurmak üzere tasarlanmıştır. Bu kavram, programcının ayrıntıları nesne varlıkları düzeyinde doldurmasına ve değiştirmesine olanak tanır.
Aşağıdaki resim, bir banka hesabının bir nesne varlığı olarak kabul edildiği nesne türünün bir örneğini göstermektedir. Nesne öznitelikleri, örneğin Banka Hesabındaki gibi bazı öznitelik değerlerine sahip olan şeyleri içerir; Hesap numarası, banka bakiyesi vb. iken nesne yöntemleri, faiz oranının hesaplanması, banka ekstresi oluşturulması vb. gibi belirli işlemlerin tamamlanmasını gerektiren şeyleri tanımlar.
PL/SQL'de nesne yönelimli programlama nesne türlerine dayanır.
Bir nesne türü, gerçek dünyadaki herhangi bir varlığı temsil edebilir. Bu bölümde daha fazla nesne türünü tartışacağız.
Nesne Türlerinin Bileşenleri
PL / SQL nesne türü temel olarak iki bileşen içerir.
- Özellikler
- Üyeler/Yöntemler
Özellikler
Nitelikler, verilerin depolandığı sütun veya alandır. Her öznitelik, o özniteliğin işleme ve depolama türünü tanımlayan veri türüyle eşlenecektir. Özellik herhangi bir geçerli olabilir PL/SQL veri türüveya başka bir nesne türünde olabilir.
Üyeler/Yöntemler
Üyeler veya Yöntemler, nesne türünde tanımlanan alt programlardır. Herhangi bir veriyi depolamak için kullanılmazlar. Esas olarak nesne türü içindeki süreci tanımlamak için kullanılırlar. Örnekler için, nesne türünü doldurmadan önce verileri doğrulama. Nesne türü bölümünde bildirilir ve nesne türünün nesne türü gövdesi bölümünde tanımlanırlar. Obje tipindeki gövde bölümü opsiyonel bir parçadır. Hiçbir üye mevcut değilse, nesne türü hiçbir gövde parçası içermeyecektir.
İçinde Nesne Oluştur Oracle
Nesne türü alt program düzeyinde oluşturulamaz, yalnızca şema düzeyinde oluşturulabilir. Nesne türü şemada tanımlandıktan sonra aynısı alt programlarda da kullanılabilir. Nesne türü 'CREATE TYPE' kullanılarak oluşturulabilir. Tip gövdesi ancak nesne tipi oluşturulduktan sonra oluşturulabilir.
CREATE TYPE<object_type_name> AS OBJECT ( <attribute_l><datatype>, . . ); / CREATE TYPE BODY<object_type_name> AS OBJECT ( MEMBER[PROCEDURE|FUNCTION]<member_name> IS <declarative section> BEGIN <execution part> END; . . ); /
Sözdizimi Açıklaması:
- Yukarıdaki sözdizimi, niteliklerle 'OBJECT'in ve yöntemlerle 'OBJECT-BODY'nin oluşturulmasını gösterir.
- Yöntemler nesne gövdesinde de aşırı yüklenebilir.
Nesne Tipinin Bildirgenin Başlatılması
PL/SQL'deki diğer bileşenler gibi nesne türlerinin de programda kullanılmadan önce bildirilmesi gerekir.
Nesne türü oluşturulduktan sonra, alt program bildirim bölümünde o nesne türünün bir değişkenini bildirmek için kullanılabilir.
Alt programda nesne türü olarak herhangi bir değişken bildirildiğinde, çalışma zamanında nesne türünün yeni bir örneği oluşturulacak ve bu yeni oluşturulan örnek, değişken adı olarak adlandırılabilir. Bu sayede tek bir nesne tipi, farklı örnekler altında birden fazla değeri saklayabilir.
DECLARE <variable_name> <object_type_name>; BEGIN . . END; /
Sözdizimi Açıklaması:
- Yukarıdaki sözdizimi, bildirim bölümünde bir değişkenin nesne türü olarak bildirimini gösterir.
Değişken bir alt programda nesne türü olarak tanımlandığında, atomik olarak null olacaktır, yani tüm nesnenin kendisi null olacaktır. Programda kullanmak için değerlerle başlatılması gerekir. Oluşturucular kullanılarak başlatılabilirler.
Yapıcılar, nesne türüyle aynı adla adlandırılabilen bir nesnenin örtülü yöntemidir. Aşağıdaki sözdizimi nesne türünün başlatılmasını gösterir.
DECLARE <variable_name> <object_type_name>; BEGIN <variable_name>:=<object_type_name>(); END; /
Sözdizimi Açıklaması:
- Yukarıdaki sözdizimi, nesne türü örneğinin boş bir değerle başlatılmasını gösterir.
- Artık nesnenin kendisi başlatıldığı haliyle null değil, ancak nesnenin içindeki nitelikler, bu niteliklere herhangi bir değer atamadığımız için null olacaktır.
Kurucular
Yapıcılar, nesne türüyle aynı adla adlandırılabilen bir nesnenin örtülü yöntemidir. Nesneye ilk kez başvurulduğunda bu yapıcı dolaylı olarak çağrılacaktır.
Bu yapıcıyı kullanarak nesneleri de başlatabiliriz. Yapıcı, nesne türü gövdesindeki üyeyi nesne türüyle aynı adla tanımlayarak açıkça tanımlanabilir.
Örnek 1: Aşağıdaki örnekte, nesne türü üyesini kullanarak kaydı emp tablosuna ('RRR', 1005, 20000, 1000) ve ('PPP', 1006, 20000, 1001) değerleriyle ekleyeceğiz. Veri eklendikten sonra, nesne türü üyesini kullanarak aynı şeyi göstereceğiz. Ayrıca, ikinci kayıt için yönetici kimliğini varsayılan olarak 1001 değeriyle doldurmak için açık oluşturucuyu kullanacağız.
Bunu aşağıdaki adımlarla uygulayacağız.
- Step1:
- Nesne türü oluştur
- Nesne türü gövdesi
- Adım 2: emp_no 1005 için örtülü yapıcı aracılığıyla oluşturulan nesne türünü çağırmak üzere anonim bir blok oluşturma.
- Adım 3: emp_no 1006 için açık yapıcı aracılığıyla oluşturulan nesne türünü çağırmak üzere anonim bir blok oluşturma.
) 1 Adım Nesne türü ve Nesne türü gövdesi oluşturun
CREATE TYPE emp_object AS OBJECT( emp_no NUMBER, emp_name VARCHAR2(50), salary NUMBER, manager NUMBER, CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER, p_emp_name VARCHAR2, p_salary NUMBER) RETURN SELF AS RESULT), MEMBER PROCEDURE insert_records, MEMBER PROCEDURE display_records); /
CREATE OR REPLACE TYPE BODY emp_object AS CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER,p_emp_name VARCHAR2, p_salary NUMBER) RETURN SELF AS RESULT IS BEGIN Dbms_output.put_line(’Constructor fired..'); SELF.emp_no:=p_emp_no;| SELF.emp_name:=p_emp_name; SELF.salary:=p_salary; SELF.managerial:=1001; RETURN; END: MEMBER PROCEDURE insert_records IS BEGIN INSERT INTO emp VALUES(emp_noemp_name,salary,manager); END MEMBER PROCEDURE display_records IS BEGIN Dbms_output.put_line('Employee Name:'||emp_name); Dbms_output.put_line('Employee Number:'||emp_no); Dbms_output.put_line('Salary':'||salary); Dbms_output.put_line('Manager:'||manager); END: END: /
Kod Açıklama
- Kod satırı 1-9: 4 nitelik ve 3 üye ile 'emp_object' nesne tipinin oluşturulması. Yalnızca 3 parametreli yapıcıların tanımını içerir. (Gerçek örtülü kurucu, nesne türünde mevcut olan niteliklerin sayısına eşit sayıda parametre içerecektir)
- Kod satırı 10: Yazı gövdesinin oluşturulması.
- Kod satırı 11-21: Açık kurucunun tanımlanması. Parametre değerinin niteliklere atanması ve 'yönetici' niteliğinin değerinin '1001' varsayılan değeriyle atanması.
- Kod satırı 22-26: Nitelik değerlerinin 'emp' tablosuna eklendiği 'insert_records' üyesinin tanımlanması.
- Kod satırı 27-34: Nesne türü niteliklerinin değerlerinin görüntülendiği 'display_records' üyesinin tanımlanması.
Çıktı
Tür oluşturuldu
Tür gövdesi oluşturuldu
) 2 Adım emp_no 1005 için örtülü yapıcı aracılığıyla oluşturulan nesne türünü çağırmak için anonim blok oluşturma
DECLARE guru_emp_det emp_object; BEGIN guru_emp_det:=emp_object(1005,’RRR',20000,1000); guru_emp_det.display_records; guru_emp_det.insert_records; COMMIT; END;
Kod Açıklama
- Kod satırı 37-45: Örtülü oluşturucuyu kullanarak kayıtları ekleme. Yapıcıya yapılan çağrı, öznitelik değerlerinin gerçek sayısını içerir.
- Kod satırı 38: Guru_emp_det'i 'emp_object' nesne türü olarak bildirir.
- Kod satırı 41: 'guru_emp_det.display_records' ifadesi 'diplay_records' üye işlevi olarak adlandırılır ve öznitelik değerleri görüntülenir
- Kod satırı 42: 'guru_emp_det.insert_records' ifadesi 'insert_records' üye işlevi olarak adlandırılır ve öznitelik değerleri tabloya eklenir.
Çıktı
Çalışan Adı: RRR
Çalışan Sayısı: 1005
Maaş: 20000
Yönetici : 1000
) 3 Adım emp_no 1006 için açık yapıcı aracılığıyla oluşturulan nesne türünü çağırmak üzere anonim blok oluşturma
DECLARE guru_emp_det emp_object; BEGIN guru_emp_det:=emp_object(1006,'PPP',20000); guru_emp_det.display_records; guru_emp_det.insert_records; COMMIT; END; /
Çıktı
Employee Name:PPP Employee Number:1006 Salary:20000 Manager:1001
Kod Açıklaması:
- Kod satırı 46-53: Açık yapıcıyı kullanarak kayıtları ekleme.
- Kod satırı 46: Guru_emp_det'i 'emp_object' nesne türü olarak bildirir.
- Kod satırı 50: 'guru_emp_det.display_records' ifadesi 'display_records' üye işlevi olarak adlandırılır ve öznitelik değerleri görüntülenir
- Kod satırı 51: 'guru_emp_det.insert_records' ifadesi 'insert_records' üye işlevi olarak adlandırılır ve öznitelik değerleri tabloya eklenir.
Nesne Türünde Kalıtım
Kalıtım özelliği, alt nesne türünün, süper nesne türünün veya üst nesne türünün tüm özniteliklerine ve üyelerine erişmesine olanak tanır.
Alt nesne türüne kalıtsal nesne türü, süper nesne türüne ise ana nesne türü adı verilir. Aşağıdaki sözdizimi ana ve devralınan nesne türünün nasıl oluşturulacağını gösterir.
CREATE TYPE <object_type_name_parent> AS OBJECT ( <attribute_l><datatype>, . . )NOT FINAL; /
Sözdizimi Açıklaması:
- Yukarıdaki sözdizimi SUPER türünün oluşturulduğunu gösterir.
CREATE TYPE<object_type_name_sub>UNDER<object_type_name_parent> ( <attribute_l><datatype>, . ); /
Sözdizimi Açıklaması:
- Yukarıdaki sözdizimi SUB türünün oluşturulmasını gösterir. Ana nesne tipinin tüm üyelerini ve niteliklerini içerir.
Example1: Aşağıdaki örnekte, miras özelliğini kullanarak yönetici kimliği '1002' olan kaydı aşağıdaki kayda ('RRR', 1007, 20000) ekleyeceğiz.
Yukarıdaki programı aşağıdaki adımlarda çalıştıracağız
- Adım 1: SÜPER tip oluşturun.
- Adım 2: SUB tipini ve gövdesini oluşturun.
- Adım 3: SUB türünü çağırmak için anonim bir blok oluşturma.
) 1 Adım SÜPER tip veya Ana tip oluşturun.
CREATE TYPE emp_object AS OBJECT( emp_no NUMBER, emp_name VARCHAR2(50), salary NUMBER, manager NUMBER, CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER,p_emp_name VARCHAR2(50), p_salary NUMBER)RETURN SELF AS RESULT), MEMBER PROCEDURE insert_records, MEMBER PROCEDURE display_records)NOT FINAL; /
Kod Açıklaması:
- Kod satırı 1-9: 4 nitelik ve 3 üye ile 'emp_object' nesne tipinin oluşturulması. Yalnızca 3 parametreli yapıcıların tanımını içerir. 'NİHAİ DEĞİL' olarak beyan edilmiştir, dolayısıyla ebeveyn tipidir.
) 2 Adım SUPER tipinin altında SUB tipini oluşturun.
CREATE OR REPLACE TYPE sub_emp_object UNDER emp_object (default_manager NUMBER,MEMBER PROCEDURE insert_default_mgr); / CREATE OR REPLACE TYPE BODY sub_emp_object AS MEMBER PROCEDURE insert_default_mgr IS BEGIN INSERT INTO emp VALUES(emp_no,emp_name:salary,manager): END; END; /
Kod Açıklaması:
- Kod satırı 10-13: Ek bir 'default_manager' özniteliği ve üye prosedürü bildirimi ile sub_emp_object'i devralınan tür olarak oluşturma.
- Kod satırı 14: Devralınan nesne türü için gövde oluşturma.
- Kod satırı 16-21: Yönetici değeri dışındaki 'SUPER' nesne tipindeki değerlerle kayıtların “emp” tablosuna eklenmesini sağlayan üye prosedürünün tanımlanması. Yönetici değeri için 'SUB' türünden 'default_manager' kullanılıyor.
) 3 Adım SUB türünü çağırmak için anonim blok oluşturma
DECLARE guru_emp_det sub_emp_object; BEGIN guru_emp_det:= sub_emp_object(1007,'RRR',20000,1000,1002); guru_emp_det.insert_default_mgr; COMMIT; END; /
Kod Açıklaması:
- Kod satırı 25: 'Guru_emp_det', 'sub_emp_object' türü olarak bildiriliyor.
- Kod satırı 27: Nesnenin örtülü yapıcıyla başlatılması. Yapıcının 5 parametresi vardır (PARENT türünden 4 nitelik ve SUB türünden 2 nitelik). Son parametre (1002) default_manager özelliğinin değerini tanımlar
- Kod satırı 28: Yapıcıda iletilen varsayılan yönetici kimliğine sahip kayıtları eklemek için 'insert_default_mgr' üyesini çağırmak.
PL/SQL Nesnelerinin Eşitliği
Aynı nesnelere ait olan nesne örneği eşitlik açısından karşılaştırılabilir. Bunun için nesne tipinde 'ORDER' metodu denilen özel metodumuzun olması gerekiyor.
Bu 'SİPARİŞ' yöntemi sayısal türü döndüren fonksiyon olmalıdır. Giriş olarak iki parametre alır (ilk parametre: öz nesne örneğinin kimliği, ikinci parametre: başka bir nesne örneğinin kimliği).
İki nesne örneğinin kimliği karşılaştırılır ve sonuç sayısal olarak döndürülür.
- Pozitif değer, SELF nesne örneğinin başka bir örnekten daha büyük olduğunu temsil eder.
- Negatif değer, SELF nesne örneğinin başka bir örnekten daha küçük olduğunu temsil eder.
- Sıfır, SELF nesne örneğinin başka bir örneğe eşit olduğunu temsil eder.
- Örneklerden herhangi biri null ise bu işlev null değerini döndürür.
CREATE TYPE BODY<object_type_name_ 1>AS OBJECT ( ORDER MEMBER FUNCTION match(<parameter> object_type_name_ 1) RETURN INTEGER IS BEGIN IF <attribute_name>parameter <attribute_name>THEN RETURN -1; --any negative number will do ELSIF id>c.id THEN RETURN 1; —any positive number will do ELSE RETURN 0; END IF; END; . . ); /
Sözdizimi Açıklaması:
- Yukarıdaki sözdizimi, eşitlik kontrolü için tür gövdesine dahil edilmesi gereken ORDER işlevini gösterir.
- Bu işlevin parametresi aynı nesne türünün bir örneği olmalıdır.
- Yukarıdaki işlev "obj_instance_1.match(obj_instance_2)" olarak çağrılabilir ve bu ifade gösterildiği gibi sayısal değeri döndürecektir; burada obj_instance_1 ve obj_instance_2, object_type_name örneğidir.
Example1: Aşağıdaki örnekte iki nesneyi nasıl karşılaştıracağımızı göreceğiz. İki örnek oluşturacağız ve aralarında 'maaş' niteliğini karşılaştıracağız. İki adımda int yapacağız.
- Adım 1: Nesne türünü ve gövdesini oluşturma.
- Adım 2: Nesne örneğini karşılaştırmak için anonim bloğun oluşturulması.
) 1 Adım Nesne türünü ve gövdesini oluşturma.
CREATE TYPE emp_object_equality AS OBJECT( salary NUMBER, ORDER MEMBER FUNCTION equals(c emp_object_equality)RETURN INTEGER); /
CREATE TYPE BODY emp_object_equality AS ORDER MEMBER FUNCTION equals(c emp_object_equality)RETURN INTEGER IS BEGIN IF salary<c.salary THEN RETURN -1; ELSIF salary>c.salary THEN RETURN 1; ELSE RETURN 0; END IF: END; END; /
Kod Açıklaması:
- Kod satırı 1-4: 1 öznitelik ve 1 üye ile 'emp_object_equality' nesne türü oluşturuluyor.
- Kod satırı 6-16: SELF örneğinin 'maaş' niteliğini ve parametre örneği türünü karşılaştıran ORDER işlevini tanımlıyor. SELF maaşı daha azsa negatif, SELF maaşı daha fazlaysa pozitif ve maaşlar eşitse 0 döndürüyor.
Kod Çıkışı:
Tür oluşturuldu
) 2 Adım Nesne örneğini karşılaştırmak için anonim blok oluşturma.
DECLARE l_obj_l emp_object_equality; l_obj_2 emp_object_equality; BEGIN l_obj_l:=emp_object_equality(15000); l_obj_2:=emp_object_equality(17000); IF l_obj_1.equalS(l_obj_2)>0 THEN Dbms_output.put_line(’Salary of first instance is greater’): ELSIF l_obj_l.equalS(l_obj_2)<0 THEN Dbms_output.put_line(’Salary of second instance is greater’); ELSE Dbms_output.put_line(’Salaries are equal’); END IF; END; /
Çıktı
Salary of second instance is greater
Kod Açıklaması:
- Kod satırı 20: emp_object_equality türünün l_obj_1'inin bildirilmesi.
- Kod satırı 21: emp_object_equality türünün l_obj_2'inin bildirilmesi.
- Kod satırı 23: l_obj_1 maaş değeri '15000' olarak başlatılıyor
- Kod satırı 24: l_obj_1 maaş değeri '17000' olarak başlatılıyor
- Kod satırı 25-33: SİPARİŞ işlevinden gelen dönüş numarasına göre mesajı yazdırın.
ÖZET
Bu bölümde nesne türlerini ve özelliklerini gördük. Ayrıca PL/SQL nesnelerinde Yapıcılar, Üyeler, Nitelikler, Kalıtım ve Eşitlik konularını da tartıştık.