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.


















