Oracle PL/SQL Nesne Tipleri: Örneklerle CREATE TYPE
⚡ Akıllı Özet
PL/SQL'deki nesne türleri, nesne yönelimli programlamayı kullanıma sunar. OracleBu sayede, öznitelikler ve yöntemlerle gerçek dünya varlıklarını modelleyebilirsiniz. Yapıcıları, kalıtımı ve eşitlik karşılaştırmasını destekleyerek, tek bir şema düzeyindeki türün yapılandırılmış verileri depolayıp işlemesini sağlarlar.

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. Programlar "eylemler" yerine "nesneler" etrafında düzenlenir; yani, tek bir eylem yerine bütün bir nesneyle çalışmak ve etkileşimde bulunmak üzere tasarlanırlar. Bu yaklaşım, programcının nesne-varlık düzeyinde ayrıntıları doldurmasına ve manipüle etmesine olanak tanır.
Aşağıdaki resim, bir banka hesabının nesne varlığı olarak ele alındığı bir nesne türü örneğini göstermektedir. Nesne nitelikleri değerler içerir (bir banka hesabı için bunlar hesap numarası, banka bakiyesi vb.) ve nesne yöntemleri ise faiz oranını hesaplama veya banka ekstresi oluşturma gibi eylemleri tanımlar; bunların her biri tamamlanması gereken bir işlem gerektirir.
In PL / SQLNesne yönelimli programlama, nesne türlerine dayanır. Bir nesne türü, gerçek dünyadaki herhangi bir varlığı temsil edebilir. Aşağıdaki bölümlerde nesne türleri, bileşenleri ve bunların nasıl oluşturulup kullanılacağı incelenmektedir.
Nesne Türlerinin Bileşenleri
Bir PL/SQL nesne türü esas olarak iki bileşenden oluşur.
- Özellikler
- Üyeler/Yöntemler
Özellikler
Nitelikler, verilerin depolandığı sütunlar veya alanlardır. Her nitelik, o nitelik için işleme ve depolama türünü tanımlayan veri türüne eşlenir. Bir nitelik, geçerli herhangi bir veri türünde olabilir. PL/SQL veri türüveya başka bir nesne türünde olabilir.
Üyeler/Yöntemler
Üyeler veya yöntemler şunlardır: alt programlar Nesne türü içinde tanımlanırlar. Veri depolamak için kullanılmazlar; bunun yerine, nesne türü içinde gerçekleştirilen işlemleri tanımlarlar - örneğin, nesneyi doldurmadan önce verileri doğrulamak gibi. Nesne türü belirtiminde bildirilirler ve nesne türü gövdesinde tanımlanırlar. Gövde isteğe bağlıdır: eğer hiçbir üye yoksa, bir nesne türünün gövde kısmı yoktur.
İç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 alt programlarda kullanılabilir. Nesne türü “CREATE TYPE” ifadesi kullanılarak oluşturulur ve tür gövdesi ancak nesne türü var olduktan sonra oluşturulabilir.
Aşağıdaki ekran görüntüleri, nesne belirtimi için CREATE TYPE sözdizimini ve yöntemlerini tanımlayan CREATE TYPE BODY sözdizimini göstermektedir.
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, özniteliklere sahip bir NESNE ve yöntemlere sahip bir NESNE GÖVDESİ'nin oluşturulmasını göstermektedir.
- 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ürleri de bir programda kullanılmadan önce tanımlanmalıdır. Nesne türü oluşturulduktan sonra, bir alt programın bildirim bölümünde o nesne türünde bir değişken tanımlamak için kullanılabilir.
Bir değişken nesne türü olarak tanımlandığında, çalışma zamanında nesne türünün yeni bir örneği oluşturulur ve bu yeni oluşturulan örnek değişken adıyla referans alınır. Bu şekilde, tek bir nesne türü farklı örnekler altında birden fazla değer saklayabilir.
Aşağıdaki ekran görüntüsü, bir değişkenin bir nesne türü olarak nasıl tanımlandığını göstermektedir. PL/SQL bloğu.
DECLARE <variable_name> <object_type_name>; BEGIN . . END; /
Sözdizimi Açıklaması:
- Yukarıdaki sözdizimi, bir bildirimin nasıl yapıldığını göstermektedir. değişken Bildirimsel bölümde bir nesne türü olarak.
Bir alt programda bir değişken nesne türü olarak tanımlandıktan sonra, atomik olarak null olur; nesnenin tamamı null olur. Programda kullanılabilmesi için önce değerlerle başlatılması gerekir. Nesneler kurucu fonksiyonlar kullanılarak başlatılır.
Yapıcılar, nesne türüyle aynı adla erişilebilen, nesnenin örtük yöntemleridir. Aşağıdaki ekran görüntüsü, bir nesne türü örneğinin başlatılmasını göstermektedir.
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 null değeriyle başlatılmasını göstermektedir.
- Nesne başlatıldıktan sonra kendisi artık boş (null) değildir, ancak nesnenin içindeki öznitelikler, onlara değer atanana kadar boş (null) kalır.
Kurucular
Yapıcılar, nesne türüyle aynı adla çağrılabilecek, nesnenin örtük metotlarıdır. Nesneye ilk kez başvurulduğunda, bu yapıcı örtük olarak çağrılır.
Bu yapıcı fonksiyonları kullanarak nesneleri başlatabilirsiniz. Bir yapıcı fonksiyon, nesne türü gövdesinde nesne türüyle aynı ada sahip bir üye tanımlanarak açıkça tanımlanabilir.
Örnek 1: Aşağıdaki örnekte, emp tablosuna ('RRR', 1005, 20000, 1000) ve ('PPP', 1006, 20000, 1001) değerleriyle kayıt eklemek için nesne türü üyesini kullanıyoruz. Veriler eklendikten sonra, nesne türü üyesini kullanarak bunları görüntülüyoruz. Ayrıca, ikinci kayıt için yönetici kimliğini varsayılan değer olan 1001 ile doldurmak için açık bir kurucu kullanıyoruz.
Bunu aşağıdaki adımlarla gerçekleştiriyoruz.
- Adım 1: Nesne türünü ve Nesne türü gövdesini oluşturun.
- Adım 2: emp_no 1005 için örtük kurucu aracılığıyla nesne türünü çağırmak üzere anonim bir blok oluşturun.
- Adım 3: emp_no 1006 için açık kurucu aracılığıyla nesne türünü çağırmak üzere anonim bir blok oluşturun.
Adım 1) Nesne türünü ve nesne türü gövdesini oluşturun.
Aşağıdaki ekran görüntüsü, emp_object nesne türü belirtiminin öznitelikleri ve üyeleriyle birlikte nasıl oluşturulduğunu göstermektedir.
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); /
Aşağıdaki ekran görüntüsü, açık kurucu ve üye prosedürleri kullanılarak oluşturulan emp_object tip gövdesini göstermektedir.
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.manager:=1001; RETURN; END; MEMBER PROCEDURE insert_records IS BEGIN INSERT INTO emp VALUES(emp_no,emp_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; /
Code açıklama
- Code 1-9. satırlar: 4 özniteliğe ve 3 üyeye sahip 'emp_object' nesne türü oluşturuluyor. Bu nesne türü, yalnızca 3 parametre içeren bir kurucu fonksiyonun tanımını içeriyor. (Gerçek örtük kurucu fonksiyon, nesne türünde bulunan öznitelik sayısına eşit sayıda parametre içeriyor.)
- Code 10 hattı: Yazı gövdesini oluşturma.
- Code 11-21. satırlar: Açık kurucu fonksiyonun tanımlanması. Parametre değerlerinin özniteliklere atanması ve 'manager' özniteliğine varsayılan değer olan '1001'in atanması.
- Code 22-26. satırlar: 'insert_records' üyesini tanımlayarak, öznitelik değerlerinin 'emp' tablosuna eklenmesini sağlıyoruz.
- Code 27-34. satırlar: Nesne türü özniteliklerinin değerlerini görüntüleyen 'display_records' üyesini tanımlıyoruz.
Çıktı:
Tür oluşturuldu
Tür gövdesi oluşturuldu
) 2 Adım 1005 numaralı çalışan için oluşturulan nesne türünü örtük kurucu aracılığıyla çağırmak üzere anonim bir blok oluşturuluyor.
Aşağıdaki ekran görüntüsü, örtük kurucu aracılığıyla emp_object'i çağıran anonim bloğu göstermektedir.
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;
Code açıklama
- Code 37-45. satırlar: Kayıtlar, örtük kurucu kullanılarak ekleniyor. Kurucuya yapılan çağrı, öznitelik değerlerinin gerçek sayısını içerir.
- Code 38 hattı: 'guru_emp_det' değişkenini 'emp_object' nesne türünde tanımlar.
- Code 41 hattı: 'guru_emp_det.display_records' ifadesi 'display_records' üyesini çağırır ve öznitelik değerleri görüntülenir.
- Code 42 hattı: 'guru_emp_det.insert_records' ifadesi 'insert_records' üyesini çağırır ve öznitelik değerleri tabloya eklenir. Ardından blok işlemi onaylar. işlem.
Çıktı:
Çalışan Adı: RRR
Çalışan Sayısı: 1005
Maaş: 20000
Yönetici : 1000
) 3 Adım 1006 numaralı çalışan için oluşturulan nesne türünü açık kurucu aracılığıyla çağırmak üzere anonim bir blok oluşturuluyor.
Aşağıdaki ekran görüntüsü, üç argümanla açık kurucu aracılığıyla emp_object'i çağıran anonim bloğu göstermektedir.
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
Code Açıklama:
- Code 46-53. satırlar: Açık yapıcıyı kullanarak kaydı ekleme.
- Code 46 hattı: 'guru_emp_det' değişkenini 'emp_object' nesne türünde tanımlar.
- Code 50 hattı: 'guru_emp_det.display_records' ifadesi 'display_records' üyesini çağırır ve öznitelik değerleri görüntülenir.
- Code 51 hattı: 'guru_emp_det.insert_records' ifadesi 'insert_records' üyesini çağırır ve öznitelik değerleri tabloya eklenir. Yalnızca üç argüman geçirildiği için, açık kurucu, yönetici kimliğini varsayılan değeri olan 1001'e ayarlar.
Nesne Türünde Kalıtım
Kalıtım özelliği, alt nesne türünün üst nesne türünün veya ebeveyn nesne türünün tüm özniteliklerine ve üyelerine erişmesine olanak tanır.
Alt nesne türüne kalıtım yoluyla alınan nesne türü, üst nesne türüne ise ebeveyn nesne türü denir. Aşağıdaki sözdizimi, ebeveyn ve kalıtım yoluyla alınan nesne türlerinin nasıl oluşturulacağını göstermektedir. Aşağıdaki ekran görüntüsünde, ebeveyn (SUPER) türünün sözdizimi NOT FINAL olarak işaretlenmiştir.
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şturulmasını göstermektedir. NOT FINAL yan tümcesi, türün miras alınmasına olanak tanır.
Aşağıdaki ekran görüntüsü, UNDER anahtar kelimesiyle oluşturulan kalıtımlı (SUB) tür sözdizimini göstermektedir.
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östermektedir. Bu tür, üst nesne türündeki tüm üyeleri ve öznitelikleri içerir.
Örnek 1: Aşağıdaki örnekte, ('RRR', 1007, 20000) kaydı için '1002' yönetici kimliğine sahip bir kayıt eklemek üzere kalıtım özelliğini kullanıyoruz. Programı aşağıdaki adımlarla çalıştırıyoruz.
- Adım 1: SUPER türünü oluşturun.
- Adım 2: SUB türünü ve gövdesini oluşturun.
- 3. Adım: SUB türünü çağırmak için anonim bir blok oluşturun.
Adım 1) Üst tür veya Ebeveyn türü oluşturun.
Aşağıdaki ekran görüntüsü, NOT FINAL koşuluyla oluşturulan emp_object üst türünü göstermektedir.
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; /
Code Açıklama:
- Code 1-9. satırlar: 4 özniteliğe ve 3 üyeye sahip 'emp_object' nesne türü oluşturuluyor. Sadece 3 parametre alan bir kurucu fonksiyonun tanımını içeriyor. 'NOT FINAL' olarak tanımlandığı için üst türdür.
Adım 2) SUPER türünün altına SUB türünü oluşturun.
Aşağıdaki ekran görüntüsü, sub_emp_object kalıtım türünün ve gövdesinin oluşturulma sürecini göstermektedir.
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; /
Code Açıklama:
- Code 10-13. satırlar: 'sub_emp_object' adlı kalıtım türünü, 'default_manager' adlı ek bir öznitelik ve bir üye prosedür bildirimiyle oluşturuyoruz.
- Code 14 hattı: Kalıtım yoluyla alınan nesne türü için gövde oluşturuluyor.
- Code 16-21. satırlar: SUPER nesne türündeki değerleri kullanarak 'emp' tablosuna kayıt ekleyen üye prosedürünü tanımlıyoruz; ancak yönetici değeri hariç. Yönetici değeri için SUB türündeki 'default_manager' değerini kullanıyoruz.
3. Adım) SUB türünü çağırmak için anonim blok oluşturma.
Aşağıdaki ekran görüntüsü, SUB türünü çağıran ve varsayılan yönetici kimliğini ekleyen anonim bloğu göstermektedir.
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; /
Code Açıklama:
- Code 25 hattı: 'guru_emp_det' nesnesini 'sub_emp_object' türünde tanımlıyoruz.
- Code 27 hattı: Nesneyi örtük kurucu ile başlatıyoruz. Kurucu 5 parametreye sahiptir (PARENT türünden 4 öznitelik ve SUB türünden 1 öznitelik). Son parametre (1002), default_manager özniteliği için değeri tanımlar.
- Code 28 hattı: Yapıcı fonksiyonda belirtilen varsayılan yönetici kimliğiyle kaydı eklemek için 'insert_default_mgr' üyesini çağırıyoruz.
PL/SQL Nesnelerinin Eşitliği
Aynı nesne türüne ait nesne örnekleri eşitlik açısından karşılaştırılabilir. Bunu yapmak için, nesne türünün ORDER yöntemi adı verilen özel bir yönteme ihtiyacı vardır.
Bu ORDER metodu, sayısal bir değer döndüren bir fonksiyon olmalıdır. Giriş olarak iki parametre alır (birinci parametre: kendi nesne örneğinin kimliği; ikinci parametre: başka bir nesne örneğinin kimliği).
İki nesne örneğinin kimlikleri karşılaştırılır ve sonuç sayısal olarak döndürülür.
- Pozitif bir değer, SELF nesne örneğinin diğer örneğe göre daha büyük olduğunu gösterir.
- Negatif bir değer, SELF nesne örneğinin diğer örneğe göre daha küçük olduğunu gösterir.
- Sıfır, SELF nesne örneğinin diğer örneğe eşit olduğunu gösterir.
- Eğer örneklerden herhangi biri null ise, fonksiyon null değerini döndürür.
Aşağıdaki ekran görüntüsü, eşitlik kontrolü için tür gövdesine eklenmesi gereken ORDER üye fonksiyonunun sözdizimini göstermektedir.
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 eklenmesi gereken ORDER fonksiyonunu göstermektedir.
- Bu işlevin parametresi aynı nesne türünün bir örneği olmalıdır.
- Bu fonksiyon “obj_instance_1.match(obj_instance_2)” şeklinde çağrılabilir ve bu ifade, gösterilen sayısal değeri döndürür; burada obj_instance_1 ve obj_instance_2, nesne türünün örnekleridir.
Örnek 1: Aşağıdaki örnekte, iki nesneyi karşılaştırıyoruz. İki örnek oluşturup, aralarındaki 'maaş' özelliğini karşılaştırıyoruz. Bunu iki adımda yapıyoruz.
- Adım 1: Nesne türünü ve gövdesini oluşturun.
- Adım 2: Nesne örneklerini karşılaştırmak için anonim bloğu oluşturun.
Adım 1) Nesne türünü ve gövdesini oluşturma.
Aşağıdaki ekran görüntüleri, maaş özelliğini karşılaştıran ORDER fonksiyonunu tanımlayan emp_object_equality spesifikasyonunu ve gövdesini göstermektedir.
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; /
Code Açıklama:
- Code 1-4. satırlar: 'emp_object_equality' nesne türünü 1 öznitelik ve 1 üye ile oluşturma.
- Code 6-16. satırlar: SELF örneğinin ve parametre örneğinin 'maaş' özniteliğini karşılaştıran ORDER fonksiyonunu tanımlıyoruz. SELF'in maaşı daha düşükse negatif, daha yüksekse pozitif, eşitse 0 döndürür.
Code Çıktı:
Tür oluşturuldu
Adım 2) Nesne örneklerini karşılaştırmak için anonim bloğu oluşturma.
Aşağıdaki ekran görüntüsü, iki emp_object_equality örneğini maaşa göre karşılaştıran anonim bloğu göstermektedir.
DECLARE l_obj_1 emp_object_equality; l_obj_2 emp_object_equality; BEGIN l_obj_1:=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_1.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
Code Açıklama:
- Code 20 hattı: 'emp_object_equality' türünde 'l_obj_1' nesnesi tanımlanıyor.
- Code 21 hattı: 'emp_object_equality' türünde 'l_obj_2' nesnesi tanımlanıyor.
- Code 23 hattı: 'l_obj_1' değişkeni '15000' maaş değeriyle başlatılıyor.
- Code 24 hattı: 'l_obj_2' değişkeni '17000' maaş değeriyle başlatılıyor.
- Code 25-33. satırlar: ORDER fonksiyonunun döndürdüğü sayıya göre mesajı yazdırıyor.


















