Oracle Typy obiektów PL/SQL: CREATE TYPE z przykładami
⚡ Inteligentne podsumowanie
Typy obiektów w PL/SQL wprowadzają programowanie obiektowe Oracle, umożliwiając modelowanie rzeczywistych bytów za pomocą atrybutów i metod. Obsługują one konstruktory, dziedziczenie i porównywanie równości, dzięki czemu jeden typ na poziomie schematu może przechowywać i przetwarzać ustrukturyzowane dane.

Co to jest typ obiektu w PL/SQL?
Programowanie obiektowe jest szczególnie przydatne do tworzenia komponentów wielokrotnego użytku i złożonych aplikacji. Programy są zorganizowane wokół „obiektów”, a nie „akcji”; co oznacza, że są zaprojektowane do pracy i interakcji z całym obiektem, a nie z pojedynczą akcją. Takie podejście pozwala programiście na wypełnianie i manipulowanie szczegółami na poziomie obiektu-jednostki.
Poniższy rysunek przedstawia przykład typu obiektu, w którym konto bankowe jest traktowane jako encja obiektu. Atrybuty obiektu przechowują wartości – w przypadku konta bankowego są to numer konta, saldo konta itd. – natomiast metody obiektu opisują czynności, takie jak obliczanie stopy procentowej czy generowanie wyciągu bankowego, z których każda wymaga wykonania określonego procesu.
In PL / SQLProgramowanie obiektowe opiera się na typach obiektów. Typ obiektu może reprezentować dowolny byt ze świata rzeczywistego. Poniższe sekcje omawiają typy obiektów, ich komponenty oraz sposób ich tworzenia i używania.
Składniki typów obiektów
Typ obiektu PL/SQL składa się głównie z dwóch komponentów.
- Atrybuty
- Członkowie/Metody
Atrybuty
Atrybuty to kolumny lub pola, w których przechowywane są dane. Każdy atrybut jest mapowany na typ danych, który definiuje sposób przetwarzania i przechowywania tego atrybutu. Atrybut może mieć dowolny prawidłowy typ. Typ danych PL/SQLlub może należeć do innego typu obiektu.
Członkowie/Metody
Członkowie lub metody są podprogramy Zdefiniowane wewnątrz typu obiektu. Nie służą do przechowywania danych; zamiast tego definiują przetwarzanie wykonywane wewnątrz typu obiektu — na przykład walidację danych przed wypełnieniem obiektu. Są deklarowane w specyfikacji typu obiektu i definiowane w treści typu obiektu. Treść jest opcjonalna: jeśli nie ma żadnych elementów, typ obiektu nie ma części treści.
Utwórz obiekt w Oracle
Typu obiektu nie można utworzyć na poziomie podprogramu; można go utworzyć wyłącznie na poziomie schematu. Po zdefiniowaniu typu obiektu w schemacie można go używać w podprogramach. Typ obiektu tworzy się za pomocą polecenia „CREATE TYPE”, a treść typu można utworzyć dopiero po zaistnieniu jego typu obiektu.
Poniższe zrzuty ekranu pokazują składnię polecenia CREATE TYPE dla specyfikacji obiektu i składnię polecenia CREATE TYPE BODY definiującą jego metody.
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 OBIEKTU z atrybutami i CIAŁA OBIEKTU z metodami.
- Metody mogą być również przeciążone w treści obiektu.
Deklaracja Inicjalizacja typu obiektu
Podobnie jak inne komponenty w PL/SQL, typy obiektów muszą zostać zadeklarowane przed użyciem w programie. Po utworzeniu typu obiektu można go użyć w sekcji deklaratywnej podprogramu, aby zadeklarować zmienną tego typu obiektu.
Za każdym razem, gdy zmienna jest deklarowana jako typ obiektu, w czasie wykonywania tworzona jest nowa instancja tego typu obiektu, a do tej nowo utworzonej instancji odwołuje się nazwa zmiennej. W ten sposób jeden typ obiektu może przechowywać wiele wartości w różnych instancjach.
Poniższy zrzut ekranu przedstawia deklarację zmiennej jako typu obiektu wewnątrz Blok PL/SQL.
DECLARE <variable_name> <object_type_name>; BEGIN . . END; /
Wyjaśnienie składni:
- Powyższa składnia pokazuje deklarację zmienna jako typ obiektu w sekcji deklaratywnej.
Po zadeklarowaniu zmiennej jako typu obiektu w podprogramie, jest ona atomowo nullem – cały obiekt jest nullem. Musi zostać zainicjowana wartościami, zanim będzie mogła zostać użyta w programie. Obiekty są inicjowane za pomocą konstruktorów.
Konstruktory to niejawne metody obiektu, do których można odwoływać się, używając tej samej nazwy co typ obiektu. Poniższy zrzut ekranu przedstawia inicjalizację instancji typu obiektu.
DECLARE <variable_name> <object_type_name>; BEGIN <variable_name>:=<object_type_name>(); END; /
Wyjaśnienie składni:
- Powyższa składnia pokazuje inicjalizację instancji typu obiektu wartością pustą.
- Sam obiekt nie jest już nullem po zainicjowaniu, ale atrybuty wewnątrz obiektu pozostają nullem, dopóki nie zostaną im przypisane wartości.
Konstruktorzy
Konstruktory to niejawne metody obiektu, do których można się odwoływać, używając tej samej nazwy co typ obiektu. Za każdym razem, gdy odwołujemy się do obiektu po raz pierwszy, ten konstruktor jest wywoływany niejawnie.
Można również inicjować obiekty za pomocą tych konstruktorów. Konstruktor można zdefiniować jawnie, definiując element w ciele typu obiektu o tej samej nazwie co typ obiektu.
1 przykład: W poniższym przykładzie używamy elementu typu object do wstawiania rekordów do tabeli emp z wartościami („RRR”, 1005, 20000, 1000) i („PPP”, 1006, 20000, 1001). Po wstawieniu danych wyświetlamy je za pomocą elementu typu object. Używamy również jawnego konstruktora, aby wypełnić identyfikator menedżera wartością domyślną 1001 dla drugiego rekordu.
Wykonujemy to w następujących krokach.
- Krok 1: Utwórz typ obiektu i treść typu obiektu.
- Krok 2: Utwórz anonimowy blok, aby wywołać typ obiektu poprzez niejawny konstruktor dla emp_no 1005.
- Krok 3: Utwórz anonimowy blok, aby wywołać typ obiektu poprzez jawny konstruktor dla emp_no 1006.
Krok 1) Utwórz typ obiektu i treść typu obiektu.
Poniższy zrzut ekranu pokazuje specyfikację typu obiektu emp_object, która jest tworzona wraz z jej atrybutami i elementami.
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); /
Poniższy zrzut ekranu pokazuje, jak tworzony jest typ emp_object za pomocą jawnego konstruktora i procedur członkowskich.
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.manager:=1001; RETURN; END; MEMBER PROCEDURE insert_records IS BEGIN INSERT INTO emp VALUES(emp_no,emp_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; /
Code Wyjaśnienie
- Code wiersz 1-9: Tworzenie typu obiektu „emp_object” z 4 atrybutami i 3 elementami. Zawiera on definicję konstruktora z zaledwie 3 parametrami. (Rzeczywisty konstruktor niejawny zawiera liczbę parametrów równą liczbie atrybutów obecnych w typie obiektu).
- Code linia 10: Tworzenie treści typu.
- Code wiersz 11-21: Zdefiniowanie jawnego konstruktora. Przypisanie wartości parametrów do atrybutów i przypisanie atrybutowi „manager” wartości domyślnej „1001”.
- Code wiersz 22-26: Definiowanie elementu „insert_records”, w którym wartości atrybutów są wstawiane do tabeli „emp”.
- Code wiersz 27-34: Zdefiniowanie elementu „display_records”, który wyświetla wartości atrybutów typu obiektu.
Wyjście:
Typ utworzony
Utworzono treść typu
Krok 2) Utworzenie anonimowego bloku do wywołania utworzonego typu obiektu poprzez niejawny konstruktor dla emp_no 1005.
Poniższy zrzut ekranu pokazuje anonimowy blok, który wywołuje emp_object poprzez niejawny konstruktor.
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;
Code Wyjaśnienie
- Code wiersz 37-45: Wstawianie rekordów za pomocą niejawnego konstruktora. Wywołanie konstruktora zawiera rzeczywistą liczbę wartości atrybutów.
- Code linia 38: Deklaruje „guru_emp_det” jako typ obiektu „emp_object”.
- Code linia 41: Polecenie „guru_emp_det.display_records” wywołuje element „display_records”, a wartości atrybutów zostają wyświetlone.
- Code linia 42: Instrukcja „guru_emp_det.insert_records” wywołuje element „insert_records”, a wartości atrybutów są wstawiane do tabeli. Następnie blok zatwierdza transakcja.
Wyjście:
Nazwisko pracownika: RRR
Numer pracownika: 1005
Wynagrodzenie: 20000 XNUMX
Menedżer: 1000
Krok 3) Utworzenie anonimowego bloku do wywołania utworzonego typu obiektu poprzez jawny konstruktor dla emp_no 1006.
Poniższy zrzut ekranu pokazuje anonimowy blok, który wywołuje emp_object poprzez jawny konstruktor z trzema argumentami.
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
Code Wyjaśnienie:
- Code wiersz 46-53: Wstawianie rekordu przy użyciu jawnego konstruktora.
- Code linia 46: Deklaruje „guru_emp_det” jako typ obiektu „emp_object”.
- Code linia 50: Polecenie „guru_emp_det.display_records” wywołuje element „display_records”, a wartości atrybutów zostają wyświetlone.
- Code linia 51: Instrukcja „guru_emp_det.insert_records” wywołuje element „insert_records”, a wartości atrybutów są wstawiane do tabeli. Ponieważ przekazywane są tylko trzy argumenty, jawny konstruktor ustawia identyfikator menedżera na wartość domyślną 1001.
Dziedziczenie typu obiektu
Właściwość dziedziczenia pozwala typowi podobiektu na dostęp do wszystkich atrybutów i elementów typu nadrzędnego obiektu lub typu obiektu nadrzędnego.
Typ podobiektu nazywany jest dziedziczonym typem obiektu, a typ nadrzędnego typu obiektu – nadrzędnym typem obiektu. Poniższa składnia pokazuje, jak tworzyć nadrzędne i dziedziczone typy obiektów. Poniższy zrzut ekranu przedstawia składnię typu nadrzędnego (SUPER) oznaczoną jako NOT FINAL.
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. Klauzula NOT FINAL umożliwia dziedziczenie typu.
Poniższy zrzut ekranu pokazuje składnię typu dziedziczonego (SUB) utworzoną za pomocą słowa kluczowego UNDER.
CREATE TYPE<object_type_name_sub>UNDER<object_type_name_parent> ( <attribute_l><datatype>, . ); /
Wyjaśnienie składni:
- Powyższa składnia pokazuje tworzenie typu SUB. Zawiera on wszystkie elementy i atrybuty z nadrzędnego typu obiektu.
1 przykład: W poniższym przykładzie używamy właściwości dziedziczenia, aby wstawić rekord o identyfikatorze menedżera „1002” dla rekordu („RRR”, 1007, 20000). Wykonujemy program w następujących krokach.
- Krok 1: Utwórz typ SUPER.
- Krok 2: Utwórz typ i treść SUB.
- Krok 3: Utwórz anonimowy blok, aby wywołać typ SUB.
Krok 1) Utwórz typ SUPER lub typ nadrzędny.
Poniższy zrzut ekranu pokazuje nadtyp emp_object tworzony za pomocą klauzuli NOT FINAL.
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; /
Code Wyjaśnienie:
- Code wiersz 1-9: Tworzenie typu obiektu „emp_object” z 4 atrybutami i 3 elementami. Zawiera on definicję konstruktora z zaledwie 3 parametrami. Został zadeklarowany jako „NIEKOŃCOWY”, więc jest typem nadrzędnym.
Krok 2) Utwórz typ SUB w typie SUPER.
Poniższy zrzut ekranu pokazuje odziedziczony typ sub_emp_object i jego treść, która jest tworzona.
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; /
Code Wyjaśnienie:
- Code wiersz 10-13: Utworzenie „sub_emp_object” jako typu dziedziczonego z jednym dodatkowym atrybutem „default_manager” i deklaracją procedury członkowskiej.
- Code linia 14: Tworzenie treści dla odziedziczonego typu obiektu.
- Code wiersz 16-21: Definiowanie procedury członkowskiej, która wstawia rekordy do tabeli „emp” z wartościami z typu obiektu SUPER, z wyjątkiem wartości „manager”. Jako wartość „manager” używana jest wartość „default_manager” z typu SUB.
Krok 3) Utworzenie anonimowego bloku do wywołania typu SUB.
Poniższy zrzut ekranu pokazuje anonimowy blok, który wywołuje typ SUB i wstawia domyślny identyfikator menedżera.
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; /
Code Wyjaśnienie:
- Code linia 25: Deklarowanie „guru_emp_det” jako typu „sub_emp_object”.
- Code linia 27: Inicjalizacja obiektu za pomocą niejawnego konstruktora. Konstruktor ma 5 parametrów (4 atrybuty typu PARENT i 1 atrybut typu SUB). Ostatni parametr (1002) definiuje wartość atrybutu default_manager.
- Code linia 28: Wywołanie członka 'insert_default_mgr' w celu wstawienia rekordu z domyślnym identyfikatorem menedżera przekazanym w konstruktorze.
Równość obiektów PL/SQL
Instancje obiektów należące do tego samego typu obiektu można porównywać pod kątem równości. W tym celu typ obiektu wymaga specjalnej metody o nazwie ORDER.
Ta metoda ORDER powinna być funkcją zwracającą typ liczbowy. Przyjmuje ona dwa parametry wejściowe (pierwszy parametr: identyfikator instancji obiektu własnego; drugi parametr: identyfikator instancji innego obiektu).
Porównywane są identyfikatory dwóch instancji obiektów, a wynik zwracany jest jako liczba.
- Wartość dodatnia oznacza, że instancja obiektu SELF jest większa od innej instancji.
- Wartość ujemna oznacza, że instancja obiektu SELF jest mniejsza od drugiej instancji.
- Zero oznacza, że instancja obiektu SELF jest równa drugiej instancji.
- Jeżeli którakolwiek z instancji jest nullem, funkcja zwraca null.
Poniższy zrzut ekranu pokazuje składnię funkcji członkowskiej ORDER, która musi zostać uwzględniona w treści typu w celu sprawdzenia równości.
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óra musi zostać uwzględniona w treści typu w celu sprawdzenia równości.
- Parametr tej funkcji powinien być instancją tego samego typu obiektu.
- Funkcję można wywołać jako „obj_instance_1.match(obj_instance_2)”, a wyrażenie to zwraca pokazaną wartość liczbową, gdzie obj_instance_1 i obj_instance_2 są instancjami typu obiektu.
1 przykład: W poniższym przykładzie porównujemy dwa obiekty. Tworzymy dwie instancje i porównujemy między nimi atrybut „wynagrodzenie”. Robimy to w dwóch krokach.
- Krok 1: Utwórz typ obiektu i jego treść.
- Krok 2: Utwórz blok anonimowy, aby porównać wystąpienia obiektów.
Krok 1) Tworzenie typu obiektu i jego treści.
Poniższe zrzuty ekranu pokazują specyfikację emp_object_equality i jej treść, która definiuje funkcję ORDER porównującą atrybut salary.
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; /
Code Wyjaśnienie:
- Code wiersz 1-4: Tworzenie typu obiektu „emp_object_equality” z 1 atrybutem i 1 członkiem.
- Code wiersz 6-16: Definiowanie funkcji ORDER, która porównuje atrybut „wynagrodzenie” instancji SELF i instancji parametru. Zwraca wartość ujemną, jeśli pensja SELF jest mniejsza, wartość dodatnią, jeśli pensja SELF jest większa, oraz 0, jeśli pensje są równe.
Code Wyjście:
Typ utworzony
Krok 2) Utworzenie anonimowego bloku w celu porównania wystąpień obiektów.
Poniższy zrzut ekranu pokazuje anonimowy blok porównujący dwie instancje emp_object_equality według wynagrodzenia.
DECLARE l_obj_1 emp_object_equality; l_obj_2 emp_object_equality; BEGIN l_obj_1:=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_1.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
Code Wyjaśnienie:
- Code linia 20: Deklarowanie obiektu „l_obj_1” typu „emp_object_equality”.
- Code linia 21: Deklarowanie obiektu „l_obj_2” typu „emp_object_equality”.
- Code linia 23: Inicjowanie 'l_obj_1' wartością wynagrodzenia '15000'.
- Code linia 24: Inicjowanie 'l_obj_2' wartością wynagrodzenia '17000'.
- Code wiersz 25-33: Wydrukowanie komunikatu na podstawie liczby zwróconej przez funkcję ORDER.


















