Oracle Typy objektů PL/SQL: CREATE TYPE s příklady
⚡ Chytré shrnutí
Objektové typy v PL/SQL přinášejí objektově orientované programování do Oracle, což vám umožňuje modelovat entity reálného světa pomocí atributů a metod. Podporují konstruktory, dědičnost a porovnávání rovnosti, takže jeden typ na úrovni schématu může ukládat a zpracovávat strukturovaná data.

Co je typ objektu v PL/SQL?
Objektově orientované programování je obzvláště vhodné pro vytváření opakovaně použitelných komponent a složitých aplikací. Programy jsou organizovány kolem „objektů“ spíše než „akcí“; to znamená, že jsou navrženy tak, aby pracovaly a interagovaly s celým objektem, nikoli s jednou akcí. Tento přístup umožňuje programátorovi naplňovat a manipulovat s detaily na úrovni objekt-entita.
Obrázek níže znázorňuje příklad typu objektu, ve kterém je bankovní účet považován za objektovou entitu. Atributy objektu obsahují hodnoty – v případě bankovního účtu se jedná o číslo účtu, zůstatek na bankovním účtu atd. – zatímco metody objektu popisují akce, jako je výpočet úrokové sazby nebo generování bankovního výpisu, přičemž každá z nich vyžaduje dokončení určitého procesu.
In PL / SQLObjektově orientované programování je založeno na objektových typech. Objektový typ může reprezentovat jakoukoli entitu reálného světa. Následující části se zabývají objektovými typy, jejich komponentami a tím, jak je vytvářet a používat.
Komponenty typů objektů
Objektový typ PL/SQL obsahuje hlavně dvě komponenty.
- Atributy
- Členové/Metody
Atributy
Atributy jsou sloupce nebo pole, ve kterých jsou uložena data. Každý atribut je namapován na datový typ, který definuje typ zpracování a uložení pro daný atribut. Atribut může být libovolný platný. datový typ PL/SQL, nebo může být jiného typu objektu.
Členové/Metody
Členové nebo metody jsou podprogramy definované uvnitř objektového typu. Nepoužívají se k ukládání dat; místo toho definují zpracování prováděné uvnitř objektového typu – například ověřování dat před naplněním objektu. Jsou deklarovány ve specifikaci objektového typu a definovány v těle objektového typu. Tělo je volitelné: pokud nejsou přítomni žádní členové, objektový typ nemá žádnou část těla.
Vytvořit objekt v Oracle
Objektový typ nelze vytvořit na úrovni podprogramu; lze jej vytvořit pouze na úrovni schématu. Jakmile je objektový typ definován ve schématu, lze jej použít v podprogramech. Objektový typ se vytváří pomocí příkazu „CREATE TYPE“ a tělo typu lze vytvořit až poté, co jeho objektový typ existuje.
Níže uvedené snímky obrazovky ukazují syntaxi CREATE TYPE pro specifikaci objektu a syntaxi CREATE TYPE BODY, která definuje jeho metody.
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; . . ); /
Vysvětlení syntaxe:
- Výše uvedená syntaxe ukazuje vytvoření OBJEKTU s atributy a TĚLA OBJEKTU s metodami.
- Metody mohou být také přetíženy v těle objektu.
Deklarace Inicializace typu objektu
Stejně jako ostatní komponenty v PL/SQL musí být objektové typy deklarovány před jejich použitím v programu. Jakmile je objektový typ vytvořen, lze jej použít v deklarativní sekci podprogramu k deklaraci proměnné daného objektového typu.
Kdykoli je proměnná deklarována jako objektový typ, za běhu se vytvoří nová instance daného objektového typu a na tuto nově vytvořenou instanci se odkazuje názvem proměnné. Tímto způsobem může jeden objektový typ ukládat více hodnot pod různými instancemi.
Níže uvedený snímek obrazovky ukazuje deklaraci proměnné jako objektového typu uvnitř PL/SQL blok.
DECLARE <variable_name> <object_type_name>; BEGIN . . END; /
Vysvětlení syntaxe:
- Výše uvedená syntaxe ukazuje deklaraci proměnlivý jako objektový typ v deklarativní části.
Jakmile je proměnná deklarována jako objektový typ v podprogramu, je atomicky null – celý objekt samotný je null. Před použitím v programu musí být inicializována hodnotami. Objekty se inicializují pomocí konstruktorů.
Konstruktory jsou implicitní metody objektu, na které se lze odkazovat se stejným názvem jako má objektový typ. Následující snímek obrazovky ukazuje inicializaci instance objektového typu.
DECLARE <variable_name> <object_type_name>; BEGIN <variable_name>:=<object_type_name>(); END; /
Vysvětlení syntaxe:
- Výše uvedená syntaxe ukazuje inicializaci instance objektu s hodnotou null.
- Samotný objekt již není po inicializaci null, ale atributy uvnitř objektu zůstávají null, dokud jim nejsou přiřazeny hodnoty.
Konstruktory
Konstruktory jsou implicitní metody objektu, na které se lze odkázat se stejným názvem jako typ objektu. Kdykoli je na objekt odkazováno poprvé, je tento konstruktor implicitně volán.
Objekty můžete také inicializovat pomocí těchto konstruktorů. Konstruktor lze definovat explicitně definováním člena v těle objektu typu se stejným názvem jako objektový typ.
Příklad 1: V následujícím příkladu používáme člen typu objektu k vložení záznamů do tabulky emp s hodnotami ('RRR', 1005, 20000, 1000) a ('PPP', 1006, 20000, 1001). Po vložení dat je zobrazíme pomocí člena typu objektu. Také používáme explicitní konstruktor k naplnění ID manažera výchozí hodnotou 1001 pro druhý záznam.
Provedeme to v následujících krocích.
- Krok 1: Vytvořte typ objektu a tělo typu objektu.
- Krok 2: Vytvořte anonymní blok pro volání typu objektu pomocí implicitního konstruktoru pro emp_no 1005.
- Krok 3: Vytvořte anonymní blok pro volání typu objektu pomocí explicitního konstruktoru pro emp_no 1006.
Krok 1) Vytvořte typ objektu a tělo typu objektu.
Níže uvedený snímek obrazovky ukazuje vytváření specifikace typu objektu emp_object s jejími atributy a členy.
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); /
Níže uvedený snímek obrazovky ukazuje tělo typu emp_object, které je vytvářeno pomocí explicitního konstruktoru a členských procedur.
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 Vysvětlení
- Code řádek 1–9: Vytvoření objektu typu 'emp_object' se 4 atributy a 3 členy. Obsahuje definici konstruktoru pouze s 3 parametry. (Skutečný implicitní konstruktor obsahuje počet parametrů rovný počtu atributů přítomných v objektu typu.)
- Code řádek 10: Vytvoření těla typu.
- Code řádek 11–21: Definování explicitního konstruktoru. Přiřazení hodnot parametrů atributům a přiřazení atributu 'manager' výchozí hodnoty '1001'.
- Code řádek 22–26: Definování člena 'insert_records', ve kterém se hodnoty atributů vkládají do tabulky 'emp'.
- Code řádek 27–34: Definování člena 'display_records', který zobrazuje hodnoty atributů typu objektu.
Výstup:
Typ vytvořen
Tělo typu bylo vytvořeno
Krok 2) Vytvoření anonymního bloku pro volání vytvořeného typu objektu pomocí implicitního konstruktoru pro emp_no 1005.
Níže uvedený snímek obrazovky ukazuje anonymní blok, který volá emp_object prostřednictvím implicitního konstruktoru.
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 Vysvětlení
- Code řádek 37–45: Vkládání záznamů pomocí implicitního konstruktoru. Volání konstruktoru obsahuje skutečný počet hodnot atributů.
- Code řádek 38: Deklaruje 'guru_emp_det' jako typ objektu 'emp_object'.
- Code řádek 41: Příkaz 'guru_emp_det.display_records' volá člen 'display_records' a zobrazí se hodnoty atributů.
- Code řádek 42: Příkaz 'guru_emp_det.insert_records' volá člen 'insert_records' a hodnoty atributů jsou vloženy do tabulky. Blok poté potvrdí (commit). transakce.
Výstup:
Jméno zaměstnance: RRR
Číslo zaměstnance: 1005
Plat: 20000 XNUMX
Manažer: 1000
Krok 3) Vytvoření anonymního bloku pro volání vytvořeného typu objektu pomocí explicitního konstruktoru pro emp_no 1006.
Níže uvedený snímek obrazovky ukazuje anonymní blok, který volá emp_object pomocí explicitního konstruktoru se třemi argumenty.
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; /
Výstup
Employee Name:PPP Employee Number:1006 Salary:20000 Manager:1001
Code Vysvětlení:
- Code řádek 46–53: Vložení záznamu pomocí explicitního konstruktoru.
- Code řádek 46: Deklaruje 'guru_emp_det' jako typ objektu 'emp_object'.
- Code řádek 50: Příkaz 'guru_emp_det.display_records' volá člen 'display_records' a zobrazí se hodnoty atributů.
- Code řádek 51: Příkaz 'guru_emp_det.insert_records' volá člen 'insert_records' a hodnoty atributů jsou vloženy do tabulky. Protože se předávají pouze tři argumenty, explicitní konstruktor nastaví ID správce na jeho výchozí hodnotu 1001.
Dědičnost v typu objektu
Vlastnost dědičnosti umožňuje podobjektovému typu přístup ke všem atributům a členům nadřazeného typu objektu nebo nadřazeného typu objektu.
Podobjektový typ se nazývá zděděný typ objektu a nadřazený typ objektu se nazývá nadřazený typ objektu. Níže uvedená syntaxe ukazuje, jak vytvořit nadřazené a zděděné typy objektů. Níže uvedený snímek obrazovky ukazuje syntaxi nadřazeného typu (SUPER) označenou jako NOT FINAL.
CREATE TYPE <object_type_name_parent> AS OBJECT ( <attribute_l><datatype>, . . )NOT FINAL; /
Vysvětlení syntaxe:
- Výše uvedená syntaxe ukazuje vytvoření typu SUPER. Klauzule NOT FINAL umožňuje dědění typu.
Níže uvedený snímek obrazovky ukazuje zděděnou syntaxi typu (SUB) vytvořenou pomocí klíčového slova UNDER.
CREATE TYPE<object_type_name_sub>UNDER<object_type_name_parent> ( <attribute_l><datatype>, . ); /
Vysvětlení syntaxe:
- Výše uvedená syntaxe ukazuje vytvoření typu SUB. Obsahuje všechny členy a atributy z nadřazeného objektu typu.
Příklad 1: V níže uvedeném příkladu používáme vlastnost dědičnosti k vložení záznamu s ID manažera '1002' pro daný záznam ('RRR', 1007, 20000). Program spouštíme v následujících krocích.
- Krok 1: Vytvořte typ SUPER.
- Krok 2: Vytvořte typ a tělo SUB.
- Krok 3: Vytvořte anonymní blok pro volání typu SUB.
Krok 1) Vytvořte typ SUPER nebo nadřazený typ.
Níže uvedený snímek obrazovky ukazuje vytvoření supertypu emp_object pomocí 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 Vysvětlení:
- Code řádek 1–9: Vytvoření objektu typu 'emp_object' se 4 atributy a 3 členy. Obsahuje definici konstruktoru pouze s 3 parametry. Byl deklarován jako 'NOT FINAL', takže se jedná o nadřazený typ.
Krok 2) Vytvořte typ SUB pod typem SUPER.
Níže uvedený snímek obrazovky ukazuje zděděný typ sub_emp_object a jeho vytvářené tělo.
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 Vysvětlení:
- Code řádek 10–13: Vytvoření 'sub_emp_object' jako zděděného typu s jedním dalším atributem 'default_manager' a deklarací členské procedury.
- Code řádek 14: Vytvoření těla pro zděděný typ objektu.
- Code řádek 16–21: Definování členské procedury, která vkládá záznamy do tabulky 'emp' s hodnotami z objektu typu SUPER, s výjimkou hodnoty manager. Pro hodnotu manager se používá 'default_manager' z typu SUB.
Krok 3) Vytvoření anonymního bloku pro volání typu SUB.
Níže uvedený snímek obrazovky ukazuje anonymní blok, který volá typ SUB a vkládá výchozí ID správce.
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 Vysvětlení:
- Code řádek 25: Deklarace 'guru_emp_det' jako typu 'sub_emp_object'.
- Code řádek 27: Inicializace objektu implicitním konstruktorem. Konstruktor má 5 parametrů (4 atributy typu PARENT a 1 atribut typu SUB). Poslední parametr (1002) definuje hodnotu atributu default_manager.
- Code řádek 28: Volání člena 'insert_default_mgr' pro vložení záznamu s výchozím ID správce předaným v konstruktoru.
Rovnost PL/SQL objektů
Instance objektů, které patří ke stejnému typu objektu, lze porovnávat z hlediska rovnosti. K tomu je pro daný typ objektu potřeba speciální metoda zvaná metoda ORDER.
Tato metoda ORDER by měla být funkce, která vrací číselný typ. Jako vstup přijímá dva parametry (první parametr: ID instance vlastního objektu; druhý parametr: ID jiné instance objektu).
ID obou instancí objektu jsou porovnána a výsledek je vrácen jako číslo.
- Kladná hodnota značí, že instance objektu SELF je větší než druhá instance.
- Záporná hodnota znamená, že instance objektu SELF je menší než druhá instance.
- Nula značí, že instance objektu SELF je rovna druhé instanci.
- Pokud je některá z instancí null, funkce vrátí hodnotu null.
Níže uvedený snímek obrazovky ukazuje syntaxi členské funkce ORDER, která musí být zahrnuta v těle typu pro kontrolu rovnosti.
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; . . ); /
Vysvětlení syntaxe:
- Výše uvedená syntaxe ukazuje funkci ORDER, která musí být zahrnuta v těle typu pro kontrolu rovnosti.
- Parametr pro tuto funkci by měl být instancí stejného typu objektu.
- Funkci lze volat jako „obj_instance_1.match(obj_instance_2)“ a tento výraz vrací zobrazenou číselnou hodnotu, kde obj_instance_1 a obj_instance_2 jsou instance daného typu objektu.
Příklad 1: V následujícím příkladu porovnáme dva objekty. Vytvoříme dvě instance a porovnáme mezi nimi atribut 'plat'. Provedeme to ve dvou krocích.
- Krok 1: Vytvořte typ a tělo objektu.
- Krok 2: Vytvořte anonymní blok pro porovnání instancí objektů.
Krok 1) Vytvoření typu a těla objektu.
Níže uvedené snímky obrazovky ukazují specifikaci emp_object_equality a její tělo, které definuje funkci ORDER porovnávající 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 Vysvětlení:
- Code řádek 1–4: Vytvoření objektu typu 'emp_object_equality' s 1 atributem a 1 členem.
- Code řádek 6–16: Definování funkce ORDER, která porovnává atribut 'plat' instance SELF a instance parametru. Vrací zápornou hodnotu, pokud je plat SELF nižší, kladnou hodnotu, pokud je plat SELF vyšší, a 0, pokud jsou platy stejné.
Code Výstup:
Typ vytvořen
Krok 2) Vytvoření anonymního bloku pro porovnání instancí objektů.
Níže uvedený snímek obrazovky ukazuje anonymní blok, který porovnává dvě instance emp_object_equality podle platu.
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; /
Výstup
Salary of second instance is greater
Code Vysvětlení:
- Code řádek 20: Deklarace 'l_obj_1' typu 'emp_object_equality'.
- Code řádek 21: Deklarace 'l_obj_2' typu 'emp_object_equality'.
- Code řádek 23: Inicializace 'l_obj_1' s hodnotou platu '15000'.
- Code řádek 24: Inicializace 'l_obj_2' s hodnotou platu '17000'.
- Code řádek 25–33: Výpis zprávy na základě čísla vráceného funkcí ORDER.


















