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.

Typy objektů v PL/SQL

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.

  1. Atributy
  2. Č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.

Vytvořit objekt v OracleVytvořit objekt v Oracle

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.

Deklarace Inicializace typu objektu

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.

Deklarace Inicializace 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

Konstruktory

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);
/

Konstruktory

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

Konstruktory

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

Konstruktory

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.

Dědičnost v typu 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.

Dědičnost v typu objektu

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.

Dědičnost v 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(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.

Dědičnost v typu objektu

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

Dědičnost v typu objektu

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.

Rovnost PL/SQL objektů

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.

Rovnost PL/SQL objektů

Rovnost PL/SQL objektů

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.

Rovnost PL/SQL objektů

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.