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.
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.
- Attributs
- 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.
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.
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.
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
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 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
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
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รฉ.
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.
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.
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.
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
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.
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.
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.
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.


















