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;

Zanechte komentář

Vaše emailová adresa nebude zobrazena. Povinná pole jsou označena *