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.