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;