Підручник з типів об’єктів Oracle PL / SQL із ПРИКЛАДАМИ

Зміст:

Anonim

Що таке тип об’єкта в PL / SQL?

Об'єктно-орієнтоване програмування особливо підходить для побудови багаторазових компонентів та складних додатків. Вони організовані навколо "об'єктів", а не "дій", тобто програми призначені для роботи та взаємодії з цілим об'єктом, а не однією дією. Ця концепція дозволяє програмісту заповнювати та обробляти деталі на рівні об'єктних сутностей.

Нижче на малюнку зображено приклад типу об’єкта, в якому банківський рахунок вважається об’єктом. Атрибути об’єкта включають речі, які містять деякі значення атрибутів, наприклад, на банківському рахунку; це номер рахунку, залишок у банку тощо, тоді як об’єктні методи описують такі речі, як обчислення процентної ставки, формування виписки з банку тощо, що вимагає завершення певного процесу.

У PL / SQL об'єктно-орієнтоване програмування базується на типах об'єктів.

Тип об’єкта може представляти будь-яку реальну сутність. У цьому розділі ми обговоримо більше типів об’єктів.

У цьому підручнику - ви дізнаєтесь,

  • Компоненти типів об’єктів
  • Створити об'єкт в Oracle
  • Ініціалізація декларації типу об’єкта
  • Конструктори
  • Спадкування за типом об'єкта
  • Рівність об’єктів PL / SQL

Компоненти типів об’єктів

Тип об’єкта PL / SQL містить переважно два компоненти.

  1. Атрибути
  2. Члени / Методи

Атрибути

Атрибути - це стовпець або поле, в якому зберігаються дані. Кожен атрибут буде зіставлений із типом даних, який визначає тип обробки та зберігання для цього атрибута. Атрибут може мати будь-який дійсний тип даних PL / SQL або інший тип об’єкта.

Члени / Методи

Члени або Методи - це підпрограми, визначені в типі об'єкта. Вони не використовуються для зберігання будь-яких даних. Вони в основному використовуються для визначення процесу всередині типу об'єкта. Для прикладів перевірки даних перед заповненням типу об’єкта. Вони оголошуються у розділі типу об’єкта та визначаються у розділі тіла об’єкта типу об’єкта. Розділ тіла у типі об’єкта є необов’язковою частиною. Якщо членів немає, то тип об’єкта не буде містити жодної частини тіла.

Створити об'єкт в Oracle

Тип об’єкта не можна створити на рівні підпрограми, їх можна створити лише на рівні схеми. Як тільки тип об’єкта визначений у схемі, тоді його можна використовувати в підпрограмах. Тип об'єкта можна створити за допомогою 'CREATE TYPE'. Тіло типу можна створити лише після створення його типу об’єкта.

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

Пояснення синтаксису:

  • У наведеному вище синтаксисі показано створення 'OBJECT' з атрибутами та 'OBJECT-BODY' з методами.
  • Методи також можуть бути перевантажені в тілі об'єкта.

Ініціалізація декларації типу об’єкта

Як і інші компоненти PL / SQL, типи об'єктів також потрібно оголосити перед використанням їх у програмі.

Після створення типу об'єкта його можна використовувати в декларативному розділі підпрограми для оголошення змінної цього типу об'єкта.

Кожного разу, коли будь-яка змінна оголошується в підпрограмі як тип об'єкта, під час виконання буде створено новий екземпляр типу об'єкта, і цей нещодавно створений екземпляр може бути посиланий на ім'я змінної. Таким чином, один тип об’єкта може зберігати кілька значень під різними екземплярами.

DECLARE ;BEGIN… END;/

Пояснення синтаксису:

  • Вищезазначений синтаксис показує оголошення змінної як типу об’єкта в декларативному розділі.

Як тільки змінна оголошена як тип об'єкта в підпрограмі, вона буде атомально нульовою, тобто весь об'єкт сам буде нульовим. Його потрібно ініціалізувати значеннями, щоб використовувати їх у програмі. Їх можна ініціалізувати за допомогою конструкторів.

Конструктори - це неявний метод об’єкта, на який можна посилатися з тим самим іменем, що і на тип об’єкта. Наведений нижче синтаксис показує ініціалізацію типу об’єкта.

DECLARE ;BEGIN:=();END;/

Пояснення синтаксису:

  • Вищезазначений синтаксис показує ініціалізацію екземпляра типу об’єкта з нульовим значенням.
  • Тепер сам об’єкт не є нульовим, оскільки він був ініціалізований, але атрибути всередині об’єкта будуть нульовими, оскільки цим атрибутам ми не призначили жодних значень.

Конструктори

Конструктори - це неявний метод об’єкта, на який можна посилатися з тим самим іменем, що і на тип об’єкта. Щоразу, коли на об'єкт посилається вперше, цей конструктор буде викликатися неявно.

Ми також можемо ініціалізувати об'єкти, використовуючи цей конструктор. Конструктор може бути визначений явним чином, визначаючи члена в тілі типу об'єкта з тим самим іменем типу об'єкта.

Приклад 1 : У наступному прикладі ми будемо використовувати елемент типу об’єкта, щоб вставити запис у таблицю emp зі значеннями ('RRR', 1005, 20000, 1000) та ('PPP', 1006, 20000, 1001). Як тільки дані будуть вставлені, ми збираємося відобразити те саме за допомогою елемента типу об’єкта. Ми також будемо використовувати явний конструктор, щоб заповнити ідентифікатор менеджера за замовчуванням значенням 1001 для другого запису.

Ми збираємось виконати його в наступних кроках.

  • Крок 1:
    • Створити тип об’єкта
    • Об'єкт типу тіла
  • Крок 2: Створення анонімного блоку для виклику створеного типу об’єкта за допомогою неявного конструктора для emp_no 1005.
  • Крок 3: Створення анонімного блоку для виклику створеного типу об’єкта за допомогою явного конструктора для emp_no 1006.

Крок 1) Створіть тип об’єкта та тіло типу об’єкта

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:/

Пояснення коду

  • Кодовий рядок 1-9 : Створення типу об'єкта 'emp_object' з 4 атрибутами та 3 членами. Він містить визначення конструкторів лише з 3 параметрами. (Фактичний імпліцитний конструктор буде містити кількість параметрів, рівну кількості атрибутів, наявних у типі об’єкта)
  • Рядок коду 10 : Створення основного тексту.
  • Рядок коду 11-21 : Визначення явного конструктора. Присвоєння значення параметра атрибутам і присвоєння значення для атрибута 'менеджер' зі значенням за замовчуванням '1001'.
  • Рядок коду 22-26 : Визначення члена 'insert_records', у якому значення атрибутів вставляються в таблицю 'emp'.
  • Кодовий рядок 27-34 : Визначення члена 'display_records', в якому відображаються значення атрибутів типу об'єкта.

Вихідні дані

Тип створено

Створено тіло типу

Крок 2) Створення анонімного блоку для виклику створеного типу об’єкта за допомогою неявного конструктора для 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;

Пояснення коду

  • Рядок коду 37-45 : Вставка записів за допомогою неявного конструктора. Виклик конструктора містить фактичну кількість значень атрибутів.
  • Рядок коду 38 : Оголошує guru_emp_det як тип об'єкта 'emp_object'.
  • Рядок коду 41 : Вираз "guru_emp_det.display_records", що називається функцією-членом "diplay_records", і відображаються значення атрибутів
  • Рядок коду 42 : Вираз "guru_emp_det.insert_records", що називається функцією-членом "insert_records", а значення атрибутів вставляються в таблицю.

Вихідні дані

Ім'я працівника: RRR

Номер працівника: 1005

Зарплата: 20000

Керівник: 1000

Крок 3) Створення анонімного блоку для виклику створеного типу об’єкта за допомогою явного конструктора для 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;/

Вихідні дані

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

Пояснення коду:

  • Кодовий рядок 46-53 : Вставка записів за допомогою явного конструктора.
  • Рядок коду 46 : оголошує guru_emp_det як тип об'єкта 'emp_object'.
  • Рядок коду 50 : Заява "guru_emp_det.display_records", що називається функцією-членом "display_records", і відображаються значення атрибутів
  • Рядок коду 51 : Вираз "guru_emp_det.insert_records", що називається функцією-членом "insert_records", і значення атрибутів вставляються в таблицю.

Спадкування за типом об'єкта

Властивість успадкування дозволяє типу під-об'єкта отримувати доступ до всіх атрибутів та членів типу супер-об'єкта або типу батьківського об'єкта.

Тип під-об'єкта називається успадкованим об'єктом, а тип супер-об'єкта - батьківським. У наведеному нижче синтаксисі показано, як створити батьківський та успадкований тип об’єкта.

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

Пояснення синтаксису:

  • У наведеному вище синтаксисі показано створення типу SUPER.
CREATE TYPEUNDER(,.);/

Пояснення синтаксису:

  • У наведеному вище синтаксисі показано створення типу SUB. Він містить усі члени та атрибути батьківського типу об’єкта.

Приклад1: У наведеному нижче прикладі ми будемо використовувати властивість успадкування, щоб вставити запис із ідентифікатором менеджера як '1002' для наступного запису ('RRR', 1007, 20000).

Ми будемо виконувати вищевказану програму в наступних кроках

  • Крок 1: Створіть тип SUPER.
  • Крок 2: Створіть тип і тіло SUB.
  • Крок 3: Створення анонімного блоку для виклику типу SUB.

Крок 1) Створіть тип SUPER або тип батьків.

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

Пояснення коду:

  • Кодовий рядок 1-9 : Створення типу об'єкта 'emp_object' з 4 атрибутами та 3 членами. Він містить визначення конструкторів лише з 3 параметрами. Він був оголошений як "НЕ КОНЧАТЕЛЬНИЙ", тому є батьківським типом.

Крок 2) Створіть тип SUB під типом 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;/

Пояснення коду:

  • Рядок коду 10-13 : Створення sub_emp_object як успадкованого типу з додатковим одним атрибутом 'default_manager' та декларацією процедури члена.
  • Рядок коду 14 : Створення тіла для успадкованого типу об’єкта.
  • Кодовий рядок 1 6 -21 : Визначення процедури-члена, яка вставляє записи в таблицю "emp" зі значеннями типу "SUPER", за винятком значення менеджера. Для значення менеджера використовується "default_manager" із типу "SUB".

Крок 3) Створення анонімного блоку для виклику типу 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;/

Пояснення коду:

  • Рядок коду 25 : Оголошення 'guru_emp_det' як типу 'sub_emp_object'.
  • Рядок коду 27 : Ініціалізація об’єкта неявним конструктором. Конструктор має 5 параметрів (4 атрибути типу PARENT і 2 атрибути типу SUB). Останній параметр (1002) визначає значення для атрибута default_manager
  • Рядок коду 28 : Виклик члена 'insert_default_mgr', щоб вставити записи з ідентифікатором менеджера за замовчуванням, переданим у конструктор.

Рівність об’єктів PL / SQL

Екземпляр об’єкта, який належить до тих самих об’єктів, можна порівняти за рівністю. Для цього нам потрібно мати спеціальний метод у типі об’єкта, який називається методом „ЗАМОВИТИ”.

Цей метод 'ORDER' повинен бути функцією, яка повертає числовий тип. В якості вхідних даних приймаються два параметри (перший параметр: ідентифікатор екземпляра самооб’єкта, другий параметр: ідентифікатор іншого екземпляра об’єкта).

Ідентифікатор двох екземплярів об'єкта порівнюється, а результат повертається числовим.

  • Позитивне значення означає, що екземпляр об'єкта SELF перевищує інший екземпляр.
  • Негативне значення означає, що екземпляр об'єкта SELF менший за інший екземпляр.
  • Нуль означає, що екземпляр об'єкта SELF дорівнює іншому екземпляру.
  • Якщо будь-який із примірників має значення null, ця функція поверне значення 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;… );/

Пояснення синтаксису:

  • Наведений вище синтаксис показує функцію ORDER, яку потрібно включити в тіло типу для перевірки рівності.
  • Параметр для цієї функції повинен бути екземпляром того самого типу об'єкта.
  • Вищевказану функцію можна викликати як "obj_instance_1.match (obj_instance_2)", і цей вираз поверне числове значення, як показано, де obj_instance_1 та obj_instance_2 є екземпляром name_type_name.

Приклад1 : У наступному прикладі ми побачимо, як порівняти два об’єкти. Ми збираємося створити два екземпляри і порівняти атрибут „зарплата” між ними. Ми збираємось зробити два кроки.

  • Крок 1: Створення типу та тіла об’єкта.
  • Крок 2: Створення анонімного блоку для виклику порівняння екземпляра об’єкта.

Крок 1) Створення типу та тіла об’єкта.

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

Пояснення коду:

  • Рядок коду 1-4: Створення типу об'єкта 'emp_object_equality' з 1 атрибутами та 1 членом.
  • Рядок коду 6-16 : Визначення функції ЗАМОВЛЕННЯ, яка порівнює атрибут 'зарплата' екземпляра САМО та типу екземпляра параметра. Він повертає мінус, якщо САМ зарплата менша або позитивна, якщо САМ зарплата більша, і 0, якщо зарплата рівна.

Вихід коду:

Тип створено

Крок 2) Створення анонімного блоку для виклику порівняння екземпляра об’єкта.

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

Вихідні дані

Salary of second instance is greater

Пояснення коду:

  • Рядок коду 20 : Оголошення l_obj_1 типу emp_object_equality.
  • Рядок коду 21 : Оголошення l_obj_2 типу emp_object_equality.
  • Код, рядок 23 : Ініціалізація l_obj_1 зі значенням заробітної плати як "15000"
  • Рядок коду 24 : Ініціалізація l_obj_1 зі значенням заробітної плати як "17000"
  • Кодовий рядок 25-33 : Надрукуйте повідомлення на основі номера повернення від функції ЗАМОВИТИ.

Резюме

У цій главі ми бачили тип об’єкта та їх властивості. Ми також обговорювали конструктори, члени, атрибути, успадкування та рівність в PL / SQL об'єктах.