Oracle Tutoriel sur les types d'objets PL/SQL avec des EXEMPLES

Quโ€™est-ce que le type dโ€™objet en PL/SQL ?

La programmation orientรฉe objet est particuliรจrement adaptรฉe ร  la crรฉation de composants rรฉutilisables et d'applications complexes. Ils sont organisรฉs autour d'ยซ objets ยป plutรดt que d'ยซ actions ยป, c'est-ร -dire que les programmes sont conรงus pour fonctionner et interagir avec l'objet dans son ensemble plutรดt qu'avec une action unique. Ce concept permet au programmeur de renseigner et de manipuler les dรฉtails au niveau des entitรฉs d'objet.

L'image ci-dessous montre un exemple du type d'objet dans lequel un compte bancaire est considรฉrรฉ comme une entitรฉ objet. Les attributs d'objet incluent des รฉlรฉments qui contiennent certaines valeurs d'attribut, par exemple dans le compte bancaire ; il s'agit du numรฉro de compte, du solde bancaire, etc., tandis que les mรฉthodes objets dรฉcrivent des รฉlรฉments tels que le calcul du taux d'intรฉrรชt, la gรฉnรฉration d'un relevรฉ bancaire, etc., qui nรฉcessitent l'exรฉcution d'un certain processus.

Types d'objets en PL/SQL

En PL/SQL, la programmation orientรฉe objet est basรฉe sur les types d'objets.

Un type d'objet peut reprรฉsenter n'importe quelle entitรฉ du monde rรฉel. Nous allons discuter d'autres types d'objets dans ce chapitre.

Composants des types d'objet

PL / SQL Le type dโ€™objet contient principalement deux composants.

  1. Attributs
  2. Membres/Mรฉthodes

Attributs

Les attributs sont la colonne ou le champ dans lequel les donnรฉes sont stockรฉes. Chaque attribut sera mappรฉ au type de donnรฉes qui dรฉfinit le type de traitement et de stockage pour cet attribut. L'attribut peut รชtre de n'importe quel type valide Type de donnรฉes PL/SQL, ou il peut s'agir d'un autre type d'objet.

Membres/Mรฉthodes

Les membres ou les mรฉthodes sont des sous-programmes dรฉfinis dans le type d'objet. Ils ne sont utilisรฉs pour stocker aucune donnรฉe. Ils sont principalement utilisรฉs pour dรฉfinir un processus ร  l'intรฉrieur du type d'objet. Pour des exemples de validation des donnรฉes avant de remplir le type d'objet. Ils sont dรฉclarรฉs dans la section type d'objet et dรฉfinis dans la section corps du type d'objet du type d'objet. La section Corps dans le type dโ€™objet est une partie facultative. Si aucun membre nโ€™est prรฉsent, alors un type dโ€™objet ne contiendra aucune partie de corps.

Crรฉer un objet dans Oracle

Un type d'objet ne peut pas รชtre crรฉรฉ au niveau du sous-programme. Il ne peut รชtre crรฉรฉ qu'au niveau du schรฉma. Une fois le type d'objet dรฉfini dans le schรฉma, il peut รชtre utilisรฉ dans les sous-programmes. Le type d'objet peut รชtre crรฉรฉ en utilisant 'CREATE TYPE'. Le corps du type ne peut รชtre crรฉรฉ qu'aprรจs avoir crรฉรฉ son type d'objet.

Crรฉer un objet dans OracleCrรฉer un objet dans 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;โ€ญ
.
.	โ€ฌ
);
/

Explication de la syntaxe :

  • La syntaxe ci-dessus montre la crรฉation de 'OBJECT' avec des attributs et de 'OBJECT-BODY' avec des mรฉthodes.
  • Les mรฉthodes peuvent รฉgalement รชtre surchargรฉes dans le corps de l'objet.

Initialisation de la dรฉclaration du type d'objet

Comme les autres composants PL/SQL, les types dโ€™objets doivent รฉgalement รชtre dรฉclarรฉs avant de les utiliser dans le programme.

Une fois le type d'objet crรฉรฉ, il peut รชtre utilisรฉ dans la section dรฉclarative du sous-programme pour dรฉclarer une variable de ce type d'objet.

Chaque fois qu'une variable est dรฉclarรฉe dans le sous-programme comme type d'objet, au moment de l'exรฉcution, une nouvelle instance du type d'objet sera crรฉรฉe, et cette instance nouvellement crรฉรฉe peut รชtre rรฉfรฉrencรฉe au nom de la variable. De cette maniรจre, un seul type d'objet peut stocker plusieurs valeurs sous diffรฉrentes instances.

Initialisation de la dรฉclaration du type d'objet

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

Explication de la syntaxe :

  • La syntaxe ci-dessus montre la dรฉclaration d'une variable en tant que type d'objet dans la section dรฉclarative.

Une fois que la variable est dรฉclarรฉe comme type d'objet dans un sous-programme, elle sera atomiquement nulle, c'est-ร -dire que l'objet entier lui-mรชme sera nul. Il doit รชtre initialisรฉ avec des valeurs pour les utiliser dans le programme. Ils peuvent รชtre initialisรฉs ร  l'aide de constructeurs.

Les constructeurs sont la mรฉthode implicite d'un objet qui peut รชtre rรฉfรฉrencรฉe avec le mรชme nom que celui du type d'objet. La syntaxe ci-dessous montre l'initialisation du type d'objet.

Initialisation de la dรฉclaration du type d'objet

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

Explication de la syntaxe :

  • La syntaxe ci-dessus montre l'initialisation de l'instance de type d'objet avec une valeur nulle.
  • Dรฉsormais, l'objet lui-mรชme n'est pas nul car il a รฉtรฉ initialisรฉ, mais les attributs ร  l'intรฉrieur de l'objet seront nuls car nous n'avons attribuรฉ aucune valeur ร  ces attributs.

Constructeurs

Les constructeurs sont la mรฉthode implicite d'un objet qui peut รชtre rรฉfรฉrencรฉe avec le mรชme nom que celui du type d'objet. Chaque fois que l'objet est rรฉfรฉrencรฉ pour la premiรจre fois, ce constructeur sera appelรฉ implicitement.

Nous pouvons รฉgalement initialiser les objets en utilisant ces constructeurs. Le constructeur peut รชtre dรฉfini explicitement en dรฉfinissant le membre dans le corps du type d'objet avec le mรชme nom que le type d'objet.

Exemple 1: Dans l'exemple suivant, nous allons utiliser le membre de type objet pour insรฉrer l'enregistrement dans la table emp avec les valeurs ('RRR', 1005, 20000, 1000) et ('PPP', 1006, 20000, 1001). Une fois les donnรฉes insรฉrรฉes, nous allons les afficher en utilisant un membre de type objet. Nous allons รฉgalement utiliser le constructeur explicite pour renseigner par dรฉfaut l'identifiant du gestionnaire avec la valeur 1001 pour le deuxiรจme enregistrement.

Nous allons l'exรฉcuter dans les รฉtapes ci-dessous.

  • Step1:
  • Crรฉer un type d'objet
  • Corps du type d'objet
  • ร‰tape 2 : Crรฉation d'un bloc anonyme pour appeler le type d'objet crรฉรฉ via un constructeur implicite pour emp_no 1005.
  • ร‰tape 3 : Crรฉation d'un bloc anonyme pour appeler le type d'objet crรฉรฉ via un constructeur explicite pour emp_no 1006.

ร‰tape 1) Crรฉer un type d'objet et un corps de type d'objet

Constructeurs

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

Constructeurs

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

Explication du code

  • Ligne de code 1-9: Crรฉation du type d'objet 'emp_object' avec 4 attributs et 3 membres. Il contient la dรฉfinition des constructeurs avec seulement 3 paramรจtres. (Le constructeur implicite rรฉel contiendra le nombre de paramรจtres รฉgal au nombre d'attributs prรฉsents dans le type d'objet)
  • Ligne de code 10: Crรฉation du corps du type.
  • Ligne de code 11-21: Dรฉfinition du constructeur explicite. Attribution de la valeur du paramรจtre aux attributs et attribution de la valeur ร  l'attribut ยซ manager ยป avec la valeur par dรฉfaut ยซ 1001 ยป.
  • Ligne de code 22-26: Dรฉfinition du membre 'insert_records' dans lequel les valeurs des attributs sont insรฉrรฉes dans la table 'emp'.
  • Ligne de code 27-34: Dรฉfinition du membre 'display_records' dans lequel afficher les valeurs des attributs de type d'objet.

Sortie

Type crรฉรฉ

Corps de type crรฉรฉ

ร‰tape 2) Crรฉation d'un bloc anonyme pour appeler le type d'objet crรฉรฉ via un constructeur implicite pour emp_no 1005

Constructeurs

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;

Explication du code

  • Ligne de code 37-45: Insertion des enregistrements ร  l'aide du constructeur implicite. L'appel au constructeur contient le nombre rรฉel de valeurs d'attributs.
  • Ligne de code 38: Dรฉclare le guru_emp_det comme type d'objet de 'emp_object'.
  • Ligne de code 41: L'instruction 'guru_emp_det.display_records' a appelรฉ la fonction membre 'diplay_records' et les valeurs des attributs sont affichรฉes
  • Ligne de code 42: L'instruction 'guru_emp_det.insert_records' a appelรฉ la fonction membre 'insert_records' et les valeurs des attributs sont insรฉrรฉes dans le tableau.

Sortie

Nom de l'employรฉ : RRR

Numรฉro d'employรฉ : 1005

Salaire: 20000

Gestionnaire : 1000

ร‰tape 3) Crรฉation d'un bloc anonyme pour appeler le type d'objet crรฉรฉ via un constructeur explicite pour emp_no 1006

Constructeurs

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

Sortie

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

Explication du code :

  • Ligne de code 46-53: Insertion des enregistrements ร  l'aide du constructeur explicite.
  • Ligne de code 46: Dรฉclare le guru_emp_det comme type d'objet de 'emp_object'.
  • Ligne de code 50: L'instruction 'guru_emp_det.display_records' a appelรฉ la fonction membre 'display_records' et les valeurs des attributs sont affichรฉes
  • Ligne de code 51: L'instruction 'guru_emp_det.insert_records' a appelรฉ la fonction membre 'insert_records' et les valeurs des attributs sont insรฉrรฉes dans le tableau.

Hรฉritage dans le type d'objet

La propriรฉtรฉ d'hรฉritage permet au type de sous-objet d'accรฉder ร  tous les attributs et membres du type de super-objet ou du type d'objet parent.

Le type de sous-objet est appelรฉ type d'objet hรฉritรฉ et le type de super-objet est appelรฉ type d'objet parent. La syntaxe ci-dessous montre comment crรฉer un type d'objet parent et hรฉritรฉ.

Hรฉritage dans le type d'objet

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

Explication de la syntaxe :

  • La syntaxe ci-dessus montre la crรฉation du type SUPER.

Hรฉritage dans le type d'objet

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

Explication de la syntaxe :

  • La syntaxe ci-dessus montre la crรฉation du type SUB. Il contient tous les membres et attributs du type d'objet parent.

Exemple1: Dans l'exemple ci-dessous, nous allons utiliser la propriรฉtรฉ d'hรฉritage pour insรฉrer l'enregistrement avec l'identifiant de gestionnaire ยซ 1002 ยป pour l'enregistrement suivant (ยซ RRR ยป, 1007, 20000).

Nous allons exรฉcuter le programme ci-dessus dans les รฉtapes suivantes

  • ร‰tape 1 : Crรฉez le type SUPER.
  • ร‰tape 2 : Crรฉez le type et le corps SUB.
  • ร‰tape 3 : Crรฉation d'un bloc anonyme pour appeler le type SUB.

ร‰tape 1) Crรฉez un type SUPER ou un type parent.

Hรฉritage dans le type d'objet

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

Explication du code :

  • Ligne de code 1-9: Crรฉation du type d'objet 'emp_object' avec 4 attributs et 3 membres. Il contient la dรฉfinition des constructeurs avec seulement 3 paramรจtres. Il a รฉtรฉ dรฉclarรฉ comme ยซ NON FINAL ยป, il s'agit donc d'un type parent.

ร‰tape 2) Crรฉez le type SUB sous le type SUPER.

Hรฉritage dans le type d'objet

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

Explication du code :

  • Ligne de code 10-13: Crรฉation du sub_emp_object en tant que type hรฉritรฉ avec un attribut supplรฉmentaire 'default_manager' et une dรฉclaration de procรฉdure membre.
  • Ligne de code 14: Crรฉation du corps pour le type d'objet hรฉritรฉ.
  • Ligne de code 16- 21: Dรฉfinition de la procรฉdure membre qui insรจre les enregistrements dans la table ยซ emp ยป avec les valeurs du type d'objet ยซ SUPER ยป, ร  l'exception de la valeur du gestionnaire. Pour la valeur du gestionnaire, il utilise le type ยซ default_manager ยป de ยซ SUB ยป.

ร‰tape 3) Crรฉation d'un bloc anonyme pour appeler le type SUB

Hรฉritage dans le type d'objet

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

Explication du code :

  • Ligne de code 25: Dรฉclarer 'guru_emp_det' comme type 'sub_emp_object'.
  • Ligne de code 27: Initialisation de l'objet avec le constructeur implicite. Le constructeur a 5 paramรจtres (4 attributs du type PARENT et 2 attributs du type SUB). Le dernier paramรจtre (1002) dรฉfinit la valeur de l'attribut default_manager
  • Ligne de code 28: Appel du membre 'insert_default_mgr' pour insรฉrer les enregistrements avec l'identifiant de gestionnaire par dรฉfaut transmis dans le constructeur.

ร‰galitรฉ des objets PL/SQL

L'instance d'objet qui appartient aux mรชmes objets peut รชtre comparรฉe pour vรฉrifier son รฉgalitรฉ. Pour cela, nous devons avoir la mรฉthode spรฉciale dans le type d'objet appelรฉe mรฉthode 'ORDER'.

Cette mรฉthode 'ORDER' doit รชtre la fonction qui renvoie le type numรฉrique. Il prend deux paramรจtres en entrรฉe (premier paramรจtre : identifiant de l'instance d'auto-objet, deuxiรจme paramรจtre : identifiant d'une autre instance d'objet).

L'identifiant des deux instances d'objet est comparรฉ et le rรฉsultat est renvoyรฉ sous forme numรฉrique.

  • Une valeur positive signifie que l'instance de l'objet SELF est supรฉrieure ร  une autre instance.
  • Une valeur nรฉgative signifie que l'instance de l'objet SELF est infรฉrieure ร  une autre instance.
  • Zรฉro signifie que l'instance de l'objet SELF est รฉgale ร  une autre instance.
  • Si lโ€™une des instances est nulle, cette fonction renverra null.

ร‰galitรฉ des objets 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;
  .
  .
);
/

Explication de la syntaxe :

  • La syntaxe ci-dessus montre la fonction ORDER qui doit รชtre incluse dans le corps du type pour la vรฉrification de l'รฉgalitรฉ.
  • Le paramรจtre de cette fonction doit รชtre une instance du mรชme type d'objet.
  • La fonction ci-dessus peut รชtre appelรฉe ยซ obj_instance_1.match(obj_instance_2) ยป et cette expression renverra la valeur numรฉrique comme indiquรฉ, oรน obj_instance_1 et obj_instance_2 sont l'instance de object_type_name.

Example1: Dans l'exemple suivant, nous allons voir comment comparer deux objets. Nous allons crรฉer deux instances et comparer l'attribut 'salaire' entre elles. Nous allons procรฉder en deux รฉtapes.

  • ร‰tape 1 : Crรฉation du type et du corps de l'objet.
  • ร‰tape 2 : Crรฉation du bloc anonyme pour appeler et comparer l'instance d'objet.

ร‰tape 1) Crรฉation du type et du corps de l'objet.

ร‰galitรฉ des objets PL/SQL

ร‰galitรฉ des objets 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;
/

Explication du code :

  • Ligne de code 1 ร  4 : Crรฉation du type d'objet 'emp_object_equality' avec 1 attribut et 1 membre.
  • Ligne de code 6-16: Dรฉfinition de la fonction ORDER qui compare l'attribut 'salary' de l'instance SELF et le type d'instance de paramรจtre. Il renvoie nรฉgatif si le salaire SELF est infรฉrieur ou positif si le salaire SELF est supรฉrieur et 0 si les salaires sont รฉgaux.

Sortie de code :

Type crรฉรฉ

ร‰tape 2) Crรฉation du bloc anonyme pour appeler comparer l'instance d'objet.

ร‰galitรฉ des objets 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;
/

Sortie

Salary of second instance is greater

Explication du code :

  • Ligne de code 20: Dรฉclaration du l_obj_1 de type emp_object_equality.
  • Ligne de code 21: Dรฉclaration du l_obj_2 de type emp_object_equality.
  • Ligne de code 23: Initialisation de l_obj_1 avec une valeur de salaire de '15000'
  • Ligne de code 24: Initialisation de l_obj_1 avec une valeur de salaire de '17000'
  • Ligne de code 25-33: Imprime le message en fonction du numรฉro de retour de la fonction COMMANDE.

Rรฉsumรฉ

Dans ce chapitre, nous avons vu le type d'objet et ses propriรฉtรฉs. Nous avons รฉgalement discutรฉ des constructeurs, des membres, des attributs, de l'hรฉritage et de l'รฉgalitรฉ dans les objets PL/SQL.

Rรฉsumez cet article avec :