Oracle Types d'objets PL/SQL : CREATE TYPE avec exemples
โก Rรฉsumรฉ intelligent
Les types d'objets en PL/SQL apportent la programmation orientรฉe objet ร OracleCes types permettent de modรฉliser des entitรฉs du monde rรฉel dotรฉes d'attributs et de mรฉthodes. Ils prennent en charge les constructeurs, l'hรฉritage et la comparaison d'รฉgalitรฉ, ce qui permet ร un seul type au niveau du schรฉma de stocker et de traiter des donnรฉes structurรฉes.

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. Les programmes sont organisรฉs autour d'ยซ objets ยป plutรดt que d'ยซ actions ยป ; autrement dit, ils sont conรงus pour interagir avec un objet entier et non avec une action isolรฉe. Cette approche permet au programmeur de renseigner et de manipuler les dรฉtails au niveau de l'entitรฉ objet.
L'image ci-dessous illustre un exemple de type d'objet oรน un compte bancaire est traitรฉ comme une entitรฉ objet. Les attributs de l'objet contiennent des valeurs (pour un compte bancaire, il s'agit du numรฉro de compte, du solde, etc.), tandis que les mรฉthodes de l'objet dรฉcrivent des actions telles que le calcul du taux d'intรฉrรชt ou la gรฉnรฉration d'un relevรฉ bancaire, chacune nรฉcessitant un traitement.
In PL / SQLLa programmation orientรฉe objet repose sur les types d'objets. Un type d'objet peut reprรฉsenter n'importe quelle entitรฉ du monde rรฉel. Les sections suivantes explorent les types d'objets, leurs composants, ainsi que la maniรจre de les crรฉer et de les utiliser.
Composants des types d'objet
Un type d'objet PL/SQL contient principalement deux composants.
- Attributs
- Membres/Mรฉthodes
Attributs
Les attributs sont les colonnes ou les champs dans lesquels les donnรฉes sont stockรฉes. Chaque attribut est associรฉ ร un type de donnรฉes qui dรฉfinit son traitement et son stockage. Un 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 mรฉthodes, sont sous-programmes Ces membres sont dรฉfinis au sein du type objet. Ils ne servent pas ร stocker des donnรฉes ; ils dรฉfinissent plutรดt le traitement effectuรฉ au sein du type objet, par exemple la validation des donnรฉes avant leur insertion dans lโobjet. Ils sont dรฉclarรฉs dans la spรฉcification du type objet et dรฉfinis dans son corps. Le corps est facultatif : si aucun membre nโest prรฉsent, le type objet nโa pas de corps.
Crรฉer un objet dans Oracle
Un type d'objet ne peut รชtre crรฉรฉ qu'au niveau du schรฉma et non au niveau d'un sous-programme. Une fois dรฉfini dans le schรฉma, il peut รชtre utilisรฉ dans les sous-programmes. La crรฉation du type d'objet s'effectue ร l'aide de l'instruction ยซ CREATE TYPE ยป, et son corps ne peut รชtre crรฉรฉ qu'aprรจs la crรฉation du type d'objet.
Les captures d'รฉcran ci-dessous montrent la syntaxe CREATE TYPE pour la spรฉcification de l'objet et la syntaxe CREATE TYPE BODY qui dรฉfinit ses mรฉthodes.
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 illustre la crรฉation d'un OBJET avec des attributs et d'un CORPS D'OBJET 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 de PL/SQL, les types d'objets doivent รชtre dรฉclarรฉs avant d'รชtre utilisรฉs dans un programme. Une fois le type d'objet crรฉรฉ, il peut รชtre utilisรฉ dans la section dรฉclarative d'un sous-programme pour dรฉclarer une variable de ce type.
Lorsqu'une variable est dรฉclarรฉe comme un objet, une nouvelle instance de cet objet est crรฉรฉe ร l'exรฉcution et cette instance est rรฉfรฉrencรฉe par le nom de la variable. Ainsi, un mรชme objet peut stocker plusieurs valeurs dans diffรฉrentes instances.
La capture d'รฉcran ci-dessous montre une variable dรฉclarรฉe comme un type objet ร l'intรฉrieur d'un Bloc PL/SQL.
DECLARE <variable_name> <object_type_name>; BEGIN . . END; /
Explication de la syntaxe :
- La syntaxe ci-dessus montre la dรฉclaration d'un variable en tant que type d'objet dans la section dรฉclarative.
Une fois dรฉclarรฉe comme objet dans un sous-programme, la variable est atomiquement nulle ; lโobjet lui-mรชme est nul. Elle doit รชtre initialisรฉe avec des valeurs avant de pouvoir รชtre utilisรฉe dans le programme. Lโinitialisation des objets se fait ร lโaide de constructeurs.
Les constructeurs sont les mรฉthodes implicites d'un objet auxquelles on peut faire rรฉfรฉrence en utilisant le mรชme nom que le type de l'objet. La capture d'รฉcran ci-dessous illustre l'initialisation d'une instance de type objet.
DECLARE <variable_name> <object_type_name>; BEGIN <variable_name>:=<object_type_name>(); END; /
Explication de la syntaxe :
- La syntaxe ci-dessus illustre l'initialisation d'une instance de type objet avec une valeur nulle.
- L'objet lui-mรชme n'est plus nul une fois initialisรฉ, mais les attributs qu'il contient restent nuls jusqu'ร ce que des valeurs leur soient attribuรฉes.
Constructeurs
Un constructeur est une mรฉthode implicite d'un objet, accessible par son nom identique ร celui de son type. Lors de la premiรจre utilisation de l'objet, ce constructeur est appelรฉ implicitement.
Vous pouvez รฉgalement initialiser des objets ร l'aide de ces constructeurs. Un constructeur peut รชtre dรฉfini explicitement en dรฉfinissant un membre dans le corps du type d'objet portant le mรชme nom que le type d'objet.
Exemple 1: Dans l'exemple suivant, nous utilisons le membre de type objet pour insรฉrer des enregistrements 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 les affichons ร l'aide du membre de type objet. Nous utilisons รฉgalement un constructeur explicite pour initialiser l'identifiant du responsable avec la valeur par dรฉfaut 1001 pour le deuxiรจme enregistrement.
Nous procรฉdons en suivant les รฉtapes suivantes.
- รtape 1 : Crรฉer le type dโobjet et le corps du type dโobjet.
- รtape 2 : Crรฉez un bloc anonyme pour appeler le type d'objet via le constructeur implicite pour emp_no 1005.
- รtape 3 : Crรฉez un bloc anonyme pour appeler le type d'objet via le constructeur explicite pour emp_no 1006.
รtape 1) Crรฉer un type d'objet et un corps de type d'objet.
La capture d'รฉcran ci-dessous montre la crรฉation de la spรฉcification de type d'objet emp_object avec ses attributs et ses membres.
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); /
La capture d'รฉcran ci-dessous montre la crรฉation du corps de type emp_object avec le constructeur explicite et les procรฉdures membres.
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 Explication
- Code lignes 1-9 : Crรฉation du type d'objet ยซ emp_object ยป avec 4 attributs et 3 membres. Il contient la dรฉfinition d'un constructeur avec seulement 3 paramรจtres. (Le constructeur implicite rรฉel possรจde autant de paramรจtres que d'attributs prรฉsents dans le type d'objet.)
- Code ligne 10: Crรฉation du corps du type.
- Code lignes 11-21 : Dรฉfinition du constructeur explicite. Attribution des valeurs des paramรจtres aux attributs et attribution de la valeur par dรฉfaut ยซ 1001 ยป ร lโattribut ยซ manager ยป.
- Code lignes 22-26 : Dรฉfinition du membre 'insert_records', dans lequel les valeurs des attributs sont insรฉrรฉes dans la table 'emp'.
- Code lignes 27-34 : Dรฉfinition du membre 'display_records', qui affiche les valeurs des attributs de type objet.
Sortie :
Type crรฉรฉ
Corps de type crรฉรฉ
รtape 2) Crรฉation d'un bloc anonyme pour appeler le type d'objet crรฉรฉ via le constructeur implicite pour emp_no 1005.
La capture d'รฉcran ci-dessous montre le bloc anonyme qui appelle emp_object via le constructeur implicite.
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 Explication
- Code lignes 37-45 : Insertion des enregistrements via le constructeur implicite. L'appel au constructeur contient le nombre rรฉel de valeurs d'attributs.
- Code ligne 38: Dรฉclare 'guru_emp_det' comme type d'objet 'emp_object'.
- Code ligne 41: L'instruction 'guru_emp_det.display_records' appelle le membre 'display_records' et les valeurs des attributs sont affichรฉes.
- Code ligne 42: L'instruction 'guru_emp_det.insert_records' appelle le membre 'insert_records' et les valeurs des attributs sont insรฉrรฉes dans la table. Le bloc effectue ensuite la validation. transaction.
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 le constructeur explicite pour emp_no 1006.
La capture d'รฉcran ci-dessous montre le bloc anonyme qui appelle emp_object via le constructeur explicite avec trois arguments.
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
Code Explication:
- Code lignes 46-53 : Insertion de l'enregistrement ร l'aide du constructeur explicite.
- Code ligne 46: Dรฉclare 'guru_emp_det' comme type d'objet 'emp_object'.
- Code ligne 50: L'instruction 'guru_emp_det.display_records' appelle le membre 'display_records' et les valeurs des attributs sont affichรฉes.
- Code ligne 51: L'instruction ยซ guru_emp_det.insert_records ยป appelle la mรฉthode ยซ insert_records ยป et les valeurs des attributs sont insรฉrรฉes dans la table. Comme seuls trois arguments sont fournis, le constructeur explicite attribue ร l'identifiant du responsable sa valeur par dรฉfaut, 1001.
Hรฉritage dans le type d'objet
La propriรฉtรฉ d'hรฉritage permet ร un sous-type d'objet d'accรฉder ร tous les attributs et membres du super-type d'objet, ou type d'objet parent.
Le type sous-objet est appelรฉ type d'objet hรฉritรฉ, et le type super-objet est appelรฉ type d'objet parent. La syntaxe ci-dessous illustre la crรฉation des types d'objets parent et hรฉritรฉ. La capture d'รฉcran ci-dessous montre la syntaxe du type parent (SUPER), marquรฉe comme NON DรFINITIVE.
CREATE TYPE <object_type_name_parent> AS OBJECT ( <attribute_l><datatype>, . . )NOT FINAL; /
Explication de la syntaxe :
- La syntaxe ci-dessus illustre la crรฉation du type SUPER. La clause NOT FINAL autorise l'hรฉritage de ce type.
La capture d'รฉcran ci-dessous montre la syntaxe du type hรฉritรฉ (SUB) crรฉรฉe avec le mot-clรฉ UNDER.
CREATE TYPE<object_type_name_sub>UNDER<object_type_name_parent> ( <attribute_l><datatype>, . ); /
Explication de la syntaxe :
- La syntaxe ci-dessus illustre la crรฉation du type SUB. Il contient tous les membres et attributs du type d'objet parent.
Exemple 1: Dans l'exemple ci-dessous, nous utilisons la propriรฉtรฉ d'hรฉritage pour insรฉrer un enregistrement avec l'identifiant de gestionnaire ยซ 1002 ยป pour l'enregistrement (ยซ RRR ยป, 1007, 20000). Nous exรฉcutons le programme en suivant les รฉtapes suivantes.
- รtape 1 : Crรฉer le type SUPER.
- รtape 2 : Crรฉez le type SUB et le corps.
- รtape 3 : Crรฉez un bloc anonyme pour appeler le type SUB.
รtape 1) Crรฉer un type SUPER ou un type parent.
La capture d'รฉcran ci-dessous montre la crรฉation du supertype emp_object avec la clause NOT FINAL.
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 Explication:
- Code lignes 1-9 : Crรฉation du type objet ยซ emp_object ยป avec 4 attributs et 3 membres. Il contient la dรฉfinition d'un constructeur avec seulement 3 paramรจtres. Dรฉclarรฉ comme ยซ NOT FINAL ยป, il s'agit d'un type parent.
รtape 2) Crรฉez un sous-type sous le type SUPER.
La capture d'รฉcran ci-dessous montre le type hรฉritรฉ sub_emp_object et son corps en cours de crรฉation.
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 Explication:
- Code lignes 10-13 : Crรฉation de 'sub_emp_object' en tant que type hรฉritรฉ avec un attribut supplรฉmentaire 'default_manager' et une dรฉclaration de procรฉdure membre.
- Code ligne 14: Crรฉation du corps pour le type d'objet hรฉritรฉ.
- Code lignes 16-21 : Dรฉfinition de la procรฉdure membre qui insรจre des enregistrements dans la table ยซ emp ยป avec les valeurs du type d'objet SUPER, ร l'exception de la valeur du responsable. Pour cette derniรจre, elle utilise ยซ default_manager ยป du type SUB.
รtape 3) Crรฉation d'un bloc anonyme pour appeler le type SUB.
La capture d'รฉcran ci-dessous montre le bloc anonyme qui appelle le type SUB et insรจre l'identifiant du gestionnaire par dรฉfaut.
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 Explication:
- Code ligne 25: Dรฉclaration de 'guru_emp_det' comme type 'sub_emp_object'.
- Code ligne 27: Initialisation de l'objet avec le constructeur implicite. Ce constructeur possรจde 5 paramรจtres (4 attributs du type PARENT et 1 attribut du type SUB). Le dernier paramรจtre (1002) dรฉfinit la valeur de l'attribut default_manager.
- Code ligne 28: Appel de la fonction membre 'insert_default_mgr' pour insรฉrer l'enregistrement avec l'identifiant du gestionnaire par dรฉfaut passรฉ dans le constructeur.
รgalitรฉ des objets PL/SQL
Les instances d'objets appartenant au mรชme type peuvent รชtre comparรฉes afin de dรฉterminer leur รฉgalitรฉ. Pour ce faire, le type d'objet requiert une mรฉthode spรฉcifique appelรฉe mรฉthode ORDER.
Cette mรฉthode ORDER doit รชtre une fonction qui renvoie un type numรฉrique. Elle prend deux paramรจtres en entrรฉe (premier paramรจtre : lโidentifiant de lโinstance de lโobjet lui-mรชme ; deuxiรจme paramรจtre : lโidentifiant dโune autre instance dโobjet).
Les identifiants des deux instances d'objet sont comparรฉs, et le rรฉsultat est renvoyรฉ sous forme de nombre.
- Une valeur positive indique que l'instance de l'objet SELF est supรฉrieure ร l'autre instance.
- Une valeur nรฉgative indique que l'instance de l'objet SELF est infรฉrieure ร l'autre instance.
- Zรฉro indique que l'instance de l'objet SELF est รฉgale ร l'autre instance.
- Si l'une des deux instances est nulle, la fonction renvoie null.
La capture d'รฉcran ci-dessous illustre la syntaxe de la fonction membre ORDER qui doit รชtre incluse dans le corps du type pour la vรฉrification d'รฉgalitรฉ.
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 d'รฉgalitรฉ.
- Le paramรจtre de cette fonction doit รชtre une instance du mรชme type d'objet.
- La fonction peut รชtre appelรฉe comme ยซ obj_instance_1.match(obj_instance_2) ยป, et cette expression renvoie la valeur numรฉrique indiquรฉe, oรน obj_instance_1 et obj_instance_2 sont des instances du type d'objet.
Exemple 1: Dans l'exemple suivant, nous comparons deux objets. Nous crรฉons deux instances et comparons leur attribut ยซ salaire ยป. Cette opรฉration se dรฉroule en deux รฉtapes.
- รtape 1 : Crรฉer le type dโobjet et le corps.
- รtape 2 : Crรฉer le bloc anonyme pour comparer les instances dโobjet.
รtape 1) Crรฉation du type d'objet et du corps.
Les captures d'รฉcran ci-dessous montrent la spรฉcification emp_object_equality et son corps, qui dรฉfinit la fonction ORDER qui compare l'attribut salary.
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 Explication:
- Code lignes 1-4 : Crรฉation du type d'objet 'emp_object_equality' avec 1 attribut et 1 membre.
- Code lignes 6-16 : Dรฉfinition de la fonction ORDER qui compare l'attribut ยซ salaire ยป de l'instance SELF et de l'instance du paramรจtre. Elle renvoie une valeur nรฉgative si le salaire de SELF est infรฉrieur, une valeur positive s'il est supรฉrieur, et 0 si les salaires sont รฉgaux.
Code Sortie :
Type crรฉรฉ
รtape 2) Crรฉation du bloc anonyme pour comparer les instances d'objet.
La capture d'รฉcran ci-dessous montre le bloc anonyme qui compare deux instances de emp_object_equality par salaire.
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; /
Sortie
Salary of second instance is greater
Code Explication:
- Code ligne 20: Dรฉclaration de 'l_obj_1' de type 'emp_object_equality'.
- Code ligne 21: Dรฉclaration de 'l_obj_2' de type 'emp_object_equality'.
- Code ligne 23: Initialisation de 'l_obj_1' avec la valeur du salaire '15000'.
- Code ligne 24: Initialisation de 'l_obj_2' avec la valeur du salaire '17000'.
- Code lignes 25-33 : Impression du message en fonction du numรฉro renvoyรฉ par la fonction ORDER.


















