PL / SQL - obiektowy

W tym rozdziale omówimy język PL / SQL zorientowany obiektowo. PL / SQL umożliwia zdefiniowanie typu obiektu, co pomaga w projektowaniu obiektowej bazy danych w Oracle. Typ obiektu umożliwia tworzenie typów złożonych. Korzystanie z obiektów pozwala na implementację obiektów świata rzeczywistego o określonej strukturze danych i metodach ich obsługi. Obiekty mają atrybuty i metody. Atrybuty są właściwościami obiektu i służą do przechowywania stanu obiektu; i metody są używane do modelowania jego zachowania.

Obiekty są tworzone za pomocą instrukcji CREATE [OR REPLACE] TYPE. Poniżej znajduje się przykład tworzenia prostego plikuaddress obiekt składający się z kilku atrybutów -

CREATE OR REPLACE TYPE address AS OBJECT 
(house_no varchar2(10), 
 street varchar2(30), 
 city varchar2(20), 
 state varchar2(10), 
 pincode varchar2(10) 
); 
/

Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -

Type created.

Stwórzmy jeszcze jeden obiekt customer gdzie będziemy zawijać attributes i methods razem, aby mieć poczucie zorientowania na obiekt -

CREATE OR REPLACE TYPE customer AS OBJECT 
(code number(5), 
 name varchar2(30), 
 contact_no varchar2(12), 
 addr address, 
 member procedure display 
); 
/

Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -

Type created.

Tworzenie wystąpienia obiektu

Zdefiniowanie typu obiektu zapewnia plan dla obiektu. Aby użyć tego obiektu, musisz utworzyć instancje tego obiektu. Dostęp do atrybutów i metod obiektu można uzyskać przy użyciu nazwy instancji ithe access operator (.) w następujący sposób -

DECLARE 
   residence address; 
BEGIN 
   residence := address('103A', 'M.G.Road', 'Jaipur', 'Rajasthan','201301'); 
   dbms_output.put_line('House No: '|| residence.house_no); 
   dbms_output.put_line('Street: '|| residence.street); 
   dbms_output.put_line('City: '|| residence.city); 
   dbms_output.put_line('State: '|| residence.state); 
   dbms_output.put_line('Pincode: '|| residence.pincode); 
END; 
/

Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -

House No: 103A 
Street: M.G.Road 
City: Jaipur 
State: Rajasthan 
Pincode: 201301  

PL/SQL procedure successfully completed.

Metody członkowskie

Member methods są używane do manipulowania plikiem attributesobiektu. Deklarację metody składowej podaje się podczas deklarowania typu obiektu. Treść obiektu definiuje kod metod składowych. Treść obiektu jest tworzona za pomocą instrukcji CREATE TYPE BODY.

Constructorsto funkcje, które zwracają nowy obiekt jako jego wartość. Każdy obiekt ma zdefiniowaną przez system metodę konstruktora. Nazwa konstruktora jest taka sama, jak typ obiektu. Na przykład -

residence := address('103A', 'M.G.Road', 'Jaipur', 'Rajasthan','201301');

Plik comparison methodssłużą do porównywania obiektów. Istnieją dwa sposoby porównywania obiektów -

Metoda mapy

Plik Map methodjest funkcją zaimplementowaną w taki sposób, że jej wartość zależy od wartości atrybutów. Na przykład w przypadku obiektu klienta, jeśli kod klienta jest taki sam dla dwóch klientów, obaj klienci mogą być tacy sami. Zatem związek między tymi dwoma obiektami zależałby od wartości kodu.

Sposób zamawiania

Plik Order methodimplementuje pewną wewnętrzną logikę do porównywania dwóch obiektów. Na przykład w przypadku obiektu prostokątnego prostokąt jest większy niż inny prostokąt, jeśli oba jego boki są większe.

Korzystanie z metody Map

Spróbujmy zrozumieć powyższe pojęcia, używając następującego obiektu prostokąta -

CREATE OR REPLACE TYPE rectangle AS OBJECT 
(length number, 
 width number, 
 member function enlarge( inc number) return rectangle, 
 member procedure display, 
 map member function measure return number 
); 
/

Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -

Type created.

Tworzenie treści typu -

CREATE OR REPLACE TYPE BODY rectangle AS 
   MEMBER FUNCTION enlarge(inc number) return rectangle IS 
   BEGIN 
      return rectangle(self.length + inc, self.width + inc); 
   END enlarge;  
   MEMBER PROCEDURE display IS 
   BEGIN  
      dbms_output.put_line('Length: '|| length); 
      dbms_output.put_line('Width: '|| width); 
   END display;  
   MAP MEMBER FUNCTION measure return number IS 
   BEGIN 
      return (sqrt(length*length + width*width)); 
   END measure; 
END; 
/

Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -

Type body created.

Teraz używając obiektu rectangle i jego funkcji składowych -

DECLARE 
   r1 rectangle; 
   r2 rectangle; 
   r3 rectangle; 
   inc_factor number := 5; 
BEGIN 
   r1 := rectangle(3, 4); 
   r2 := rectangle(5, 7); 
   r3 := r1.enlarge(inc_factor); 
   r3.display;  
   IF (r1 > r2) THEN -- calling measure function 
      r1.display; 
   ELSE 
      r2.display; 
   END IF; 
END; 
/

Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -

Length: 8 
Width: 9 
Length: 5 
Width: 7  

PL/SQL procedure successfully completed.

Korzystanie z metody zamawiania

Teraz same effect could be achieved using an order method. Odtwórzmy prostokątny obiekt za pomocą metody zamówienia -

CREATE OR REPLACE TYPE rectangle AS OBJECT 
(length number, 
 width number, 
 member procedure display, 
 order member function measure(r rectangle) return number 
); 
/

Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -

Type created.

Tworzenie treści typu -

CREATE OR REPLACE TYPE BODY rectangle AS 
   MEMBER PROCEDURE display IS 
   BEGIN 
      dbms_output.put_line('Length: '|| length); 
      dbms_output.put_line('Width: '|| width); 
   END display;  
   ORDER MEMBER FUNCTION measure(r rectangle) return number IS 
   BEGIN 
      IF(sqrt(self.length*self.length + self.width*self.width)> 
         sqrt(r.length*r.length + r.width*r.width)) then 
         return(1); 
      ELSE 
         return(-1); 
      END IF; 
   END measure; 
END; 
/

Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -

Type body created.

Korzystanie z obiektu prostokątnego i jego funkcji składowych -

DECLARE 
   r1 rectangle; 
   r2 rectangle; 
BEGIN 
   r1 := rectangle(23, 44); 
   r2 := rectangle(15, 17); 
   r1.display; 
   r2.display; 
   IF (r1 > r2) THEN -- calling measure function 
      r1.display; 
   ELSE 
      r2.display; 
   END IF; 
END; 
/

Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -

Length: 23 
Width: 44 
Length: 15 
Width: 17 
Length: 23 
Width: 44 

PL/SQL procedure successfully completed.

Dziedziczenie dla obiektów PL / SQL

PL / SQL umożliwia tworzenie obiektów z istniejących obiektów bazowych. Aby zaimplementować dziedziczenie, obiekty bazowe powinny być zadeklarowane jakoNOT FINAL. Wartość domyślna toFINAL.

Poniższe programy ilustrują dziedziczenie w obiektach PL / SQL. Stwórzmy kolejny obiekt o nazwieTableTop, jest to dziedziczone z obiektu Rectangle. W tym celu musimy utworzyć podstawowy obiekt prostokątny -

CREATE OR REPLACE TYPE rectangle AS OBJECT 
(length number, 
 width number, 
 member function enlarge( inc number) return rectangle, 
 NOT FINAL member procedure display) NOT FINAL 
/

Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -

Type created.

Tworzenie treści typu podstawowego -

CREATE OR REPLACE TYPE BODY rectangle AS 
   MEMBER FUNCTION enlarge(inc number) return rectangle IS 
   BEGIN 
      return rectangle(self.length + inc, self.width + inc); 
   END enlarge;  
   MEMBER PROCEDURE display IS 
   BEGIN 
      dbms_output.put_line('Length: '|| length); 
      dbms_output.put_line('Width: '|| width); 
   END display; 
END; 
/

Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -

Type body created.

Tworzenie blatu obiektu potomnego -

CREATE OR REPLACE TYPE tabletop UNDER rectangle 
(   
   material varchar2(20), 
   OVERRIDING member procedure display 
) 
/

Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -

Type created.

Tworzenie treści typu dla blatu obiektu podrzędnego

CREATE OR REPLACE TYPE BODY tabletop AS 
OVERRIDING MEMBER PROCEDURE display IS 
BEGIN 
   dbms_output.put_line('Length: '|| length); 
   dbms_output.put_line('Width: '|| width); 
   dbms_output.put_line('Material: '|| material); 
END display; 
/

Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -

Type body created.

Korzystanie z obiektu blatu i jego funkcji składowych -

DECLARE 
   t1 tabletop; 
   t2 tabletop; 
BEGIN 
   t1:= tabletop(20, 10, 'Wood'); 
   t2 := tabletop(50, 30, 'Steel'); 
   t1.display; 
   t2.display; 
END;
/

Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -

Length: 20 
Width: 10 
Material: Wood 
Length: 50 
Width: 30 
Material: Steel  

PL/SQL procedure successfully completed.

Obiekty abstrakcyjne w PL / SQL

Plik NOT INSTANTIABLEklauzula umożliwia zadeklarowanie abstrakcyjnego obiektu. Nie możesz użyć abstrakcyjnego obiektu takim, jakim jest; będziesz musiał utworzyć podtyp lub typ podrzędny takich obiektów, aby móc korzystać z ich funkcjonalności.

Na przykład,

CREATE OR REPLACE TYPE rectangle AS OBJECT 
(length number, 
 width number, 
 NOT INSTANTIABLE NOT FINAL MEMBER PROCEDURE display)  
 NOT INSTANTIABLE NOT FINAL 
/

Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -

Type created.