PL/SQL v příkladech / Objekt
Objektově orientované programování není devizou pouze vyšších jazyků, velmi podobného principu jde docílit i v PL/SQL pomocí speciálního typu OBJECT. Třída, resp. objekt je definován stejně jako např. package, tedy předpisem a samotným tělem.
Konstruktor
Způsob, jak inicializovat objekt a jeho vnitřní hodnoty, určuje konstruktor. Každý objekt má vždy jeden výchozí, u kterého je počet vstupních parametrů rovný počtu proměnných specifikovaných ve veřejné části. Je ale samozřejmě možné si vytvořit i konstruktory s jiným počtem parametrů a vlastní logikou.
CREATE OR REPLACE TYPE Zamestnanec_T AS OBJECT(
CeleJmeno VARCHAR2(100)
, Plat NUMBER
, CONSTRUCTOR FUNCTION Zamestnanec_T
RETURN SELF AS RESULT
, CONSTRUCTOR FUNCTION Zamestnanec_T(
p_Jmeno VARCHAR2
, p_Prijmeni VARCHAR2
, p_Plat NUMBER
) RETURN SELF AS RESULT
);
/
CREATE OR REPLACE TYPE BODY Zamestnanec_T AS
CONSTRUCTOR FUNCTION Zamestnanec_T
RETURN SELF AS RESULT
IS
BEGIN
CeleJmeno:='N/A';
Plat:=0;
RETURN;
END;
CONSTRUCTOR FUNCTION Zamestnanec_T(
p_Jmeno VARCHAR2
, p_Prijmeni VARCHAR2
, p_Plat NUMBER
) RETURN SELF AS RESULT
IS
BEGIN
CeleJmeno:=p_Jmeno||' '||p_Prijmeni;
Plat:=p_Plat;
RETURN;
END;
END;
/
Použití všech tří konstruktorů v praxi. Za povšimnutí stojí absence klíčového slova NEW, kterým se instanciace uvozuje v jiných jazycích.
DECLARE
l_Zamestnanec Zamestnanec_T;
BEGIN
-- použití bezparametrického konstruktoru
l_Zamestnanec:=Zamestnanec_T();
dbms_output.put_line(l_Zamestnanec.CeleJmeno||', '||l_Zamestnanec.Plat);
-- N/A, 0
-- použití implicitního konstruktoru
l_Zamestnanec:=Zamestnanec_T('Franta Vomacka', 20000);
dbms_output.put_line(l_Zamestnanec.CeleJmeno||', '||l_Zamestnanec.Plat);
-- Franta Vomacka, 20000
-- použití konstruktoru se třemi parametry
l_Zamestnanec:=Zamestnanec_T('Petr', 'Novak', 30000);
dbms_output.put_line(l_Zamestnanec.CeleJmeno||', '||l_Zamestnanec.Plat);
-- Petr Novak, 30000
END;
Funkce a procedury
Kromě konstruktorů je v objektu dále možné definovat funkce a procedury. Ty lze využít převážně pro manipulaci s atributy objektu, což demonstruje následující jednoduchý příklad.
CREATE OR REPLACE TYPE Zamestnanec_T AS OBJECT(
CeleJmeno VARCHAR2(100)
, Plat NUMBER
, MEMBER FUNCTION mf_Vypis(
p_Oddelovac CHAR:=', '
) RETURN VARCHAR2
, MEMBER PROCEDURE mp_Vymaz
);
/
CREATE OR REPLACE TYPE BODY Zamestnanec_T AS
MEMBER FUNCTION mf_Vypis(
p_Oddelovac CHAR:=', '
) RETURN VARCHAR2
IS
BEGIN
IF (CeleJmeno IS NOT NULL) THEN
RETURN CeleJmeno||p_Oddelovac||Plat;
ELSE
RETURN 'N/A';
END IF;
END;
MEMBER PROCEDURE mp_Vymaz
IS
BEGIN
CeleJmeno:=NULL;
Plat:=NULL;
END;
END;
/
Jak k atributům, tak i k funkcím a procedurám objektu se přistupuje pomocí tečkové notace.
DECLARE
l_Zamestnanec Zamestnanec_T;
BEGIN
l_Zamestnanec:=Zamestnanec_T('Franta Vomacka', 20000);
dbms_output.put_line(l_Zamestnanec.mf_Vypis); -- Franta Vomacka, 20000
l_Zamestnanec.mp_Vymaz;
dbms_output.put_line(l_Zamestnanec.mf_Vypis); -- N/A
END;