Oracle Samouczek dotyczący typów obiektów PL/SQL z PRZYKŁADAMI
Co to jest typ obiektu w PL/SQL?
Programowanie obiektowe jest szczególnie odpowiednie do budowania komponentów wielokrotnego użytku i złożonych aplikacji. Są one organizowane wokół „obiektów”, a nie „akcji”, tzn. programy są projektowane do pracy i interakcji z całym obiektem, a nie pojedynczą akcją. Ta koncepcja pozwala programiście wypełniać i manipulować szczegółami na poziomie encji obiektu.
Poniższy rysunek przedstawia przykładowy typ obiektu, w którym rachunek bankowy jest traktowany jako podmiot obiektowy. Atrybuty obiektu obejmują rzeczy, które posiadają pewne wartości atrybutów, na przykład Konto Bankowe; jest to numer konta, saldo bankowe itp., podczas gdy metody obiektowe opisują takie rzeczy, jak obliczanie stopy procentowej, generowanie wyciągu bankowego itp., które wymagają zakończenia określonego procesu.
W PL/SQL programowanie obiektowe opiera się na typach obiektów.
Typ obiektu może reprezentować dowolną jednostkę ze świata rzeczywistego. W tym rozdziale omówimy więcej typów obiektów.
Składniki typów obiektów
PL / SQL typ obiektu zawiera głównie dwa komponenty.
- Atrybuty
- Członkowie/Metody
Atrybuty
Atrybuty to kolumna lub pole, w którym przechowywane są dane. Każdy atrybut zostanie zamapowany na typ danych, który definiuje typ przetwarzania i przechowywania tego atrybutu. Atrybut może być dowolnym prawidłowym Typ danych PL/SQLlub może należeć do innego typu obiektu.
Członkowie/Metody
Elementy lub metody to podprogramy zdefiniowane w typie obiektu. Nie służą do przechowywania jakichkolwiek danych. Stosowane są głównie do definiowania procesu wewnątrz typu obiektu. Przykłady sprawdzania poprawności danych przed wypełnieniem typu obiektu. Są one deklarowane w sekcji typu obiektu i definiowane w sekcji treści typu obiektu. Sekcja ciała w typie obiektowym jest częścią opcjonalną. Jeśli nie ma żadnych elementów, typ obiektu nie będzie zawierał żadnej części ciała.
Utwórz obiekt w Oracle
Typu obiektu nie można utworzyć na poziomie podprogramu. Można je utworzyć jedynie na poziomie schematu. Po zdefiniowaniu typu obiektu w schemacie można go używać w podprogramach. Typ obiektu można utworzyć za pomocą opcji „UTWÓRZ TYP”. Treść typu można utworzyć dopiero po utworzeniu jego typu obiektowego.
CREATE TYPE<object_type_name> AS OBJECT ( <attribute_l><datatype>, . . ); / CREATE TYPE BODY<object_type_name> AS OBJECT ( MEMBER[PROCEDURE|FUNCTION]<member_name> IS <declarative section> BEGIN <execution part> END; . . ); /
Wyjaśnienie składni:
- Powyższa składnia pokazuje tworzenie „OBJECT” z atrybutami i „OBJECT-BODY” z metodami.
- Metody mogą być również przeciążone w treści obiektu.
Deklaracja Inicjalizacja typu obiektu
Podobnie jak inne komponenty PL/SQL, typy obiektów również muszą zostać zadeklarowane przed użyciem ich w programie.
Po utworzeniu typu obiektu można go użyć w sekcji deklaracyjnej podprogramu do zadeklarowania zmiennej tego typu obiektu.
Za każdym razem, gdy w podprogramie zostanie zadeklarowana jakakolwiek zmienna jako typ obiektu, w czasie wykonywania zostanie utworzona nowa instancja typu obiektu, a tę nowo utworzoną instancję można będzie odnieść do nazwy zmiennej. W ten sposób pojedynczy typ obiektu może przechowywać wiele wartości w różnych instancjach.
DECLARE <variable_name> <object_type_name>; BEGIN . . END; /
Wyjaśnienie składni:
- Powyższa składnia przedstawia deklarację zmiennej jako typu obiektu w części deklaratywnej.
Gdy zmienna zostanie zadeklarowana jako typ obiektu w podprogramie, będzie atomowo nullem, tzn. cały obiekt sam w sobie będzie nullem. Musi zostać zainicjowana wartościami, aby użyć ich w programie. Mogą być one inicjowane za pomocą konstruktorów.
Konstruktory są niejawną metodą obiektu, do której można się odwoływać za pomocą tej samej nazwy, co nazwa typu obiektu. Poniższa składnia przedstawia inicjalizację typu obiektu.
DECLARE <variable_name> <object_type_name>; BEGIN <variable_name>:=<object_type_name>(); END; /
Wyjaśnienie składni:
- Powyższa składnia przedstawia inicjalizację instancji typu obiektowego wartością null.
- Teraz sam obiekt nie ma wartości null, ponieważ został zainicjowany, ale atrybuty wewnątrz obiektu będą miały wartość null, ponieważ nie przypisaliśmy tym atrybutom żadnych wartości.
Konstruktorzy
Konstruktory są niejawną metodą obiektu, do której można się odwoływać za pomocą tej samej nazwy, co nazwa typu obiektu. Za każdym razem, gdy obiekt jest wywoływany po raz pierwszy, ten konstruktor zostanie wywołany niejawnie.
Za pomocą tego konstruktora możemy także inicjować obiekty. Konstruktor można zdefiniować jawnie, definiując element członkowski w treści typu obiektowego o tej samej nazwie co typ obiektu.
1 przykład: W poniższym przykładzie użyjemy elementu typu obiektu, aby wstawić rekord do tabeli emp z wartościami ('RRR', 1005, 20000, 1000) i ('PPP', 1006, 20000, 1001). Po wstawieniu danych wyświetlimy je, używając elementu typu obiektu. Użyjemy również jawnego konstruktora, aby domyślnie wypełnić identyfikator menedżera wartością 1001 dla drugiego rekordu.
Wykonamy to w poniższych krokach.
- Step1:
- Utwórz typ obiektu
- Treść typu obiektu
- Krok 2: Tworzenie anonimowego bloku w celu wywołania utworzonego typu obiektu za pomocą ukrytego konstruktora dla emp_no 1005.
- Krok 3: Tworzenie anonimowego bloku w celu wywołania utworzonego typu obiektu za pomocą jawnego konstruktora dla emp_no 1006.
Krok 1) Utwórz typ obiektu i treść typu obiektu
CREATE TYPE emp_object AS OBJECT( emp_no NUMBER, emp_name VARCHAR2(50), salary NUMBER, manager NUMBER, CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER, p_emp_name VARCHAR2, p_salary NUMBER) RETURN SELF AS RESULT), MEMBER PROCEDURE insert_records, MEMBER PROCEDURE display_records); /
CREATE OR REPLACE TYPE BODY emp_object AS CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER,p_emp_name VARCHAR2, p_salary NUMBER) RETURN SELF AS RESULT IS BEGIN Dbms_output.put_line(’Constructor fired..'); SELF.emp_no:=p_emp_no;| SELF.emp_name:=p_emp_name; SELF.salary:=p_salary; SELF.managerial:=1001; RETURN; END: MEMBER PROCEDURE insert_records IS BEGIN INSERT INTO emp VALUES(emp_noemp_name,salary,manager); END MEMBER PROCEDURE display_records IS BEGIN Dbms_output.put_line('Employee Name:'||emp_name); Dbms_output.put_line('Employee Number:'||emp_no); Dbms_output.put_line('Salary':'||salary); Dbms_output.put_line('Manager:'||manager); END: END: /
Objaśnienie kodu
- Linia kodu 1-9: Tworzenie typu obiektu „emp_object” z 4 atrybutami i 3 elementami. Zawiera definicję konstruktorów z tylko 3 parametrami. (Rzeczywisty konstruktor ukryty będzie zawierał liczbę parametrów równą liczbie atrybutów występujących w typie obiektu)
- Linia kodu 10: Tworzenie treści typu.
- Linia kodu 11-21: Definiowanie jawnego konstruktora. Przypisanie wartości parametru do atrybutów oraz przypisanie wartości atrybutu „manager” z wartością domyślną „1001”.
- Linia kodu 22-26: Definiowanie elementu „insert_records”, w którym wartości atrybutów są wstawiane do tabeli „emp”.
- Linia kodu 27-34: Zdefiniowanie elementu 'display_records', w którym wyświetlane są wartości atrybutów typu obiektu.
Wydajność
Typ utworzony
Utworzono treść typu
Krok 2) Tworzenie anonimowego bloku w celu wywołania utworzonego typu obiektu za pomocą ukrytego konstruktora dla emp_no 1005
DECLARE guru_emp_det emp_object; BEGIN guru_emp_det:=emp_object(1005,’RRR',20000,1000); guru_emp_det.display_records; guru_emp_det.insert_records; COMMIT; END;
Objaśnienie kodu
- Linia kodu 37-45: Wstawianie rekordów przy użyciu ukrytego konstruktora. Wywołanie konstruktora zawiera rzeczywistą liczbę wartości atrybutów.
- Linia kodu 38:Deklaruje guru_emp_det jako typ obiektu 'emp_object'.
- Linia kodu 41: Instrukcja „guru_emp_det.display_records” wywołuje funkcję członkowską „diplay_records”, a wartości atrybutów są wyświetlane
- Linia kodu 42: Instrukcja „guru_emp_det.insert_records” wywołuje funkcję składową „insert_records”, a wartości atrybutów są wstawiane do tabeli.
Wydajność
Nazwisko pracownika: RRR
Numer pracownika: 1005
Wynagrodzenie: 20000 XNUMX
Menedżer: 1000
Krok 3) Tworzenie anonimowego bloku w celu wywołania utworzonego typu obiektu poprzez jawny konstruktor dla emp_no 1006
DECLARE guru_emp_det emp_object; BEGIN guru_emp_det:=emp_object(1006,'PPP',20000); guru_emp_det.display_records; guru_emp_det.insert_records; COMMIT; END; /
Wydajność
Employee Name:PPP Employee Number:1006 Salary:20000 Manager:1001
Wyjaśnienie kodu:
- Linia kodu 46-53: Wstawianie rekordów przy użyciu jawnego konstruktora.
- Linia kodu 46:Deklaruje guru_emp_det jako typ obiektu 'emp_object'.
- Linia kodu 50: Instrukcja „guru_emp_det.display_records” wywołuje funkcję członkowską „display_records”, a wartości atrybutów są wyświetlane
- Linia kodu 51: Instrukcja „guru_emp_det.insert_records” wywołuje funkcję składową „insert_records”, a wartości atrybutów są wstawiane do tabeli.
Dziedziczenie typu obiektu
Właściwość dziedziczenia umożliwia typowi podobiektu dostęp do wszystkich atrybutów i elementów typu superobiektu lub typu obiektu nadrzędnego.
Typ podobiektu nazywany jest typem obiektu dziedziczonego, a typ superobiektu nazywany jest typem obiektu nadrzędnego. Poniższa składnia pokazuje, jak utworzyć typ obiektu nadrzędnego i dziedziczonego.
CREATE TYPE <object_type_name_parent> AS OBJECT ( <attribute_l><datatype>, . . )NOT FINAL; /
Wyjaśnienie składni:
- Powyższa składnia pokazuje tworzenie typu SUPER.
CREATE TYPE<object_type_name_sub>UNDER<object_type_name_parent> ( <attribute_l><datatype>, . ); /
Wyjaśnienie składni:
- Powyższa składnia przedstawia utworzenie typu SUB. Zawiera wszystkie elementy i atrybuty z nadrzędnego typu obiektu.
Przykład1: W poniższym przykładzie wykorzystamy właściwość dziedziczenia, aby wstawić rekord z identyfikatorem menedżera „1002” dla następującego rekordu („RRR”, 1007, 20000).
Wykonamy powyższy program w następujących krokach
- Krok 1: Utwórz typ SUPER.
- Krok 2: Utwórz typ i treść SUB.
- Krok 3: Tworzenie anonimowego bloku w celu wywołania typu SUB.
Krok 1) Utwórz typ SUPER lub typ nadrzędny.
CREATE TYPE emp_object AS OBJECT( emp_no NUMBER, emp_name VARCHAR2(50), salary NUMBER, manager NUMBER, CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER,p_emp_name VARCHAR2(50), p_salary NUMBER)RETURN SELF AS RESULT), MEMBER PROCEDURE insert_records, MEMBER PROCEDURE display_records)NOT FINAL; /
Wyjaśnienie kodu:
- Linia kodu 1-9: Tworzenie typu obiektu „emp_object” z 4 atrybutami i 3 elementami. Zawiera definicję konstruktorów z tylko 3 parametrami. Został zadeklarowany jako „NIE KOŃCOWY”, więc jest typem nadrzędnym.
Krok 2) Utwórz typ SUB w typie SUPER.
CREATE OR REPLACE TYPE sub_emp_object UNDER emp_object (default_manager NUMBER,MEMBER PROCEDURE insert_default_mgr); / CREATE OR REPLACE TYPE BODY sub_emp_object AS MEMBER PROCEDURE insert_default_mgr IS BEGIN INSERT INTO emp VALUES(emp_no,emp_name:salary,manager): END; END; /
Wyjaśnienie kodu:
- Linia kodu 10-13: Tworzenie obiektu sub_emp_object jako typu dziedziczonego z dodatkowym jednym atrybutem „default_manager” i deklaracją procedury członkowskiej.
- Linia kodu 14: Tworzenie treści dla dziedziczonego typu obiektu.
- Linia kodu 16-21: Zdefiniowanie procedury składowej wstawiającej rekordy do tabeli „emp” z wartościami z obiektu typu „SUPER”, z wyjątkiem wartości menedżera. W przypadku wartości menedżera używany jest typ „default_manager” z typu „SUB”.
Krok 3) Tworzenie anonimowego bloku wywołującego typ SUB
DECLARE guru_emp_det sub_emp_object; BEGIN guru_emp_det:= sub_emp_object(1007,'RRR',20000,1000,1002); guru_emp_det.insert_default_mgr; COMMIT; END; /
Wyjaśnienie kodu:
- Linia kodu 25: Deklarowanie „guru_emp_det” jako typu „sub_emp_object”.
- Linia kodu 27: Inicjowanie obiektu za pomocą ukrytego konstruktora. Konstruktor posiada 5 parametrów (4 atrybuty typu PARENT i 2 atrybuty typu SUB). Ostatni parametr (1002) definiuje wartość atrybutu default_manager
- Linia kodu 28: Wywołanie elementu „insert_default_mgr” w celu wstawienia rekordów z domyślnym identyfikatorem menedżera przekazanym w konstruktorze.
Równość obiektów PL/SQL
Instancję obiektu należącą do tych samych obiektów można porównać pod kątem równości. W tym celu musimy mieć w typie obiektu specjalną metodę zwaną metodą „ORDER”.
Ta metoda „ORDER” powinna być funkcją zwracającą typ liczbowy. Jako dane wejściowe przyjmuje dwa parametry (pierwszy parametr: identyfikator instancji obiektu własnego, drugi parametr: identyfikator innej instancji obiektu).
Porównywany jest identyfikator dwóch instancji obiektów, a wynik jest zwracany w postaci liczbowej.
- Wartość dodatnia oznacza, że instancja obiektu SELF jest większa niż inna instancja.
- Wartość ujemna oznacza, że instancja obiektu SELF jest mniejsza niż inna instancja.
- Zero oznacza, że instancja obiektu SELF jest równa innej instancji.
- Jeśli którekolwiek z wystąpień ma wartość null, wówczas ta funkcja zwróci wartość null.
CREATE TYPE BODY<object_type_name_ 1>AS OBJECT ( ORDER MEMBER FUNCTION match(<parameter> object_type_name_ 1) RETURN INTEGER IS BEGIN IF <attribute_name>parameter <attribute_name>THEN RETURN -1; --any negative number will do ELSIF id>c.id THEN RETURN 1; —any positive number will do ELSE RETURN 0; END IF; END; . . ); /
Wyjaśnienie składni:
- Powyższa składnia pokazuje funkcję ORDER, którą należy uwzględnić w treści typu w celu sprawdzenia równości.
- Parametr tej funkcji powinien być instancją tego samego typu obiektu.
- Powyższą funkcję można nazwać „obj_instance_1.match(obj_instance_2)” i to wyrażenie zwróci wartość liczbową, jak pokazano, gdzie obj_instance_1 i obj_instance_2 są instancjami typu_obiektu_nazwa.
Przykład1: W poniższym przykładzie pokażemy, jak porównać dwa obiekty. Stworzymy dwa wystąpienia i porównamy atrybut 'salary' między nimi. Wykonamy dwa kroki int.
- Krok 1: Tworzenie typu obiektu i treści.
- Krok 2: Tworzenie anonimowego bloku do wywołania porównania instancji obiektu.
Krok 1) Tworzenie typu i treści obiektu.
CREATE TYPE emp_object_equality AS OBJECT( salary NUMBER, ORDER MEMBER FUNCTION equals(c emp_object_equality)RETURN INTEGER); /
CREATE TYPE BODY emp_object_equality AS ORDER MEMBER FUNCTION equals(c emp_object_equality)RETURN INTEGER IS BEGIN IF salary<c.salary THEN RETURN -1; ELSIF salary>c.salary THEN RETURN 1; ELSE RETURN 0; END IF: END; END; /
Wyjaśnienie kodu:
- Linia kodu 1-4: Tworzenie typu obiektu „emp_object_equality” z 1 atrybutami i 1 członkiem.
- Linia kodu 6-16:Definiowanie funkcji ORDER, która porównuje atrybut 'salary' instancji SELF i typ instancji parametru. Zwraca wartość ujemną, jeśli pensja SELF jest mniejsza lub dodatnią, jeśli pensja SELF jest większa i 0, jeśli pensje są równe.
Dane wyjściowe kodu:
Typ utworzony
Krok 2) Tworzenie anonimowego bloku do wywołania porównania instancji obiektu.
DECLARE l_obj_l emp_object_equality; l_obj_2 emp_object_equality; BEGIN l_obj_l:=emp_object_equality(15000); l_obj_2:=emp_object_equality(17000); IF l_obj_1.equalS(l_obj_2)>0 THEN Dbms_output.put_line(’Salary of first instance is greater’): ELSIF l_obj_l.equalS(l_obj_2)<0 THEN Dbms_output.put_line(’Salary of second instance is greater’); ELSE Dbms_output.put_line(’Salaries are equal’); END IF; END; /
Wydajność
Salary of second instance is greater
Wyjaśnienie kodu:
- Linia kodu 20: Deklarowanie l_obj_1 typu emp_object_equality.
- Linia kodu 21: Deklarowanie l_obj_2 typu emp_object_equality.
- Linia kodu 23: Inicjowanie l_obj_1 z wartością wynagrodzenia jako „15000”
- Linia kodu 24: Inicjowanie l_obj_1 z wartością wynagrodzenia jako „17000”
- Linia kodu 25-33: Wydrukuj wiadomość na podstawie numeru zwrotu z funkcji ZAMÓW.
Podsumowanie
W tym rozdziale poznaliśmy typy obiektów i ich właściwości. Omówiliśmy także konstruktory, składowe, atrybuty, dziedziczenie i równość w obiektach PL/SQL.