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.

Typy obiektów w PL/SQL

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.

  1. Atrybuty
  2. 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.

Utwórz obiekt w OracleUtwórz obiekt w Oracle

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.

Deklaracja Inicjalizacja typu obiektu

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.

Deklaracja Inicjalizacja 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

Konstruktorzy

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);
/

Konstruktorzy

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

Konstruktorzy

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

Konstruktorzy

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.

Dziedziczenie typu obiektu

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.

Dziedziczenie typu obiektu

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.

Dziedziczenie 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(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.

Dziedziczenie typu obiektu

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

Dziedziczenie typu obiektu

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.

Równość obiektów PL/SQL

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.

Równość obiektów PL/SQL

Równość obiektów PL/SQL

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.

Równość obiektów PL/SQL

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.