Oracle Vodič za vrste PL/SQL objekata s PRIMJERIMA
Što je vrsta objekta u PL/SQL?
Objektno orijentirano programiranje posebno je prikladno za izgradnju komponenti za višekratnu upotrebu i složenih aplikacija. Organizirani su oko "objekata", a ne "akcija", tj. programi su dizajnirani za rad i interakciju s cijelim objektom, a ne s jednom radnjom. Ovaj koncept omogućuje programeru da popuni i manipulira detaljima na razini entiteta objekta.
Donja slika prikazuje primjer tipa objekta u kojem se bankovni račun smatra objektnim entitetom. Atributi objekta uključuju stvari koje drže neke vrijednosti atributa, na primjer u bankovnom računu; to je broj računa, bankovni saldo itd. dok objektne metode opisuju stvari kao što su izračun kamatne stope, generiranje bankovnog izvoda itd. što zahtijeva dovršetak određenog procesa.
U PL/SQL objektno orijentirano programiranje temelji se na tipovima objekata.
Tip objekta može predstavljati bilo koji entitet iz stvarnog svijeta. U ovom poglavlju raspravljat ćemo o više vrsta objekata.
Komponente tipova objekata
PL / SQL tip objekta sadrži uglavnom dvije komponente.
- Značajke
- Članovi/Metode
Značajke
Atributi su stupac ili polje u kojem se pohranjuju podaci. Svaki atribut bit će mapiran na tip podataka koji definira vrstu obrade i pohrane za taj atribut. Atribut može biti bilo koji važeći PL/SQL tip podataka, ili može biti drugog tipa objekta.
Članovi/Metode
Članovi ili metode su potprogrami koji su definirani u tipu objekta. Ne koriste se za pohranjivanje podataka. Uglavnom se koriste za definiranje procesa unutar tipa objekta. Na primjer, provjera valjanosti podataka prije popunjavanja tipa objekta. Oni su deklarirani u odjeljku tipa objekta i definirani u odjeljku tijela tipa objekta tipa objekta. Dio tijela u tipu objekta je neobavezan dio. Ako nema članova, tada tip objekta neće sadržavati dio tijela.
Stvori objekt u Oracle
Vrsta 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, tada se isti može koristiti u potprogramima. Tip objekta može se stvoriti pomoću 'CREATE TYPE'. Tijelo tipa može se kreirati tek nakon kreiranja njegovog tipa objekta.
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 'OBJECT'-a s atributima i 'OBJECT-BODY'-a s metodama.
- Metode također mogu biti preopterećene u tijelu objekta.
Inicijalizacija deklaracije tipa objekta
Kao i druge komponente u PL/SQL, tipove objekata također je potrebno deklarirati prije njihove upotrebe u programu.
Jednom kada se tip objekta stvori, može se koristiti u deklarativnom odjeljku potprograma za deklariranje varijable tog tipa objekta.
Kad god je bilo koja varijabla deklarirana u potprogramu kao tip objekta, tijekom izvođenja će se stvoriti nova instanca tipa objekta, a ova novostvorena instanca može se referirati na naziv varijable. Na taj način, jedan tip objekta može pohraniti više vrijednosti pod različitim instancama.
DECLARE <variable_name> <object_type_name>; BEGIN . . END; /
Objašnjenje sintakse:
- Gornja sintaksa pokazuje deklaraciju varijable kao tipa objekta u deklarativnom odjeljku.
Jednom kada je varijabla deklarirana kao tip objekta u potprogramu, bit će atomski null, tj. cijeli objekt sam po sebi null. Potrebno ga je inicijalizirati s vrijednostima da bi se koristile u programu. Mogu se inicijalizirati pomoću konstruktora.
Konstruktori su implicitna metoda objekta koji se može referirati s istim imenom kao i tip objekta. Donja sintaksa prikazuje inicijalizaciju tipa objekta.
DECLARE <variable_name> <object_type_name>; BEGIN <variable_name>:=<object_type_name>(); END; /
Objašnjenje sintakse:
- Gornja sintaksa pokazuje inicijalizaciju instance tipa objekta s nultom vrijednošću.
- Sada sam objekt nije null jer je inicijaliziran, ali će atributi unutar objekta biti null jer tim atributima nismo dodijelili nikakve vrijednosti.
Konstruktori
Konstruktori su implicitna metoda objekta koji se može referirati s istim imenom kao i tip objekta. Kad god se objekt referira prvi put, ovaj konstruktor će biti pozvan implicitno.
Također možemo inicijalizirati objekte pomoću ovih konstruktora. Konstruktor se može eksplicitno definirati definiranjem člana u tijelu tipa objekta s istim imenom tipa objekta.
Primjer 1: U sljedećem primjeru koristit ćemo č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, prikazat ćemo iste pomoću člana tipa objekta. Također ćemo koristiti eksplicitni konstruktor za popunjavanje ID-a upravitelja prema zadanim postavkama s vrijednošću 1001 za drugi zapis.
Izvršit ćemo ga u koracima u nastavku.
- Step1:
- Stvori vrstu objekta
- Tijelo tipa objekta
- Korak 2: Stvaranje anonimnog bloka za pozivanje stvorenog tipa objekta putem implicitnog konstruktora za emp_no 1005.
- Korak 3: Stvaranje anonimnog bloka za pozivanje stvorenog tipa objekta putem eksplicitnog konstruktora za emp_no 1006.
Korak 1) Stvorite tip objekta i tijelo tipa objekta
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:
/
Objašnjenje koda
- Redak koda 1-9: Stvaranje tipa objekta 'emp_object' s 4 atributa i 3 člana. Sadrži definiciju konstruktora sa samo 3 parametra. (Stvarni implicitni konstruktor sadržavat će broj parametara jednak broju atributa prisutnih u tipu objekta)
- Kodna linija 10: Stvaranje tijela tipa.
- Redak koda 11-21: Definiranje eksplicitnog konstruktora. Dodjeljivanje vrijednosti parametra atributima i dodjeljivanje vrijednosti za atribut 'manager' sa zadanom vrijednošću '1001'.
- Redak koda 22-26: Definiranje člana 'insert_records' u kojem se vrijednosti atributa umeću u tablicu 'emp'.
- Redak koda 27-34: Definiranje člana 'display_records' u kojem se prikazuju vrijednosti atributa tipa objekta.
Izlaz
Vrsta je stvorena
Tijelo tipa stvoreno
Korak 2) Stvaranje anonimnog bloka za pozivanje stvorenog tipa objekta putem implicitnog konstruktora za emp_no 1005
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;
Objašnjenje koda
- Redak koda 37-45: Umetanje zapisa pomoću implicitnog konstruktora. Poziv konstruktoru sadrži stvarni broj vrijednosti atributa.
- Kodna linija 38: Deklariše guru_emp_det kao tip objekta 'emp_object'.
- Kodna linija 41: Izjava 'guru_emp_det.display_records' poziva funkciju člana 'diplay_records' i prikazuju se vrijednosti atributa
- Kodna linija 42: Izjava 'guru_emp_det.insert_records' zove funkciju člana 'insert_records' i vrijednosti atributa umetnute su u tablicu.
Izlaz
Ime zaposlenika: RRR
Broj zaposlenika: 1005
Plaća: 20000
Voditelj: 1000
Korak 3) Stvaranje anonimnog bloka za pozivanje stvorenog tipa objekta putem eksplicitnog konstruktora za emp_no 1006
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
Objašnjenje koda:
- Redak koda 46-53: Umetanje zapisa pomoću eksplicitnog konstruktora.
- Kodna linija 46: Deklariše guru_emp_det kao tip objekta 'emp_object'.
- Kodna linija 50: Izjava 'guru_emp_det.display_records' poziva funkciju člana 'display_records' i prikazuju se vrijednosti atributa
- Kodna linija 51: Izjava 'guru_emp_det.insert_records' zove funkciju člana 'insert_records' i vrijednosti atributa umetnute su u tablicu.
Nasljeđivanje u tipu objekta
Svojstvo nasljeđivanja omogućuje tipu pod-objekta pristup svim atributima i članovima tipa super-objekta ili nadređenog tipa objekta.
Tip pod-objekta naziva se tip naslijeđenog objekta, a tip super-objekta naziva se tip nadređenog objekta. Donja sintaksa pokazuje kako stvoriti nadređeni i naslijeđeni tip objekta.
CREATE TYPE <object_type_name_parent> AS OBJECT ( <attribute_l><datatype>, . . )NOT FINAL; /
Objašnjenje sintakse:
- Gornja sintaksa pokazuje stvaranje tipa SUPER.
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.
Example1: U donjem primjeru upotrijebit ćemo svojstvo nasljeđivanja za umetanje zapisa s ID-om upravitelja '1002' za sljedeći zapis ('RRR', 1007, 20000).
Izvršit ćemo gornji program u sljedećim koracima
- Korak 1: Stvorite SUPER vrstu.
- Korak 2: Stvorite SUB vrstu i tijelo.
- Korak 3: Stvaranje anonimnog bloka za pozivanje tipa SUB.
Korak 1) Napravite SUPER tip ili roditeljski tip.
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; /
Objašnjenje koda:
- Redak koda 1-9: Stvaranje tipa objekta 'emp_object' s 4 atributa i 3 člana. Sadrži definiciju konstruktora sa samo 3 parametra. Proglašen je kao 'NIJE KONAČAN' pa je nadređeni tip.
Korak 2) Stvorite SUB tip pod SUPER tipom.
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; /
Objašnjenje koda:
- Redak koda 10-13: Stvaranje sub_emp_objecta kao naslijeđenog tipa s dodatnim jednim atributom 'default_manager' i deklaracijom procedure člana.
- Kodna linija 14: Stvaranje tijela za naslijeđeni tip objekta.
- Kodna linija 16-21: Definiranje procedure člana koja ubacuje zapise u “emp” tablicu s vrijednostima iz tipa objekta 'SUPER', osim upraviteljske vrijednosti. Za vrijednost upravitelja koristi se 'default_manager' iz vrste 'SUB'.
Korak 3) Stvaranje anonimnog bloka za pozivanje tipa SUB
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; /
Objašnjenje koda:
- Kodna linija 25: Deklariranje 'guru_emp_det' kao tipa 'sub_emp_object'.
- Kodna linija 27: Inicijaliziranje objekta s implicitnim konstruktorom. Konstruktor ima 5 parametara (4 atributa iz PARENT tipa i 2 atributa iz SUB tipa). Posljednji parametar (1002) definira vrijednost za atribut default_manager
- Kodna linija 28: Pozivanje člana 'insert_default_mgr' za umetanje zapisa sa zadanim ID-om upravitelja proslijeđenim u konstruktoru.
Jednakost PL/SQL objekata
Instanca objekta koja pripada istim objektima može se usporediti radi jednakosti. Za ovo moramo imati posebnu metodu u tipu objekta koja se zove metoda 'ORDER'.
Ova metoda 'ORDER' trebala bi biti funkcija koja vraća numerički tip. Uzima dva parametra kao ulaz (prvi parametar: id instance vlastitog objekta, drugi parametar: id druge instance objekta).
Uspoređuje se ID dvije instance objekta, a rezultat se vraća u numeričkom obliku.
- Pozitivna vrijednost predstavlja da je instanca objekta SELF veća od druge instance.
- Negativna vrijednost predstavlja da je instanca objekta SELF manja od druge instance.
- Nula predstavlja da je instanca objekta SELF jednaka drugoj instanci.
- Ako je bilo koja od instanci null, tada će ova funkcija vratiti null.
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 koju je potrebno uključiti u tijelo tipa radi provjere jednakosti.
- Parametar za ovu funkciju trebao bi biti instanca istog tipa objekta.
- Gornja funkcija može se pozvati kao “obj_instance_1.match(obj_instance_2)” i ovaj izraz će vratiti numeričku vrijednost kao što je prikazano, gdje su obj_instance_1 i obj_instance_2 instanca object_type_name.
Primjer1: U sljedećem primjeru ćemo vidjeti kako usporediti dva objekta. Kreirat ćemo dvije instance i međusobno ćemo usporediti atribut 'plaća'. Napravit ćemo dva koraka.
- Korak 1: Stvaranje vrste i tijela objekta.
- Korak 2: Stvaranje anonimnog bloka za pozivanje usporedbe instance objekta.
Korak 1) Stvaranje vrste i tijela objekta.
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; /
Objašnjenje koda:
- Redak koda 1-4: Stvaranje tipa objekta 'emp_object_equality' s 1 atributom i 1 članom.
- Redak koda 6-16: Definiranje funkcije ORDER koja uspoređuje atribut 'plaća' instance SELF i tipa instance parametra. Vraća negativno ako je SELF plaća manja ili pozitivno ako je SELF plaća veća i 0 ako su plaće jednake.
Izlaz koda:
Vrsta je stvorena
Korak 2) Stvaranje anonimnog bloka za pozivanje usporedbe instance objekta.
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; /
Izlaz
Salary of second instance is greater
Objašnjenje koda:
- Kodna linija 20: Deklaracija l_obj_1 tipa emp_object_equality.
- Kodna linija 21: Deklaracija l_obj_2 tipa emp_object_equality.
- Kodna linija 23: Inicijaliziranje l_obj_1 s vrijednošću plaće '15000'
- Kodna linija 24: Inicijaliziranje l_obj_1 s vrijednošću plaće '17000'
- Redak koda 25-33: Ispišite poruku na temelju povratnog broja iz funkcije ORDER.
Rezime
U ovom poglavlju vidjeli smo tip objekta i njihova svojstva. Također smo razgovarali o konstruktorima, članovima, atributima, nasljeđivanju i jednakosti u PL/SQL objektima.


















