Oracle Tipuri de obiecte PL/SQL: CREATE TYPE cu exemple

โšก Rezumat inteligent

Tipurile de obiecte din PL/SQL aduc programarea orientatฤƒ pe obiecte la Oracle, permiศ›รขndu-vฤƒ sฤƒ modelaศ›i entitฤƒศ›i din lumea realฤƒ cu atribute ศ™i metode. Acestea acceptฤƒ constructori, moศ™tenire ศ™i comparare de egalitฤƒศ›i, astfel รฎncรขt un singur tip la nivel de schemฤƒ poate stoca ศ™i procesa date structurate.

  • ๐Ÿงฑ Componente ale tipului de obiect: Un tip de obiect combinฤƒ atribute care stocheazฤƒ date ศ™i membri, sau metode, care definesc logica sa de procesare.
  • ๐Ÿ—๏ธ Creare obiect: Tipurile de obiecte sunt create la nivel de schemฤƒ cu CREATE TYPE, iar metodele lor sunt definite รฎntr-un CREATE TYPE BODY separat.
  • ๐Ÿ”ง Constructori: Fiecare tip de obiect are un constructor implicit numit dupฤƒ tip ศ™i puteศ›i defini un constructor explicit pentru a seta valorile implicite.
  • ๐Ÿงฌ MoลŸtenire: Un tip pฤƒrinte NOT FINAL este extins cu UNDER, deci un subtip moศ™teneศ™te toate atributele ศ™i membrii pฤƒrintelui.
  • ๐Ÿ‡ง๐Ÿ‡ท Egalitate: O funcศ›ie membru ORDER comparฤƒ douฤƒ instanศ›e de obiect ศ™i returneazฤƒ un numฤƒr negativ, zero sau pozitiv.
  • ๐Ÿค– Asistenศ›ฤƒ AI: Asistenศ›ii AI, cum ar fi GitHub Copilot, creeazฤƒ definiศ›ii CREATE TYPE, constructori ศ™i metode ORDER dintr-un comentariu.

Oracle Tipuri de obiecte PL/SQL care afiศ™eazฤƒ CREATE TYPE cu atribute ศ™i metode

Ce este tipul de obiect รฎn PL/SQL?

Programarea orientatฤƒ pe obiecte este potrivitฤƒ รฎn special pentru construirea de componente reutilizabile ศ™i aplicaศ›ii complexe. Programele sunt organizate รฎn jurul โ€žobiectelorโ€ mai degrabฤƒ decรขt al โ€žacศ›iunilorโ€; adicฤƒ, sunt concepute sฤƒ lucreze ศ™i sฤƒ interacศ›ioneze cu un รฎntreg obiect, mai degrabฤƒ decรขt cu o singurฤƒ acศ›iune. Aceastฤƒ abordare permite programatorului sฤƒ populeze ศ™i sฤƒ manipuleze detalii la nivel de obiect-entitate.

Imaginea de mai jos prezintฤƒ un exemplu de tip de obiect รฎn care un cont bancar este tratat ca o entitate obiect. Atributele obiectului conศ›in valori - pentru un cont bancar acestea sunt numฤƒrul contului, soldul bancar ศ™i aศ™a mai departe - รฎn timp ce metodele obiectului descriu acศ›iuni precum calcularea ratei dobรขnzii sau generarea unui extras de cont, fiecare dintre acestea necesitรขnd un proces pentru a fi finalizatฤƒ.

Cont bancar modelat ca un tip de obiect cu atribute ศ™i metode รฎn PL/SQL

In PL / SQLProgramarea orientatฤƒ pe obiecte se bazeazฤƒ pe tipuri de obiecte. Un tip de obiect poate reprezenta orice entitate din lumea realฤƒ. Secศ›iunile de mai jos exploreazฤƒ tipurile de obiecte, componentele acestora ศ™i modul de creare ศ™i utilizare a acestora.

Componentele tipurilor de obiecte

Un tip de obiect PL/SQL conศ›ine รฎn principal douฤƒ componente.

  1. Atribute
  2. Membri/Metode

Atribute

Atributele sunt coloanele sau cรขmpurile รฎn care sunt stocate datele. Fiecare atribut este mapat la tipul de date care defineศ™te tipul de procesare ศ™i stocare pentru atributul respectiv. Un atribut poate avea orice valoare validฤƒ. Tip de date PL/SQL, sau poate fi de alt tip de obiect.

Membri/Metode

Membrii sau metodele sunt subprograme definite รฎn interiorul tipului de obiect. Nu sunt utilizate pentru stocarea datelor; รฎn schimb, definesc procesarea efectuatฤƒ รฎn interiorul tipului de obiect - de exemplu, validarea datelor รฎnainte de popularea obiectului. Sunt declarate รฎn specificaศ›ia tipului de obiect ศ™i definite รฎn corpul tipului de obiect. Corpul este opศ›ional: dacฤƒ nu sunt prezenศ›i membri, un tip de obiect nu are o parte a corpului.

Creaศ›i obiect รฎn Oracle

Un tip de obiect nu poate fi creat la nivel de subprogram; acesta poate fi creat doar la nivel de schemฤƒ. Odatฤƒ ce tipul de obiect este definit รฎn schemฤƒ, acesta poate fi utilizat รฎn subprograme. Tipul de obiect este creat folosind instrucศ›iunea โ€žCREATE TYPEโ€, iar corpul tipului poate fi creat numai dupฤƒ ce tipul sฤƒu de obiect existฤƒ.

Capturile de ecran de mai jos prezintฤƒ sintaxa CREATE TYPE pentru specificaศ›ia obiectului ศ™i sintaxa CREATE TYPE BODY care defineศ™te metodele acestuia.

Sintaxa CREATE TYPE care defineศ™te o specificaศ›ie de obiect cu atribute รฎn Oracle Sintaxa CREATE TYPE BODY care defineศ™te metodele unui tip de obiect PL/SQL

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

Explicaศ›ia sintaxei:

  • Sintaxa de mai sus aratฤƒ crearea unui OBJECT cu atribute ศ™i a unui OBJECT BODY cu metode.
  • Metodele pot fi, de asemenea, supraรฎncฤƒrcate รฎn corpul obiectului.

Declaraศ›ia de iniศ›ializare a tipului de obiect

Ca ศ™i alte componente din PL/SQL, tipurile de obiecte trebuie declarate รฎnainte de a fi utilizate รฎntr-un program. Odatฤƒ ce tipul de obiect este creat, acesta poate fi utilizat รฎn secศ›iunea declarativฤƒ a unui subprogram pentru a declara o variabilฤƒ de tipul respectiv de obiect.

Ori de cรขte ori o variabilฤƒ este declaratฤƒ ca tip de obiect, la momentul execuศ›iei este creatฤƒ o nouฤƒ instanศ›ฤƒ a tipului de obiect, iar aceastฤƒ instanศ›ฤƒ nou creatฤƒ este referitฤƒ prin numele variabilei. รŽn acest fel, un singur tip de obiect poate stoca mai multe valori sub instanศ›e diferite.

Captura de ecran de mai jos aratฤƒ o variabilฤƒ declaratฤƒ ca un tip de obiect รฎn interiorul unui bloc PL/SQL.

Declararea unei variabile de tip obiect รฎntr-o secศ›iune declarativฤƒ de bloc PL/SQL

DECLARE
<variable_name> <object_type_name>;
BEGIN
.
.
END;
/

Explicaศ›ia sintaxei:

  • Sintaxa de mai sus prezintฤƒ declararea unui variabil ca tip de obiect รฎn secศ›iunea declarativฤƒ.

Odatฤƒ ce variabila este declaratฤƒ ca tip de obiect รฎntr-un subprogram, aceasta este atomic nulฤƒ โ€” รฎntregul obiect รฎn sine este nul. Trebuie iniศ›ializatฤƒ cu valori รฎnainte de a putea fi utilizatฤƒ รฎn program. Obiectele sunt iniศ›ializate folosind constructori.

Constructorii sunt metodele implicite ale unui obiect la care se poate face referire cu acelaศ™i nume ca ศ™i tipul obiectului. Captura de ecran de mai jos prezintฤƒ iniศ›ializarea unei instanศ›e de tip obiect.

Iniศ›ializarea unei instanศ›e de tip obiect la null folosind constructorul sฤƒu

DECLARE
<variable_name> <object_type_name>; 
BEGIN
<variable_name>:=<object_type_name>();
END;
/

Explicaศ›ia sintaxei:

  • Sintaxa de mai sus aratฤƒ iniศ›ializarea instanศ›ei de tip obiect cu o valoare nulฤƒ.
  • Obiectul รฎn sine nu mai este nul odatฤƒ ce a fost iniศ›ializat, dar atributele din interiorul obiectului rฤƒmรขn nule pรขnฤƒ cรขnd li se atribuie valori.

Constructori

Constructorii sunt metodele implicite ale unui obiect la care se poate face referire cu acelaศ™i nume ca ศ™i tipul obiectului. Ori de cรขte ori se face referire la obiect pentru prima datฤƒ, acest constructor este apelat implicit.

De asemenea, puteศ›i iniศ›ializa obiecte folosind aceศ™ti constructori. Un constructor poate fi definit explicit prin definirea unui membru รฎn corpul tipului de obiect cu acelaศ™i nume ca ศ™i tipul de obiect.

Exemplu 1: รŽn exemplul urmฤƒtor, folosim membrul de tip obiect pentru a insera รฎnregistrฤƒri รฎn tabelul emp cu valorile ('RRR', 1005, 20000, 1000) ศ™i ('PPP', 1006, 20000, 1001). Odatฤƒ ce datele sunt inserate, le afiศ™ฤƒm folosind membrul de tip obiect. De asemenea, folosim un constructor explicit pentru a popula ID-ul managerului cu valoarea implicitฤƒ 1001 pentru a doua รฎnregistrare.

รŽl executฤƒm รฎn urmฤƒtorii paศ™i.

  • Pasul 1: Creaศ›i tipul de obiect ศ™i corpul tipului de obiect.
  • Pasul 2: Creaศ›i un bloc anonim pentru a apela tipul de obiect prin constructorul implicit pentru emp_no 1005.
  • Pasul 3: Creaศ›i un bloc anonim pentru a apela tipul de obiect prin constructorul explicit pentru emp_no 1006.

Pasul 1) Creaศ›i tipul de obiect ศ™i corpul tipului de obiect.

Captura de ecran de mai jos prezintฤƒ specificaศ›ia de tip de obiect emp_object creatฤƒ รฎmpreunฤƒ cu atributele ศ™i membrii sฤƒi.

Crearea specificaศ›iei de tip de obiect emp_object cu atribute ศ™i membri

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

Captura de ecran de mai jos aratฤƒ corpul de tip emp_object creat cu constructorul explicit ศ™i procedurile membre.

Definirea corpului de tip emp_object cu un constructor explicit ศ™i proceduri membre

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 Explicaศ›ie

  • Code liniile 1-9: Crearea tipului de obiect โ€žemp_objectโ€ cu 4 atribute ศ™i 3 membri. Acesta conศ›ine definiศ›ia unui constructor cu doar 3 parametri. (Constructorul implicit real conศ›ine numฤƒrul de parametri egal cu numฤƒrul de atribute prezente รฎn tipul de obiect.)
  • Code linia 10: Crearea corpului tipului.
  • Code liniile 11-21: Definirea constructorului explicit. Atribuirea valorilor parametrilor atributelor ศ™i atribuirea valorii implicite โ€ž1001โ€ atributului โ€žmanagerโ€.
  • Code liniile 22-26: Definirea membrului โ€žinsert_recordsโ€, รฎn care valorile atributelor sunt inserate รฎn tabelul โ€žempโ€.
  • Code liniile 27-34: Definirea membrului โ€ždisplay_recordsโ€, care afiศ™eazฤƒ valorile atributelor de tip obiect.

ieศ™ire:

Tip creat

Tip body creat

Pas 2) Crearea unui bloc anonim pentru a apela tipul de obiect creat prin constructorul implicit pentru emp_no 1005.

Captura de ecran de mai jos prezintฤƒ blocul anonim care apeleazฤƒ emp_object prin constructorul implicit.

Bloc anonim care apeleazฤƒ emp_object prin constructorul implicit pentru 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;

Code Explicaศ›ie

  • Code liniile 37-45: Inserarea รฎnregistrฤƒrilor folosind constructorul implicit. Apelul cฤƒtre constructor conศ›ine numฤƒrul real de valori ale atributelor.
  • Code linia 38: Declarฤƒ โ€žguru_emp_detโ€ ca fiind tipul de obiect โ€žemp_objectโ€.
  • Code linia 41: Instrucศ›iunea โ€žguru_emp_det.display_recordsโ€ apeleazฤƒ membrul โ€ždisplay_recordsโ€, iar valorile atributelor sunt afiศ™ate.
  • Code linia 42: Instrucศ›iunea โ€žguru_emp_det.insert_recordsโ€ apeleazฤƒ membrul โ€žinsert_recordsโ€, iar valorile atributelor sunt inserate รฎn tabel. Blocul valideazฤƒ apoi tranzacศ›ie.

ieศ™ire:

Numele angajatului: RRR

Numฤƒr de angajat: 1005

Salariu: 20000

Manager: 1000

Pas 3) Crearea unui bloc anonim pentru a apela tipul de obiect creat prin constructorul explicit pentru emp_no 1006.

Captura de ecran de mai jos prezintฤƒ blocul anonim care apeleazฤƒ emp_object prin constructorul explicit cu trei argumente.

Bloc anonim care apeleazฤƒ emp_object prin constructorul explicit pentru 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;
/

producศ›ie

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

Code Explicaลฃie:

  • Code liniile 46-53: Inserarea รฎnregistrฤƒrii folosind constructorul explicit.
  • Code linia 46: Declarฤƒ โ€žguru_emp_detโ€ ca fiind tipul de obiect โ€žemp_objectโ€.
  • Code linia 50: Instrucศ›iunea โ€žguru_emp_det.display_recordsโ€ apeleazฤƒ membrul โ€ždisplay_recordsโ€, iar valorile atributelor sunt afiศ™ate.
  • Code linia 51: Instrucศ›iunea โ€žguru_emp_det.insert_recordsโ€ apeleazฤƒ membrul โ€žinsert_recordsโ€, iar valorile atributelor sunt inserate รฎn tabel. Deoarece sunt transmise doar trei argumente, constructorul explicit seteazฤƒ ID-ul managerului la valoarea implicitฤƒ 1001.

Moศ™tenirea รฎn tipul obiectului

Proprietatea de moศ™tenire permite unui tip de subobiect sฤƒ acceseze toate atributele ศ™i membrii tipului de superobiect sau ai tipului de obiect pฤƒrinte.

Tipul de sub-obiect se numeศ™te tipul de obiect moศ™tenit, iar tipul de super-obiect se numeศ™te tipul de obiect pฤƒrinte. Sintaxa de mai jos aratฤƒ cum se creeazฤƒ tipuri de obiecte pฤƒrinte ศ™i moศ™tenite. Captura de ecran de mai jos prezintฤƒ sintaxa tipului pฤƒrinte (SUPER) marcat ca NESFINAL.

Sintaxa CREATE TYPE pentru un tip de obiect pฤƒrinte NOT FINAL utilizat รฎn moศ™tenire

CREATE TYPE <object_type_name_parent> AS OBJECT
(
<attribute_l><datatype>,
.
.
)NOT FINAL;
/

Explicaศ›ia sintaxei:

  • Sintaxa de mai sus ilustreazฤƒ crearea tipului SUPER. Clauza NOT FINAL permite moศ™tenirea tipului.

Captura de ecran de mai jos prezintฤƒ sintaxa de tip moศ™tenitฤƒ (SUB) creatฤƒ cu cuvรขntul cheie UNDER.

Sintaxa CREATE TYPE UNDER pentru un tip de subobiect care moศ™teneศ™te de la un pฤƒrinte

CREATE TYPE<object_type_name_sub>UNDER<object_type_name_parent>
(
<attribute_l><datatype>,
.
);
/

Explicaศ›ia sintaxei:

  • Sintaxa de mai sus prezintฤƒ crearea tipului SUB. Acesta conศ›ine toศ›i membrii ศ™i atributele din tipul de obiect pฤƒrinte.

Exemplu 1: รŽn exemplul de mai jos, folosim proprietatea de moศ™tenire pentru a insera o รฎnregistrare cu ID-ul managerului โ€ž1002โ€ pentru รฎnregistrarea respectivฤƒ (โ€žRRRโ€, 1007, 20000). Executฤƒm programul รฎn urmฤƒtorii paศ™i.

  • Pasul 1: Creaศ›i tipul SUPER.
  • Pasul 2: Creaศ›i tipul ศ™i corpul SUB.
  • Pasul 3: Creaศ›i un bloc anonim pentru a apela tipul SUB.

Pasul 1) Creaศ›i tipul SUPER sau tipul Pฤƒrinte.

Captura de ecran de mai jos aratฤƒ super-tipul emp_object creat cu clauza NOT FINAL.

Crearea supertipului emp_object NOT FINAL pentru exemplul de moศ™tenire

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 Explicaลฃie:

  • Code liniile 1-9: Se creeazฤƒ tipul de obiect โ€žemp_objectโ€ cu 4 atribute ศ™i 3 membri. Acesta conศ›ine definiศ›ia unui constructor cu doar 3 parametri. A fost declarat ca โ€žNOT FINALโ€, deci este un tip pฤƒrinte.

Pasul 2) Creaศ›i tipul SUB sub tipul SUPER.

Captura de ecran de mai jos aratฤƒ tipul moศ™tenit sub_emp_object ศ™i corpul sฤƒu รฎn curs de creare.

Crearea tipului moศ™tenit sub_emp_object ศ™i a corpului sฤƒu cu insert_default_mgr

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 Explicaลฃie:

  • Code liniile 10-13: Crearea atributului โ€žsub_emp_objectโ€ ca tip moศ™tenit cu un atribut suplimentar โ€ždefault_managerโ€ ศ™i o declaraศ›ie de procedurฤƒ membru.
  • Code linia 14: Crearea corpului pentru tipul de obiect moศ™tenit.
  • Code liniile 16-21: Definirea procedurii membre care insereazฤƒ รฎnregistrฤƒri รฎn tabelul 'emp' cu valorile din tipul de obiect SUPER, cu excepศ›ia valorii manager. Pentru valoarea managerului, se utilizeazฤƒ 'default_manager' din tipul SUB.

Pasul 3) Crearea unui bloc anonim pentru apelarea tipului SUB.

Captura de ecran de mai jos prezintฤƒ blocul anonim care apeleazฤƒ tipul SUB ศ™i introduce ID-ul implicit al managerului.

Bloc anonim care apeleazฤƒ tipul sub_emp_object pentru a insera un ID de manager implicit

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 Explicaลฃie:

  • Code linia 25: Se declarฤƒ โ€žguru_emp_detโ€ ca fiind de tipul โ€žsub_emp_objectโ€.
  • Code linia 27: Iniศ›ializarea obiectului cu constructorul implicit. Constructorul are 5 parametri (4 atribute din tipul PARENT ศ™i 1 atribut din tipul SUB). Ultimul parametru (1002) defineศ™te valoarea atributului default_manager.
  • Code linia 28: Apelarea membrului โ€žinsert_default_mgrโ€ pentru a insera รฎnregistrarea cu ID-ul implicit de manager transmis รฎn constructor.

Egalitatea obiectelor PL/SQL

Instanศ›ele obiectelor care aparศ›in aceluiaศ™i tip de obiect pot fi comparate pentru egalitate. Pentru a face acest lucru, tipul de obiect are nevoie de o metodฤƒ specialฤƒ numitฤƒ metoda ORDER.

Aceastฤƒ metodฤƒ ORDER ar trebui sฤƒ fie o funcศ›ie care returneazฤƒ un tip numeric. Acceptฤƒ doi parametri ca intrare (primul parametru: id-ul instanศ›ei obiectului self; al doilea parametru: id-ul altei instanศ›e a obiectului).

ID-urile celor douฤƒ instanศ›e de obiect sunt comparate, iar rezultatul este returnat sub formฤƒ de numฤƒr.

  • O valoare pozitivฤƒ indicฤƒ faptul cฤƒ instanศ›a obiectului SELF este mai mare decรขt cealaltฤƒ instanศ›ฤƒ.
  • O valoare negativฤƒ indicฤƒ faptul cฤƒ instanศ›a obiectului SELF este mai micฤƒ decรขt cealaltฤƒ instanศ›ฤƒ.
  • Zero indicฤƒ faptul cฤƒ instanศ›a obiectului SELF este egalฤƒ cu cealaltฤƒ instanศ›ฤƒ.
  • Dacฤƒ oricare dintre instanศ›e este nulฤƒ, funcศ›ia returneazฤƒ null.

Captura de ecran de mai jos prezintฤƒ sintaxa funcศ›iei membru ORDER care trebuie inclusฤƒ รฎn corpul tipului pentru verificarea egalitฤƒศ›ii.

Sintaxa funcศ›iei membre ORDER utilizatฤƒ pentru a compara instanศ›ele obiectelor pentru egalitate

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

Explicaศ›ia sintaxei:

  • Sintaxa de mai sus aratฤƒ funcศ›ia ORDER care trebuie inclusฤƒ รฎn corpul tipului pentru verificarea egalitฤƒศ›ii.
  • Parametrul pentru aceastฤƒ funcศ›ie ar trebui sฤƒ fie o instanศ›ฤƒ de acelaศ™i tip de obiect.
  • Funcศ›ia poate fi apelatฤƒ ca โ€žobj_instance_1.match(obj_instance_2)โ€, iar aceastฤƒ expresie returneazฤƒ valoarea numericฤƒ afiศ™atฤƒ, unde obj_instance_1 ศ™i obj_instance_2 sunt instanศ›e ale tipului de obiect.

Exemplu 1: รŽn exemplul urmฤƒtor, comparฤƒm douฤƒ obiecte. Creฤƒm douฤƒ instanศ›e ศ™i comparฤƒm atributul โ€žsalaryโ€ รฎntre ele. Facem acest lucru รฎn doi paศ™i.

  • Pasul 1: Creaศ›i tipul ศ™i corpul obiectului.
  • Pasul 2: Creaศ›i blocul anonim pentru a compara instanศ›ele obiectului.

Pasul 1) Crearea tipului ศ™i corpului obiectului.

Capturile de ecran de mai jos prezintฤƒ specificaศ›ia emp_object_equality ศ™i corpul acesteia, care defineศ™te funcศ›ia ORDER ce comparฤƒ atributul salariu.

Crearea specificaศ›iei de tip de obiect emp_object_equality cu o funcศ›ie ORDER Definirea corpului de tip emp_object_equality care comparฤƒ atributul salariu

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 Explicaลฃie:

  • Code liniile 1-4: Se creeazฤƒ tipul de obiect โ€žemp_object_equalityโ€ cu 1 atribut ศ™i 1 membru.
  • Code liniile 6-16: Definirea funcศ›iei ORDER care comparฤƒ atributul โ€žsalariuโ€ al instanศ›ei SELF cu instanศ›a parametrului. Returneazฤƒ o valoare negativฤƒ dacฤƒ salariul SELF este mai mic, o valoare pozitivฤƒ dacฤƒ salariul SELF este mai mare ศ™i 0 dacฤƒ salariile sunt egale.

Code ieศ™ire:

Tip creat

Pasul 2) Crearea blocului anonim pentru compararea instanศ›elor obiectului.

Captura de ecran de mai jos prezintฤƒ blocul anonim care comparฤƒ douฤƒ instanศ›e emp_object_equality dupฤƒ salariu.

Bloc anonim care comparฤƒ douฤƒ instanศ›e emp_object_equality dupฤƒ salariu

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

producศ›ie

Salary of second instance is greater

Code Explicaลฃie:

  • Code linia 20: Declararea obiectului โ€žl_obj_1โ€ฒ de tipul โ€žemp_object_equalityโ€.
  • Code linia 21: Declararea obiectului โ€žl_obj_2โ€ฒ de tipul โ€žemp_object_equalityโ€.
  • Code linia 23: Se iniศ›ializeazฤƒ 'l_obj_1' cu valoarea salarialฤƒ '15000'.
  • Code linia 24: Se iniศ›ializeazฤƒ 'l_obj_2' cu valoarea salarialฤƒ '17000'.
  • Code liniile 25-33: Afiศ™area mesajului pe baza numฤƒrului returnat de funcศ›ia ORDER.

รŽntrebฤƒri frecvente

Un tip de obiect modeleazฤƒ o singurฤƒ entitate din lumea realฤƒ cu atribute ศ™i metode. A colectare โ€” un VARRAY, un tabel imbricat sau o matrice asociativฤƒ โ€” conศ›ine mai multe elemente ale unui singur tip de date. Tipurile de obiecte descriu structura ศ™i comportamentul, รฎn timp ce colecศ›iile stocheazฤƒ valori multiple.

Ambele comparฤƒ instanศ›ele obiectelor. O metodฤƒ MAP returneazฤƒ o singurฤƒ valoare scalarฤƒ care Oracle foloseศ™te pentru a sorta sau compara obiecte, รฎn timp ce o metodฤƒ ORDER comparฤƒ direct douฤƒ instanศ›e ศ™i returneazฤƒ un numฤƒr negativ, zero sau pozitiv. Un tip poate defini una sau alta, nu ambele.

Da. Puteศ›i crea un tabel de obiecte unde fiecare rรขnd este o instanศ›ฤƒ de obiect sau puteศ›i utiliza un tip de obiect ca tip de date al unei coloane de tabel. Acest lucru permite Oracle persistฤƒ obiectele structurate direct รฎn baza de date, nu doar รฎn memorie.

Un tip NOT INSTANTIABLE nu poate crea obiecte direct; acศ›ioneazฤƒ ca un abstracbaza t pe care o extind alte tipuri. Combinatฤƒ cu NOT FINAL, defineศ™te un supertip ale cฤƒrui subtipuri oferฤƒ implementarea concretฤƒ a metodelor sale declarate.

Folosiศ›i ALTER TYPE pentru a adฤƒuga sau elimina atribute ศ™i metode, adฤƒugaศ›i CASCADE pentru a actualiza obiectele dependente ศ™i folosiศ›i DROP TYPE pentru a elimina tipul. Un tip utilizat รฎncฤƒ de tabele sau alte tipuri nu poate fi eliminat pรขnฤƒ cรขnd acele dependente nu sunt gestionate mai รฎntรขi.

Interogaศ›i vizualizฤƒrile dicศ›ionarului de date USER_TYPES ศ™i ALL_TYPES pentru numele tipurilor ศ™i USER_TYPE_ATTRS ศ™i USER_TYPE_METHODS pentru atributele ศ™i metodele acestora. Aceste vizualizฤƒri vฤƒ permit sฤƒ auditaศ›i un model de obiect existent fฤƒrฤƒ a citi codul sursฤƒ.

Da. Copilotul GitHub schiศ›eazฤƒ specificaศ›iile CREATE TYPE, metodele TYPE BODY, constructorii ศ™i funcศ›iile ORDER dintr-un comentariu. RevVizualizaศ›i tipurile de date ale atributelor, parametrii constructorului ศ™i clauzele de moศ™tenire รฎnainte de a implementa tipul generat.

Asistenศ›ii inteligenศ›i artificiali analizeazฤƒ tabelele ศ™i sugereazฤƒ tipuri de obiecte, harta atributelorpings ศ™i ierarhii de moศ™tenire. Aceastฤƒ analizฤƒ a รฎnvฤƒศ›ฤƒrii automate semnaleazฤƒ atributele redundante, constructorii lipsฤƒ ศ™i moศ™tenirea prea profundฤƒ รฎnainte ca modelul de obiect sฤƒ ajungฤƒ รฎn producศ›ie, รฎmbunฤƒtฤƒศ›ind mentenabilitatea.

Rezumaศ›i aceastฤƒ postare cu: