Oracle PL/SQL tipovi objekata: CREATE TYPE s primjerima
⚡ Pametni sažetak
Objektni tipovi u PL/SQL-u donose objektno orijentirano programiranje u Oracle, što vam omogućuje modeliranje entiteta iz stvarnog svijeta s atributima i metodama. Podržavaju konstruktore, nasljeđivanje i usporedbu jednakosti, tako da jedan tip na razini sheme može pohranjivati i obrađivati strukturirane podatke.
Što je vrsta objekta u PL/SQL?
Objektno orijentirano programiranje posebno je prikladno za izgradnju višekratno upotrebljivih komponenti i složenih aplikacija. Programi su organizirani oko "objekata", a ne oko "akcija"; to jest, dizajnirani su za rad i interakciju s cijelim objektom, a ne s jednom akcijom. Ovaj pristup omogućuje programeru popunjavanje i manipuliranje detaljima na razini objekta i entiteta.
Donja slika prikazuje primjer tipa objekta u kojem se bankovni račun tretira kao entitet objekta. Atributi objekta sadrže vrijednosti - za bankovni račun to su broj računa, stanje na bankovnom računu i tako dalje - dok metode objekta opisuju radnje poput izračuna kamatne stope ili generiranja bankovnog izvoda, od kojih svaka zahtijeva dovršetak procesa.
In PL / SQLObjektno orijentirano programiranje temelji se na tipovima objekata. Tip objekta može predstavljati bilo koji entitet iz stvarnog svijeta. U donjim odjeljcima istražuju se tipovi objekata, njihove komponente te kako ih stvoriti i koristiti.
Komponente tipova objekata
PL/SQL objektni tip sadrži uglavnom dvije komponente.
- Značajke
- Članovi/Metode
Značajke
Atributi su stupci ili polja u kojima se pohranjuju podaci. Svaki atribut je mapiran na tip podataka koji definira tip obrade i pohrane za taj atribut. Atribut može biti bilo kojeg valjanog PL/SQL tip podataka, ili može biti drugog tipa objekta.
Članovi/Metode
Članovi ili metode su potprogrami definirani unutar tipa objekta. Ne koriste se za pohranu podataka; umjesto toga definiraju obradu koja se izvodi unutar tipa objekta - na primjer, provjeru valjanosti podataka prije popunjavanja objekta. Deklarirani su u specifikaciji tipa objekta i definirani u tijelu tipa objekta. Tijelo je opcionalno: ako nema članova, tip objekta nema dio tijela.
Stvori objekt u Oracle
Tip objekta ne može se stvoriti na razini potprograma; može se stvoriti samo na razini sheme. Nakon što je tip objekta definiran u shemi, može se koristiti u potprogramima. Tip objekta stvara se pomoću naredbe „CREATE TYPE“, a tijelo tipa može se stvoriti tek nakon što njegov tip objekta postoji.
Snimke zaslona u nastavku prikazuju sintaksu CREATE TYPE za specifikaciju objekta i sintaksu CREATE TYPE BODY koja definira njegove metode.
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; . . ); /
Objašnjenje sintakse:
- Gornja sintaksa prikazuje stvaranje OBJEKTA s atributima i TIJELA OBJEKTA s metodama.
- Metode također mogu biti preopterećene u tijelu objekta.
Inicijalizacija deklaracije tipa objekta
Kao i druge komponente u PL/SQL-u, tipovi objekata moraju se deklarirati prije nego što se koriste u programu. Nakon što je tip objekta kreiran, može se koristiti u deklarativnom dijelu potprograma za deklariranje varijable tog tipa objekta.
Kad god se varijabla deklarira kao objektni tip, tijekom izvođenja programa stvara se nova instanca objektnog tipa, a na tu novostvorenu instancu se referira naziv varijable. Na taj način, jedan objektni tip može pohraniti više vrijednosti pod različitim instancama.
Snimka zaslona u nastavku prikazuje varijablu deklariranu kao objektni tip unutar PL/SQL blok.
DECLARE <variable_name> <object_type_name>; BEGIN . . END; /
Objašnjenje sintakse:
- Gornja sintaksa prikazuje deklaraciju varijabla kao tip objekta u deklarativnom dijelu.
Nakon što je varijabla deklarirana kao objektni tip u potprogramu, ona je atomski null - cijeli objekt je sam po sebi null. Mora se inicijalizirati vrijednostima prije nego što se može koristiti u programu. Objekti se inicijaliziraju pomoću konstruktora.
Konstruktori su implicitne metode objekta na koje se može referirati s istim imenom kao i tip objekta. Snimka zaslona u nastavku prikazuje inicijalizaciju instance tipa objekta.
DECLARE <variable_name> <object_type_name>; BEGIN <variable_name>:=<object_type_name>(); END; /
Objašnjenje sintakse:
- Gornja sintaksa prikazuje inicijalizaciju instance tipa objekta s null vrijednošću.
- Sam objekt više nije null nakon što je inicijaliziran, ali atributi unutar objekta ostaju null sve dok im se ne dodijele vrijednosti.
Konstruktori
Konstruktori su implicitne metode objekta na koje se može referirati s istim imenom kao i tip objekta. Kad god se na objekt referira prvi put, ovaj konstruktor se implicitno poziva.
Objekte možete inicijalizirati i pomoću ovih konstruktora. Konstruktor se može eksplicitno definirati definiranjem člana u tijelu tipa objekta s istim imenom kao i tip objekta.
Primjer 1: U sljedećem primjeru koristimo član tipa objekta za umetanje zapisa u emp tablicu s vrijednostima ('RRR', 1005, 20000, 1000) i ('PPP', 1006, 20000, 1001). Nakon što su podaci umetnuti, prikazujemo ih pomoću člana tipa objekta. Također koristimo eksplicitni konstruktor za popunjavanje ID-a upravitelja zadanom vrijednošću 1001 za drugi zapis.
Izvršavamo ga u sljedećim koracima.
- Korak 1: Izradite tip objekta i tijelo tipa objekta.
- Korak 2: Izradite anonimni blok za pozivanje tipa objekta putem implicitnog konstruktora za emp_no 1005.
- Korak 3: Izradite anonimni blok za pozivanje tipa objekta putem eksplicitnog konstruktora za emp_no 1006.
Korak 1) Izradite tip objekta i tijelo tipa objekta.
Snimka zaslona u nastavku prikazuje specifikaciju tipa objekta emp_object koja se stvara s njezinim atributima i članovima.
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); /
Snimka zaslona u nastavku prikazuje tijelo tipa emp_object koje se stvara pomoću eksplicitnog konstruktora i procedura članova.
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 Objašnjenje
- Code redak 1-9: Izrada objekta tipa 'emp_object' s 4 atributa i 3 člana. Sadrži definiciju konstruktora sa samo 3 parametra. (Stvarni implicitni konstruktor sadrži broj parametara jednak broju atributa prisutnih u objektu tipa.)
- Code redak 10: Izrada tijela tipa.
- Code redak 11-21: Definiranje eksplicitnog konstruktora. Dodjeljivanje vrijednosti parametara atributima i dodjeljivanje atributu 'manager' zadane vrijednosti '1001'.
- Code redak 22-26: Definiranje člana 'insert_records', u kojem se vrijednosti atributa ubacuju u tablicu 'emp'.
- Code redak 27-34: Definiranje člana 'display_records', koji prikazuje vrijednosti atributa tipa objekta.
Izlaz:
Vrsta je stvorena
Tijelo tipa stvoreno
Korak 2) Stvaranje anonimnog bloka za pozivanje kreiranog tipa objekta putem implicitnog konstruktora za emp_no 1005.
Snimka zaslona u nastavku prikazuje anonimni blok koji poziva emp_object putem implicitnog konstruktora.
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 Objašnjenje
- Code redak 37-45: Umetanje zapisa pomoću implicitnog konstruktora. Poziv konstruktora sadrži stvarni broj vrijednosti atributa.
- Code redak 38: Deklarira 'guru_emp_det' kao tip objekta 'emp_object'.
- Code redak 41: Naredba 'guru_emp_det.display_records' poziva član 'display_records' i prikazuju se vrijednosti atributa.
- Code redak 42: Naredba 'guru_emp_det.insert_records' poziva član 'insert_records' i vrijednosti atributa se ubacuju u tablicu. Blok zatim potvrđuje (commit) transakcija.
Izlaz:
Ime zaposlenika: RRR
Broj zaposlenika: 1005
Plaća: 20000
Voditelj: 1000
Korak 3) Stvaranje anonimnog bloka za pozivanje kreiranog tipa objekta putem eksplicitnog konstruktora za emp_no 1006.
Snimka zaslona u nastavku prikazuje anonimni blok koji poziva emp_object putem eksplicitnog konstruktora s tri argumenta.
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; /
Izlaz
Employee Name:PPP Employee Number:1006 Salary:20000 Manager:1001
Code Objašnjenje:
- Code redak 46-53: Umetanje zapisa pomoću eksplicitnog konstruktora.
- Code redak 46: Deklarira 'guru_emp_det' kao tip objekta 'emp_object'.
- Code redak 50: Naredba 'guru_emp_det.display_records' poziva član 'display_records' i prikazuju se vrijednosti atributa.
- Code redak 51: Naredba 'guru_emp_det.insert_records' poziva član 'insert_records' i vrijednosti atributa se ubacuju u tablicu. Budući da se prosljeđuju samo tri argumenta, eksplicitni konstruktor postavlja ID upravitelja na njegovu zadanu vrijednost 1001.
Nasljeđivanje u tipu objekta
Svojstvo nasljeđivanja omogućuje podobjektovom tipu pristup svim atributima i članovima nadređenog tipa objekta ili nadređenog tipa objekta.
Tip podobjekta naziva se naslijeđeni tip objekta, a tip nadređenog objekta naziva se tip roditeljskog objekta. Sintaksa u nastavku prikazuje kako stvoriti roditeljske i naslijeđene tipove objekata. Snimka zaslona u nastavku prikazuje sintaksu roditeljskog (SUPER) tipa označenu kao NIJE KONAČNO.
CREATE TYPE <object_type_name_parent> AS OBJECT ( <attribute_l><datatype>, . . )NOT FINAL; /
Objašnjenje sintakse:
- Gornja sintaksa prikazuje stvaranje tipa SUPER. Klauzula NOT FINAL omogućuje nasljeđivanje tipa.
Snimka zaslona u nastavku prikazuje naslijeđenu sintaksu tipa (SUB) stvorenu ključnom riječi UNDER.
CREATE TYPE<object_type_name_sub>UNDER<object_type_name_parent> ( <attribute_l><datatype>, . ); /
Objašnjenje sintakse:
- Gornja sintaksa prikazuje stvaranje SUB tipa. Sadrži sve članove i atribute iz nadređenog tipa objekta.
Primjer 1: U donjem primjeru koristimo svojstvo nasljeđivanja za umetanje zapisa s ID-om upravitelja '1002' za zapis ('RRR', 1007, 20000). Program izvršavamo u sljedećim koracima.
- Korak 1: Kreirajte tip SUPER.
- Korak 2: Izradite SUB tip i tijelo.
- Korak 3: Izradite anonimni blok za pozivanje tipa SUB.
Korak 1) Kreirajte SUPER tip ili Parent tip.
Snimka zaslona u nastavku prikazuje kako se supertip emp_object stvara pomoću klauzule NOT FINAL.
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 Objašnjenje:
- Code redak 1-9: Izrada tipa objekta 'emp_object' s 4 atributa i 3 člana. Sadrži definiciju konstruktora sa samo 3 parametra. Deklariran je kao 'NOT FINAL', pa je roditeljski tip.
Korak 2) Kreirajte SUB tip pod SUPER tipom.
Snimka zaslona u nastavku prikazuje naslijeđeni tip sub_emp_object i njegovo tijelo koje se stvara.
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 Objašnjenje:
- Code redak 10-13: Stvaranje 'sub_emp_object' kao naslijeđenog tipa s jednim dodatnim atributom 'default_manager' i deklaracijom procedure člana.
- Code redak 14: Stvaranje tijela za naslijeđeni tip objekta.
- Code redak 16-21: Definiranje procedure člana koja ubacuje zapise u tablicu 'emp' s vrijednostima iz objekta tipa SUPER, osim vrijednosti upravitelja. Za vrijednost upravitelja koristi se 'default_manager' iz tipa SUB.
Korak 3) Izrada anonimnog bloka za pozivanje SUB tipa.
Snimka zaslona u nastavku prikazuje anonimni blok koji poziva tip SUB i umeće zadani ID upravitelja.
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 Objašnjenje:
- Code redak 25: Deklariranje 'guru_emp_det' kao tipa 'sub_emp_object'.
- Code redak 27: Inicijalizacija objekta implicitnim konstruktorom. Konstruktor ima 5 parametara (4 atributa tipa PARENT i 1 atribut tipa SUB). Posljednji parametar (1002) definira vrijednost atributa default_manager.
- Code redak 28: Pozivanje člana 'insert_default_mgr' za umetanje zapisa s zadanim ID-om upravitelja proslijeđenim u konstruktoru.
Jednakost PL/SQL objekata
Instance objekata koje pripadaju istom tipu objekta mogu se uspoređivati radi jednakosti. Za to je tipu objekta potrebna posebna metoda koja se naziva ORDER metoda.
Ova ORDER metoda trebala bi biti funkcija koja vraća numerički tip. Uzima dva parametra kao ulaz (prvi parametar: ID instance samog objekta; drugi parametar: ID druge instance objekta).
Uspoređuju se ID-ovi dviju instanci objekta, a rezultat se vraća kao broj.
- Pozitivna vrijednost označava da je instanca SELF objekta veća od druge instance.
- Negativna vrijednost označava da je instanca SELF objekta manja od druge instance.
- Nula označava da je instanca SELF objekta jednaka drugoj instanci.
- Ako je bilo koja instanca null, funkcija vraća null.
Snimka zaslona u nastavku prikazuje sintaksu funkcije članice ORDER koja mora biti uključena u tijelo tipa za provjeru jednakosti.
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; . . ); /
Objašnjenje sintakse:
- Gornja sintaksa prikazuje funkciju ORDER koja mora biti uključena u tijelo tipa za provjeru jednakosti.
- Parametar za ovu funkciju trebao bi biti instanca istog tipa objekta.
- Funkcija se može pozvati kao „obj_instance_1.match(obj_instance_2)“, a ovaj izraz vraća prikazanu numeričku vrijednost, gdje su obj_instance_1 i obj_instance_2 instance tipa objekta.
Primjer 1: U sljedećem primjeru uspoređujemo dva objekta. Stvaramo dvije instance i uspoređujemo atribut 'plaća' između njih. To radimo u dva koraka.
- Korak 1: Kreirajte tip i tijelo objekta.
- Korak 2: Izradite anonimni blok za usporedbu instanci objekta.
Korak 1) Izrada tipa i tijela objekta.
Snimke zaslona u nastavku prikazuju specifikaciju emp_object_equality i njezino tijelo, koje definira funkciju ORDER koja uspoređuje atribut salary.
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 Objašnjenje:
- Code redak 1-4: Izrada objekta tipa 'emp_object_equality' s 1 atributom i 1 članom.
- Code redak 6-16: Definiranje funkcije ORDER koja uspoređuje atribut 'plaća' instance SELF i instance parametra. Vraća negativnu vrijednost ako je SELF plaća manja, pozitivnu vrijednost ako je SELF plaća veća i 0 ako su plaće jednake.
Code Izlaz:
Vrsta je stvorena
Korak 2) Izrada anonimnog bloka za usporedbu instanci objekta.
Snimka zaslona u nastavku prikazuje anonimni blok koji uspoređuje dvije instance emp_object_equality prema plaći.
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; /
Izlaz
Salary of second instance is greater
Code Objašnjenje:
- Code redak 20: Deklariranje 'l_obj_1' tipa 'emp_object_equality'.
- Code redak 21: Deklariranje 'l_obj_2' tipa 'emp_object_equality'.
- Code redak 23: Inicijalizacija 'l_obj_1' s vrijednošću plaće '15000'.
- Code redak 24: Inicijalizacija 'l_obj_2' s vrijednošću plaće '17000'.
- Code redak 25-33: Ispis poruke na temelju broja koji je vratila funkcija ORDER.



















