Samouczek dotyczący typów obiektów Oracle PL / SQL z PRZYKŁADAMI

Spisie treści:

Anonim

Co to jest typ obiektu w PL / SQL?

Programowanie zorientowane obiektowo jest szczególnie przydatne do tworzenia komponentów wielokrotnego użytku i złożonych aplikacji. Są zorganizowane wokół „obiektów”, a nie „działań”, tj. Programy są zaprojektowane do pracy i interakcji z całym obiektem, a nie z pojedynczą akcją. Ta koncepcja umożliwia programiście wypełnianie i manipulowanie szczegółami na poziomie jednostek obiektów.

Poniższy rysunek przedstawia przykład typu obiektu, w którym konto bankowe jest traktowane jako obiekt obiektowy. Atrybuty obiektu obejmują rzeczy, które przechowują pewne wartości atrybutów, na przykład na koncie bankowym; 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 bazuje na typach obiektów.

Typ obiektu może reprezentować dowolną encję ze świata rzeczywistego. W tym rozdziale omówimy więcej typów obiektów.

W tym samouczku - dowiesz się,

  • Składniki typów obiektów
  • Utwórz obiekt w Oracle
  • Inicjalizacja deklaracji typu obiektu
  • Konstruktorzy
  • Dziedziczenie w typie obiektu
  • Równość obiektów PL / SQL

Składniki typów obiektów

Typ obiektu PL / SQL składa się głównie z dwóch komponentów.

  1. Atrybuty
  2. Członkowie / Metody

Atrybuty

Atrybuty to kolumna lub pole, w którym przechowywane są dane. Każdy atrybut zostanie odwzorowany na typ danych, który definiuje przetwarzanie i typ przechowywania dla tego atrybutu. Atrybut może mieć dowolny prawidłowy typ danych PL / SQL lub inny typ obiektu.

Członkowie / Metody

Elementy członkowskie lub metody to podprogramy zdefiniowane w typie obiektu. Nie służą do przechowywania żadnych danych. Są używane głównie do definiowania procesu wewnątrz typu obiektu. Przykłady sprawdzania poprawności danych przed wypełnieniem typu obiektu. Są zadeklarowane w sekcji typu obiektu i zdefiniowane w sekcji treści typu obiektu typu obiektowego. Sekcja treści w typie obiektu jest częścią opcjonalną. Jeśli nie ma żadnych elementów członkowskich, typ obiektu nie będzie zawierał części ciała.

Utwórz obiekt w Oracle

Typu obiektu nie można utworzyć na poziomie podprogramu, można go utworzyć tylko na poziomie schematu. Po zdefiniowaniu typu obiektu w schemacie można go używać w podprogramach. Typ obiektu można utworzyć za pomocą polecenia „UTWÓRZ TYP”. Treść typu można utworzyć dopiero po utworzeniu typu obiektu.

CREATE TYPE AS OBJECT(,… );/CREATE TYPE BODY AS OBJECT(MEMBER[PROCEDURE|FUNCTION]ISBEGINEND;‭… ‬);/

Objaśnienie składni:

  • Powyższa składnia przedstawia tworzenie „OBJECT” z atrybutami i „OBJECT-BODY” z metodami.
  • Metody mogą być również przeciążone w treści obiektu.

Inicjalizacja deklaracji typu obiektu

Podobnie jak inne komponenty w PL / SQL, typy obiektów również muszą być zadeklarowane przed użyciem ich w programie.

Po utworzeniu typu obiektu można go użyć w sekcji deklaratywnej podprogramu do zadeklarowania zmiennej tego typu obiektowego.

Ilekroć jakakolwiek zmienna jest zadeklarowana w podprogramie jako typ obiektu, w czasie wykonywania zostanie utworzona nowa instancja typu obiektu, a do tej nowo utworzonej instancji można odnieść się do nazwy zmiennej. W ten sposób pojedynczy typ obiektu może przechowywać wiele wartości w różnych instancjach.

DECLARE ;BEGIN… END;/

Objaśnienie składni:

  • Powyższa składnia przedstawia deklarację zmiennej jako typ obiektu w sekcji deklaratywnej.

Gdy zmienna zostanie zadeklarowana jako typ obiektu w podprogramie, będzie atomowo zerowa, tj. Cały sam obiekt będzie zerowy. Aby użyć ich w programie, należy go zainicjować wartościami. Można je zainicjować za pomocą konstruktorów.

Konstruktory to niejawna metoda obiektu, do której można odwoływać się z taką samą nazwą, jak nazwa typu obiektu. Poniższa składnia przedstawia inicjalizację typu obiektu.

DECLARE ;BEGIN:=();END;/

Objaśnienie składni:

  • Powyższa składnia przedstawia inicjalizację wystąpienia typu obiektu z wartością null.
  • Teraz sam obiekt nie jest pusty, ponieważ został zainicjowany, ale atrybuty wewnątrz obiektu będą miały wartość NULL, ponieważ nie przypisaliśmy żadnych wartości do tych atrybutów.

Konstruktorzy

Konstruktory to niejawna metoda obiektu, do której można odwoływać się z taką samą nazwą, jak nazwa typu obiektu. Za każdym razem, gdy obiekt jest odwoływany po raz pierwszy, ten konstruktor zostanie wywołany niejawnie.

Możemy również zainicjować obiekty za pomocą tego konstruktora. Konstruktor można zdefiniować jawnie, definiując element członkowski w treści typu obiektu o tej samej nazwie typu obiektu.

Przykład 1 : W poniższym przykładzie użyjemy elementu typu obiektu do wstawienia rekordu do tabeli emp z wartościami („RRR”, 1005, 20000, 1000) i („PPP”, 1006, 20000, 1001). Po wstawieniu danych będziemy wyświetlać to samo za pomocą elementu członkowskiego typu obiektu. Zamierzamy również użyć konstruktora jawnego, aby domyślnie wypełnić identyfikator menedżera wartością 1001 dla drugiego rekordu.

Wykonamy to w poniższych krokach.

  • Krok 1:
    • Utwórz typ obiektu
    • Treść typu obiektu
  • Krok 2: Tworzenie anonimowego bloku w celu wywołania utworzonego typu obiektu za pomocą niejawnego 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 ASCONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER,p_emp_name VARCHAR2,p_salary NUMBER)RETURN SELF AS RESULTISBEGINDbms_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_recordsISBEGININSERT INTO emp VALUES(emp_noemp_name,salary,manager);ENDMEMBER PROCEDURE display_recordsISBEGINDbms_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 członkowskimi. Zawiera definicję konstruktorów z tylko 3 parametrami. (Rzeczywisty niejawny konstruktor 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 i 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 : Definiowanie elementu „display_records”, w którym są wyświetlane wartości atrybutów typu obiektu.

Wynik

Utworzono typ

Utworzono treść typu

Krok 2) Tworzenie anonimowego bloku w celu wywołania utworzonego typu obiektu za pomocą niejawnego konstruktora dla emp_no 1005

DECLAREguru_emp_det emp_object;BEGINguru_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 niejawnego 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” zwana funkcją składową „diplay_records” i wyświetlane są wartości atrybutów
  • Linia kodu 42 : Instrukcja „guru_emp_det.insert_records” nazywana funkcją składową „insert_records”, a wartości atrybutów są wstawiane do tabeli.

Wynik

Nazwisko pracownika: RRR

Numer pracownika: 1005

Wynagrodzenie: 20000

Menedżer: 1000

Krok 3) Tworzenie anonimowego bloku w celu wywołania utworzonego typu obiektu za pomocą jawnego konstruktora dla emp_no 1006

DECLAREguru_emp_det emp_object;BEGINguru_emp_det:=emp_object(1006,'PPP',20000);guru_emp_det.display_records;guru_emp_det.insert_records;COMMIT;END;/

Wynik

Employee Name:PPPEmployee Number:1006Salary:20000Manager:1001

Objaś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” zwana funkcją składową „display_records” i wyświetlane są wartości atrybutów
  • Linia kodu 51 : Instrukcja „guru_emp_det.insert_records” nazywana funkcją składową „insert_records”, a wartości atrybutów są wstawiane do tabeli.

Dziedziczenie w typie obiektu

Właściwość dziedziczenia umożliwia typowi podobiektu dostęp do wszystkich atrybutów i elementów składowych typu superobiektu lub typu obiektu nadrzędnego.

Typ obiektu podrzędnego nazywany jest dziedziczonym typem obiektu, a typ superobiektu nazywany jest typem obiektu nadrzędnego. Poniższa składnia pokazuje, jak utworzyć nadrzędny i dziedziczony typ obiektu.

CREATE TYPE  AS OBJECT(,… )NOT FINAL;/

Objaśnienie składni:

  • Powyższa składnia ilustruje powstanie typu SUPER.
CREATE TYPEUNDER(,.);/

Objaśnienie składni:

  • Powyższa składnia pokazuje tworzenie typu SUB. Zawiera wszystkie elementy członkowskie i atrybuty z nadrzędnego typu obiektu.

Przykład1: W poniższym przykładzie użyjemy właściwości dziedziczenia, aby wstawić rekord z identyfikatorem menedżera jako „1002” dla następującego rekordu („RRR”, 1007, 20000).

Zamierzamy wykonać powyższy program w kolejnych 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;/

Objaśnienie kodu:

  • Linia kodu 1-9 : Tworzenie typu obiektu „emp_object” z 4 atrybutami i 3 elementami członkowskimi. Zawiera definicję konstruktorów z tylko 3 parametrami. Został zadeklarowany jako „NOT FINAL”, więc jest typem nadrzędnym.

Krok 2) Utwórz typ SUB pod typem SUPER.

CREATE OR REPLACE TYPE sub_emp_objectUNDER emp_object(default_manager NUMBER,MEMBER PROCEDURE insert_default_mgr);/CREATE OR REPLACE TYPE BODY sub_emp_objectASMEMBER PROCEDURE insert_default_mgrISBEGININSERT INTO empVALUES(emp_no,emp_name:salary,manager):END;END;/

Objaśnienie kodu:

  • Linia kodu 10-13 : Tworzenie obiektu pod_emp_object jako typu dziedziczonego z dodatkowym jednym atrybutem „default_manager” i deklaracją procedury składowej.
  • Linia kodu 14 : Tworzenie treści dla dziedziczonego typu obiektu.
  • Linia kodu 1 6 -21 : Definiowanie procedury składowej polegającej na wstawianiu rekordów do tabeli „emp” z wartościami z typu obiektu „SUPER”, z wyjątkiem wartości menedżera. Jako wartość menedżera używa typu „default_manager” z typu „SUB”.

Krok 3) Tworzenie anonimowego bloku w celu wywołania typu SUB

DECLAREguru_emp_det sub_emp_object;BEGINguru_emp_det:= sub_emp_object(1007,'RRR',20000,1000,1002);guru_emp_det.insert_default_mgr;COMMIT;END;/

Objaśnienie kodu:

  • Linia kodu 25 : Deklarowanie „guru_emp_det” jako typu „sub_emp_object”.
  • Linia kodu 27 : Inicjowanie obiektu za pomocą niejawnego konstruktora. Konstruktor ma 5 parametrów (4 atrybuty z typu PARENT i 2 atrybuty z typu SUB). Ostatni parametr (1002) definiuje wartość atrybutu default_manager
  • Linia kodu 28 : Wywołanie członka „insert_default_mgr” w celu wstawienia rekordów z domyślnym identyfikatorem menedżera przekazanym w konstruktorze.

Równość obiektów PL / SQL

Wystąpienie obiektu należące do tych samych obiektów można porównać pod kątem równości. W tym celu potrzebujemy specjalnej metody w typie obiektu o nazwie „ORDER”.

Ta metoda „ORDER” powinna być funkcją zwracającą typ liczbowy. Pobiera dwa parametry jako dane wejściowe (pierwszy parametr: identyfikator instancji obiektu własnego, drugi parametr: identyfikator instancji innego obiektu).

Porównywany jest identyfikator dwóch instancji obiektu, 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órakolwiek z instancji ma wartość null, ta funkcja zwróci wartość null.
CREATE TYPE BODYAS OBJECT(ORDER MEMBER FUNCTION match(
 object_type_name_ 1)RETURN INTEGER IS BEGINIF parameter THENRETURN -1; --any negative number will doELSIF id>c.id THENRETURN 1; -any positive number will doELSERETURN 0;END IF;END;… );/

Objaśnienie składni:

  • Powyższa składnia przedstawia 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)”, a to wyrażenie zwróci wartość liczbową, jak pokazano, gdzie obj_instance_1 i obj_instance_2 są wystąpieniami obiektu nazwa_typu.

Przykład1 : W poniższym przykładzie zobaczymy, jak porównać dwa obiekty. Utworzymy dwie instancje i porównamy między nimi atrybut „wynagrodzenie”. Zrobimy dwa kroki.

  • Krok 1: Tworzenie typu i treści obiektu.
  • Krok 2: Utworzenie anonimowego bloku w celu 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 ASORDER MEMBER FUNCTION equals(c emp_object_equality)RETURN INTEGERISBEGIN‭ ‬IF salaryc.salaryTHEN RETURN 1;ELSERETURN 0;END IF:‭ ‬END;END;/

Objaśnienie kodu:

  • Linia kodu 1-4: Tworzenie typu obiektu „emp_object_equality” z 1 atrybutami i 1 składnikiem.
  • Linia kodu 6-16 : Definiowanie funkcji ORDER, która porównuje atrybut „wynagrodzenie” instancji SELF i typ instancji parametru. Zwraca wartość ujemną, jeśli pensja SELF jest niższa lub dodatnia, jeśli pensja SELF jest większa, i 0, jeśli płace są równe.

Kod wyjściowy:

Utworzono typ

Krok 2) Utworzenie anonimowego bloku w celu wywołania porównania instancji obiektu.

DECLAREl_obj_l emp_object_equality;l_obj_2 emp_object_equality;BEGINl_obj_l:=emp_object_equality(15000);l_obj_2:=emp_object_equality(17000);IF l_obj_1.equalS(l_obj_2)>0THENDbms_output.put_line(’Salary of first instance is greater’):ELSIF l_obj_l.equalS(l_obj_2)<0THENDbms_output.put_line(’Salary of second instance is greater’);ELSEDbms_output.put_line(’Salaries are equal’);END IF;END;/

Wynik

Salary of second instance is greater

Objaś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 : Inicjalizacja l_obj_1 z wartością wynagrodzenia równą „15000”
  • Linia kodu 24 : Inicjalizacja l_obj_1 z wartością wynagrodzenia równą „17000”
  • Linia kodu 25-33 : wydrukuj wiadomość na podstawie numeru zwrotu z funkcji ZAMÓWIENIE.

Podsumowanie

W tym rozdziale omówiliśmy typ obiektu i jego właściwości. Omówiliśmy również konstruktory, składowe, atrybuty, dziedziczenie i równość w obiektach PL / SQL.