Co je typ objektu v PL / SQL?
Objektově orientované programování je zvláště vhodné pro vytváření opakovaně použitelných komponent a složitých aplikací. Jsou organizovány spíše kolem „objektů“ než „akcí“, tj. Programy jsou navrženy tak, aby fungovaly a interagovaly spíše s celým objektem než s jedinou akcí. Tento koncept umožňuje programátorovi naplnit a manipulovat s podrobnostmi na úrovni entit objektu.
Níže uvedený obrázek ukazuje příklad typu objektu, ve kterém je bankovní účet považován za entitu objektu. Atributy objektu zahrnují věci, které obsahují určité hodnoty atributů, například na bankovním účtu; je to číslo účtu, bankovní zůstatek atd., zatímco objektové metody popisují věci, jako je výpočet úrokové sazby, generování bankovního výpisu atd., které vyžadují dokončení určitého procesu.
V PL / SQL je objektově orientované programování založeno na typech objektů.
Typ objektu může představovat jakoukoli entitu reálného světa. V této kapitole budeme diskutovat o dalších typech objektů.
V tomto tutoriálu - naučíte se
- Složky typů objektů
- Vytvořte objekt v Oracle
- Inicializace deklarace typu objektu
- Konstruktéři
- Dědičnost v typu objektu
- Rovnost PL / SQL objektů
Složky typů objektů
Typ objektu PL / SQL obsahuje hlavně dvě složky.
- Atributy
- Členové / metody
Atributy
Atributy jsou sloupec nebo pole, ve kterém jsou uložena data. Každý atribut bude mapován na datový typ, který definuje typ zpracování a úložiště pro tento atribut. Atribut může mít jakýkoli platný datový typ PL / SQL nebo může mít jiný typ objektu.
Členové / metody
Členy nebo metody jsou podprogramy definované v typu objektu. Nepoužívají se k ukládání žádných dat. Používají se hlavně k definování procesu uvnitř typu objektu. Pro příklady ověřování dat před naplněním typu objektu. Jsou deklarovány v části typu objektu a definovány v části těla typu objektu typu objektu. Část těla v typu objektu je volitelnou součástí. Pokud nejsou přítomni žádní členové, pak typ objektu nebude obsahovat žádnou část těla.
Vytvořte objekt v Oracle
Typ objektu nelze vytvořit na úrovni podprogramu, lze je vytvořit pouze na úrovni schématu. Jakmile je ve schématu definován typ objektu, lze stejný použít v podprogramech. Typ objektu lze vytvořit pomocí „VYTVOŘIT TYP“. Tělo typu lze vytvořit až po vytvoření jeho typu objektu.
CREATE TYPEAS OBJECT( ,… );/CREATE TYPE BODY AS OBJECT(MEMBER[PROCEDURE|FUNCTION] IS BEGIN END;… );/
Vysvětlení syntaxe:
- Výše uvedená syntaxe ukazuje vytvoření 'OBJECT' s atributy a 'OBJECT-BODY' s metodami.
- Metody lze také přetížit v těle objektu.
Inicializace deklarace typu objektu
Stejně jako ostatní komponenty v PL / SQL je také nutné před použitím v programu deklarovat typy objektů.
Jakmile je typ objektu vytvořen, lze jej použít v deklarativní sekci podprogramu k deklaraci proměnné daného typu objektu.
Kdykoli je v podprogramu deklarována jakákoli proměnná jako typ objektu, za běhu bude vytvořena nová instance typu objektu a tato nově vytvořená instance může být odkazována na název proměnné. Tímto způsobem může jeden typ objektu ukládat více hodnot v různých instancích.
DECLARE;BEGIN… END;/
Vysvětlení syntaxe:
- Výše uvedená syntaxe ukazuje deklaraci proměnné jako typ objektu v deklarativní části.
Jakmile je proměnná deklarována jako typ objektu v podprogramu, bude atomicky null, tj. Celý objekt bude null. Aby bylo možné je použít v programu, je třeba jej inicializovat hodnotami. Mohou být inicializovány pomocí konstruktorů.
Konstruktory jsou implicitní metoda objektu, na kterou lze odkazovat se stejným názvem jako u typu objektu. Níže uvedená syntaxe ukazuje inicializaci typu objektu.
DECLARE;BEGIN := ();END;/
Vysvětlení syntaxe:
- Výše uvedená syntaxe ukazuje inicializaci instance typu objektu s nulovou hodnotou.
- Samotný objekt nyní není null, protože byl inicializován, ale atributy uvnitř objektu budou null, protože jsme těmto atributům nepřiřadili žádné hodnoty.
Konstruktéři
Konstruktory jsou implicitní metoda objektu, na kterou lze odkazovat se stejným názvem jako u typu objektu. Kdykoli se na objekt odkazuje poprvé, bude tento konstruktor volán implicitně.
Můžeme také inicializovat objekty pomocí těchto konstruktorů. Konstruktor lze definovat explicitně definováním člena v těle typu objektu se stejným názvem typu objektu.
Příklad 1 : V následujícím příkladu použijeme člena typu objektu k vložení záznamu do emp tabulky s hodnotami ('RRR', 1005, 20000, 1000) a ('PPP', 1006, 20000, 1001). Jakmile jsou data vložena, zobrazíme to samé pomocí člena typu objektu. Rovněž použijeme explicitní konstruktor k naplnění ID správce ve výchozím nastavení hodnotou 1001 pro druhý záznam.
Provedeme to v následujících krocích.
- Krok 1:
- Vytvořit typ objektu
- Tělo typu objektu
- Krok 2: Vytvoření anonymního bloku pro volání typu vytvořeného objektu prostřednictvím implicitního konstruktoru pro emp_no 1005.
- Krok 3: Vytvoření anonymního bloku pro volání typu vytvořeného objektu prostřednictvím explicitního konstruktoru pro emp_no 1006.
Krok 1) Vytvořte typ objektu a tělo typu objektu
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 ASCONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER,p_emp_name VARCHAR2,p_salary NUMBER)RETURN SELF AS RESULTISBEGINDbms_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_recordsISBEGININSERT INTO emp VALUES(emp_noemp_name,salary,manager);ENDMEMBER PROCEDURE display_recordsISBEGINDbms_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:/
Vysvětlení kódu
- Řádek kódu 1-9 : Vytvoření typu objektu 'emp_object' se 4 atributy a 3 členy. Obsahuje definici konstruktorů pouze s 3 parametry. (Skutečný implicitní konstruktor bude obsahovat počet parametrů rovný počtu atributů přítomných v typu objektu)
- Řádek kódu 10 : Vytvoření těla textu.
- Řádek kódu 11-21 : Definování explicitního konstruktoru. Přiřazení hodnoty parametru k atributům a přiřazení hodnoty pro atribut „manager“ s výchozí hodnotou „1001“.
- Řádek kódu 22-26 : Definování člena 'insert_records', ve kterém jsou hodnoty atributů vloženy do tabulky 'emp'.
- Řádek kódu 27-34 : Definování člena 'display_records', ve kterém se zobrazují 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
DECLAREguru_emp_det emp_object;BEGINguru_emp_det:=emp_object(1005,’RRR',20000,1000);guru_emp_det.display_records;guru_emp_det.insert_records;COMMIT;END;
Vysvětlení kódu
- Řádek kódu 37-45 : Vkládání záznamů pomocí implicitního konstruktoru. Volání konstruktoru obsahuje skutečný počet hodnot atributů.
- Řádek kódu 38 : Deklaruje guru_emp_det jako typ objektu 'emp_object'.
- Řádek kódu 41 : Příkaz 'guru_emp_det.display_records' nazvaný členská funkce 'diplay_records' a hodnoty atributů jsou zobrazeny
- Řádek kódu 42 : Příkaz „guru_emp_det.insert_records“ nazvaný členská funkce „insert_records“ a hodnoty atributů jsou vloženy do tabulky.
Výstup
Jméno zaměstnance: RRR
Počet zaměstnanců: 1005
Plat: 20000
Manažer: 1000
Krok 3) Vytvoření anonymního bloku pro volání vytvořeného typu objektu prostřednictvím explicitního konstruktoru pro emp_no 1006
DECLAREguru_emp_det emp_object;BEGINguru_emp_det:=emp_object(1006,'PPP',20000);guru_emp_det.display_records;guru_emp_det.insert_records;COMMIT;END;/
Výstup
Employee Name:PPPEmployee Number:1006Salary:20000Manager:1001
Vysvětlení kódu:
- Řádek kódu 46-53 : Vkládání záznamů pomocí explicitního konstruktoru.
- Řádek kódu 46 : Deklaruje guru_emp_det jako typ objektu 'emp_object'.
- Řádek kódu 50 : Příkaz 'guru_emp_det.display_records' nazvaný členská funkce 'display_records' a hodnoty atributů jsou zobrazeny
- Řádek kódu 51 : Příkaz „guru_emp_det.insert_records“ nazvaný členská funkce „insert_records“ a hodnoty atributů jsou vloženy do tabulky.
Dědičnost v typu objektu
Vlastnost dědičnosti umožňuje typu subobjektu přístup ke všem atributům a členům typu superobjektu nebo nadřazeného typu objektu.
Typ dílčího objektu se nazývá zděděný typ objektu a typ superobjektu se nazývá typ nadřazeného objektu. Níže uvedená syntaxe ukazuje, jak vytvořit nadřazený a zděděný typ objektu.
CREATE TYPEAS OBJECT( ,… )NOT FINAL;/
Vysvětlení syntaxe:
- Výše uvedená syntaxe ukazuje vytvoření typu SUPER.
CREATE TYPEUNDER ( ,.);/
Vysvětlení syntaxe:
- Výše uvedená syntaxe ukazuje vytvoření typu SUB. Obsahuje všechny členy a atributy z typu nadřazeného objektu.
Příklad 1: V níže uvedeném příkladu použijeme vlastnost dědičnosti k vložení záznamu s ID správce jako „1002“ pro následující záznam („RRR“, 1007, 20000).
Výše uvedený program provedeme v následujících krocích
- Krok 1: Vytvořte SUPER typ.
- Krok 2: Vytvořte typ a tělo SUB.
- Krok 3: Vytvoření anonymního bloku pro volání typu SUB.
Krok 1) Vytvořte SUPER typ nebo nadřazený typ.
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;/
Vysvětlení kódu:
- Řádek kódu 1-9 : Vytvoření typu objektu 'emp_object' se 4 atributy a 3 členy. Obsahuje definici konstruktorů pouze s 3 parametry. Bylo deklarováno jako „NEKONEČNÉ“, takže se jedná o nadřazený typ.
Krok 2) Vytvořte typ SUB pod typem SUPER.
CREATE OR REPLACE TYPE sub_emp_objectUNDER emp_object(default_manager NUMBER,MEMBER PROCEDURE insert_default_mgr);/CREATE OR REPLACE TYPE BODY sub_emp_objectASMEMBER PROCEDURE insert_default_mgrISBEGININSERT INTO empVALUES(emp_no,emp_name:salary,manager):END;END;/
Vysvětlení kódu:
- Řádek kódu 10-13 : Vytvoření sub_emp_object jako zděděného typu s dalším jedním atributem 'default_manager' a deklarací členské procedury.
- Řádek kódu 14 : Vytvoření těla pro typ zděděného objektu.
- Řádek kódu 1 6 -21 : Definování členské procedury, která vkládá záznamy do tabulky „emp“ s hodnotami z typu objektu „SUPER“, s výjimkou hodnoty správce. Pro hodnotu správce používá typ „default_manager“ typu „SUB“.
Krok 3) Vytvoření anonymního bloku pro volání typu SUB
DECLAREguru_emp_det sub_emp_object;BEGINguru_emp_det:= sub_emp_object(1007,'RRR',20000,1000,1002);guru_emp_det.insert_default_mgr;COMMIT;END;/
Vysvětlení kódu:
- Řádek kódu 25 : Deklarace typu „guru_emp_det“ jako typu „sub_emp_object“.
- Řádek kódu 27 : Inicializace objektu pomocí implicitního konstruktoru. Konstruktor má 5 parametrů (4 atributy z typu PARENT a 2 atributy z typu SUB). Poslední parametr (1002) definuje hodnotu atributu default_manager
- Řádek kódu 28 : Volání člena 'insert_default_mgr' k vložení záznamů s výchozím ID správce předaným v konstruktoru.
Rovnost PL / SQL objektů
Instanci objektu, který patří ke stejným objektům, lze porovnat pro rovnost. K tomu potřebujeme speciální metodu v typu objektu nazvanou metoda 'OBJEDNAT'.
Tato metoda „OBJEDNÁVKA“ by měla být funkcí, která vrací číselný typ. Jako vstup trvá dva parametry (první parametr: id instance samoobjektu, druhý parametr: id instance jiného objektu).
ID instance dvou objektů je porovnáno a výsledek je vrácen v číselné podobě.
- Kladná hodnota představuje, že instance objektu SELF je větší než jiná instance.
- Záporná hodnota představuje, že instance objektu SELF je menší než jiná instance.
- Nula znamená, že instance objektu SELF se rovná jiné instanci.
- Pokud má některá z instancí hodnotu null, vrátí tato funkce hodnotu null.
CREATE TYPE BODYAS OBJECT(ORDER MEMBER FUNCTION match( object_type_name_ 1)RETURN INTEGER IS BEGINIF parameter THENRETURN -1; --any negative number will doELSIF id>c.id THENRETURN 1; -any positive number will doELSERETURN 0;END IF;END;… );/
Vysvětlení syntaxe:
- Výše uvedená syntaxe ukazuje funkci OBJEDNÁVKA, kterou je třeba zahrnout do těla typu pro kontrolu rovnosti.
- Parametrem pro tuto funkci by měla být instance stejného typu objektu.
- Výše uvedenou funkci lze nazvat jako „obj_instance_1.match (obj_instance_2)“ a tento výraz vrátí číselnou hodnotu, jak je znázorněno, kde obj_instance_1 a obj_instance_2 jsou instancí object_type_name.
Příklad 1 : V následujícím příkladu uvidíme, jak porovnat dva objekty. Vytvoříme dvě instance a porovnáme mezi nimi atribut 'plat'. Uděláme dva kroky.
- Krok 1: Vytvoření typu a těla objektu.
- Krok 2: Vytvoření anonymního bloku pro volání porovnejte instanci objektu.
Krok 1) Vytvoření typu a těla objektu.
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 ASORDER MEMBER FUNCTION equals(c emp_object_equality)RETURN INTEGERISBEGIN IF salaryc.salaryTHEN RETURN 1;ELSERETURN 0;END IF: END;END;/
Vysvětlení kódu:
- Řádek kódu 1-4: Vytvoření typu objektu 'emp_object_equality' s 1 atributy a 1 členem.
- Řádek kódu 6-16 : Definování funkce OBJEDNÁVKA, která porovnává atribut 'plat' instance SELF a typu instance parametru. Vrací záporné, pokud je SELF plat nižší nebo kladný, pokud je SELF plat vyšší a 0, pokud jsou platy stejné.
Výstup kódu:
Typ vytvořen
Krok 2) Vytvoření anonymního bloku pro volání porovnejte instanci objektu.
DECLAREl_obj_l emp_object_equality;l_obj_2 emp_object_equality;BEGINl_obj_l:=emp_object_equality(15000);l_obj_2:=emp_object_equality(17000);IF l_obj_1.equalS(l_obj_2)>0THENDbms_output.put_line(’Salary of first instance is greater’):ELSIF l_obj_l.equalS(l_obj_2)<0THENDbms_output.put_line(’Salary of second instance is greater’);ELSEDbms_output.put_line(’Salaries are equal’);END IF;END;/
Výstup
Salary of second instance is greater
Vysvětlení kódu:
- Řádek kódu 20 : Deklarování l_obj_1 typu emp_object_equality.
- Řádek kódu 21 : Deklarování l_obj_2 typu emp_object_equality.
- Řádek kódu 23 : Inicializace l_obj_1 s hodnotou platu jako „15 000“
- Řádek kódu 24 : Inicializace l_obj_1 s hodnotou platu jako „17000“
- Řádek kódu 25-33 : Tisk zprávy na základě návratového čísla z funkce OBJEDNÁVKA.
souhrn
V této kapitole jsme viděli typ objektu a jeho vlastnosti. Také jsme diskutovali o konstruktorech, členech, atributech, dědičnosti a rovnosti v PL / SQL objektech.