Oracle Výukový program pro typy objektů PL/SQL s PŘÍKLADY
Co je typ objektu v PL/SQL?
Objektově orientované programování je zvláště vhodné pro vytváření opakovaně použitelných komponent a komplexních aplikací. Jsou organizovány spíše kolem „objektů“ než „akcí“, tj. programy jsou navrženy tak, aby pracovaly a interagovaly s celým objektem spíše než s jedinou akcí. Tento koncept umožňuje programátorovi naplnit a manipulovat s detaily na úrovni objektových entit.
Níže uvedený obrázek znázorňuje příklad typu objektu, ve kterém je bankovní účet považován za objekt objektu. Atributy objektu zahrnují věci, které obsahují některé hodnoty atributů, například v Bankovním účtu; je to číslo účtu, zůstatek v bance 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 objektových typech.
Typ objektu může představovat jakoukoli entitu reálného světa. V této kapitole probereme více typů objektů.
Komponenty typů objektů
PL / SQL objektový typ obsahuje především 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 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, které jsou definovány v typu objektu. Neslouží k ukládání žádných dat. Používají se hlavně k definování procesu uvnitř typu objektu. Příklady ověření dat před naplněním typu objektu. Jsou deklarovány v sekci typ objektu a definovány v sekci těla typu objektu typu objektu. Část těla v typu objektu je volitelná část. Pokud nejsou přítomni žádní členové, nebude typ objektu obsahovat žádnou část těla.
Vytvořit objekt v Oracle
Typ objektu nelze vytvořit na úrovni podprogramu, lze jej vytvořit pouze na úrovni schématu. Jakmile je typ objektu definován ve schématu, lze jej použít v podprogramech. Typ objektu lze vytvořit pomocí 'CREATE TYPE'. Tělo typu lze vytvořit až po vytvoření jeho typu objektu.
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í 'OBJECT' s atributy a 'OBJECT-BODY' 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 je také potřeba deklarovat typy objektů před jejich použitím v programu.
Jakmile je objektový typ vytvořen, může být použit v deklarativní sekci podprogramu k deklaraci proměnné tohoto typu objektu.
Kdykoli je jakákoli proměnná deklarována v podprogramu jako typ objektu, za běhu se vytvoří nová instance typu objektu a na tuto nově vytvořenou instanci lze odkazovat jménem proměnné. Tímto způsobem může jeden typ objektu ukládat více hodnot pod různými instancemi.
DECLARE <variable_name> <object_type_name>; BEGIN . . END; /
Vysvětlení syntaxe:
- Výše uvedená syntaxe ukazuje deklaraci proměnné jako objektového typu v deklarativní části.
Jakmile je proměnná deklarována jako typ objektu v podprogramu, bude atomicky nulová, tj. celý objekt sám o sobě bude nulový. Aby bylo možné je použít v programu, musí být inicializován s hodnotami. Lze je inicializovat pomocí konstruktorů.
Konstruktory jsou implicitní metodou objektu, na kterou lze odkazovat se stejným názvem, jako má typ objektu. Níže uvedená syntaxe ukazuje inicializaci typu objektu.
DECLARE <variable_name> <object_type_name>; BEGIN <variable_name>:=<object_type_name>(); END; /
Vysvětlení syntaxe:
- Výše uvedená syntaxe ukazuje inicializaci instance typu objektu s hodnotou null.
- Nyní samotný objekt 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.
Konstruktory
Konstruktory jsou implicitní metodou objektu, na kterou lze odkazovat se stejným názvem, jako má typ objektu. Kdykoli je objekt odkazován poprvé, bude tento konstruktor volán implicitně.
Pomocí těchto konstruktorů můžeme objekty také inicializovat. Konstruktor lze definovat explicitně definováním člena v těle typu objektu se stejným názvem jako typ objektu.
Příklad 1: V následujícím příkladu použijeme člen 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 totéž pomocí člena typu objektu. Také použijeme explicitní konstruktor k naplnění id manažera ve výchozím nastavení hodnotou 1001 pro druhý záznam.
Provedeme to v níže uvedených krocích.
- Step1:
- Vytvořit typ objektu
- Tělo typu objektu
- Krok 2: Vytvoření anonymního bloku pro volání vytvořeného typu objektu prostřednictvím implicitního konstruktoru pro emp_no 1005.
- 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.
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 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: /
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 se 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 typu.
- Řádek kódu 11-21: Definování explicitního konstruktoru. Přiřazení hodnoty parametru atributům a přiřazení hodnoty atributu '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 prostřednictvím implicitního konstruktoru pro 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;
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: Zobrazí se příkaz 'guru_emp_det.display_records' nazvaný členská funkce 'diplay_records' a hodnoty atributů
- Řá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
Čí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 prostřednictvím explicitního konstruktoru pro 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; /
Výstup
Employee Name:PPP Employee Number:1006 Salary:20000 Manager: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: Zobrazí se příkaz 'guru_emp_det.display_records' nazvaný členská funkce 'display_records' a hodnoty atributů
- Řá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 Inheritance umožňuje typu dílčího objektu přístup ke všem atributům a členům typu super objektu nebo typu nadřazeného objektu.
Dílčí typ objektu se nazývá zděděný typ objektu a typ super objektu se nazývá rodičovský typ objektu. Níže uvedená syntaxe ukazuje, jak vytvořit nadřazený a zděděný typ objektu.
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.
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 typu objektu.
Příklad1: V níže uvedeném příkladu použijeme vlastnost inheritance k vložení záznamu s ID správce jako '1002' pro následující záznam ('RRR', 1007, 20000).
Výše uvedený program spustíme 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 typ SUPER 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 se 3 parametry. Byl deklarován jako 'NOT FINAL', takže je to nadřazený typ.
Krok 2) Vytvořte typ SUB pod typem SUPER.
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; /
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 zděděný typ objektu.
- Řádek kódu 16-21: Definování členské procedury, která vkládá záznamy do „emp“ tabulky s hodnotami z objektového typu 'SUPER', kromě hodnoty manažera. Pro hodnotu manažera používá 'default_manager' z typu 'SUB'.
Krok 3) Vytvoření anonymního bloku pro volání typu 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; /
Vysvětlení kódu:
- Řádek kódu 25: Deklarování 'guru_emp_det' jako 'sub_emp_object' typu.
- Řá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 pro atribut default_manager
- Řádek kódu 28: Volání člena 'insert_default_mgr' pro vložení záznamů s výchozím ID správce předaným v konstruktoru.
Rovnost PL/SQL objektů
Instance objektu, která patří ke stejným objektům, lze porovnat z hlediska rovnosti. K tomu potřebujeme mít speciální metodu v objektovém typu nazvanou metoda 'ORDER'.
Tato metoda 'ORDER' by měla být funkcí, která vrací číselný typ. Jako vstup přebírá dva parametry (první parametr: id instance vlastního objektu, druhý parametr: id instance jiného objektu).
Porovná se id instance dvou objektů a výsledek se vrátí v numerické 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 je rovna jiné instanci.
- Pokud je některá z instancí null, pak tato funkce vrátí hodnotu 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; . . ); /
Vysvětlení syntaxe:
- Výše uvedená syntaxe ukazuje funkci ORDER, která musí být zahrnuta do těla typu pro kontrolu rovnosti.
- Parametr pro tuto funkci by měl být instancí stejného typu objektu.
- Výše uvedená funkce může být volána 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 instance objektu název_typu_objektu.
Příklad1: V následujícím příkladu uvidíme, jak porovnat dva objekty. Vytvoříme dvě instance a mezi nimi porovnáme atribut 'plat'. Uděláme dva kroky.
- Krok 1: Vytvoření typu objektu a těla.
- Krok 2: Vytvoření anonymního bloku pro volání porovnání instance objektu.
Krok 1) Vytvoření typu objektu a těla.
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; /
Vysvětlení kódu:
- Řádek 1–4 kódu: Vytvoření typu objektu 'emp_object_equality' s 1 atributy a 1 členem.
- Řádek kódu 6-16: Definování funkce ORDER, která porovnává atribut 'plat' instance SELF a typ instance parametru. Vrací zápornou hodnotu, pokud je plat SELF menší nebo kladný, pokud je plat SELF vyšší, a 0, pokud jsou platy stejné.
Výstup kódu:
Typ vytvořen
Krok 2) Vytvoření anonymního bloku pro volání porovnání instance objektu.
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; /
Výstup
Salary of second instance is greater
Vysvětlení kódu:
- Řádek kódu 20: Deklaruje l_obj_1 typu emp_object_equality.
- Řádek kódu 21: Deklaruje l_obj_2 typu emp_object_equality.
- Řádek kódu 23: Inicializace l_obj_1 s hodnotou platu '15000'
- Řádek kódu 24: Inicializace l_obj_1 s hodnotou platu '17000'
- Řádek kódu 25-33: Tisk zprávy na základě návratového čísla z funkce OBJEDNÁVKA.
Shrnutí
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 objektech PL/SQL.