Vous êtes sur la page 1sur 5

OQL

SAOUDI Lalia

Un langage de manipulation de donnes orientes objets: OQL 1. Introduction OQL, est la norme propose par le groupe ODMG et implmente par les SGBDO participant ce groupe. OQL (Object Query Language) est un langage de type dclaratif, qui peut tre utilis seul ou partir d'un langage de programmation, tel que C++ ou Java. Les requtes d'OQL peuvent appeler des mthodes, et inversement tout programme ou mthode peut contenir des requtes OQL. OQL permet d'crire des requtes, mais pas des instructions de mise jour. Ces dernires se font grce aux mthodes associes aux classes. 1. Requtes, points d'entre et rsultats 2.1Points d'entre En relationnel le point dentre est la relation. En ODMG ce sont les noms des populations dclares pour les classes (clause "Extent" de la dfinition des classes), ou des noms permanents associs des objets particuliers de la base. En effet, en ODMG, on peut donner tout objet un ou plusieurs noms permanents, qui pourront servir de point dentre dans la base. Pour cela, il suffit de dclarer un nom grce linstruction "Name". Par exemple, l'instruction: Name directeur : Personne Dclare un nom permanent, directeur, de type Personne. Il suffit alors daffecter un objet ce nom, par exemple en crant un nouvel objet comme ci-dessous : directeur = Personne(nom:"XXX", prnoms:LIST("YYY","ZZZ"), adresse:"Msila") chercher : - Dans les populations associes aux classes (clause EXTENT )nom de l'tudiant de numro 111 : SELECT e.nom FROM e IN LesEtudiants WHERE e.nE = 111 Soit Phil= Etudiant (nom:"XXX", prnoms:LIST("YYY","ZZZ"), adresse:"Msila"..) - A partir des variables nommes Phil.nom noms des cours suivis par Phil : SELECT c.nomC FROM c IN Phil.cours_suivis 2.2 Accs direct des lments nomms Directeur objet (non imprimable) Directeur.nom valeur (imprimable) Directeur.age() appel de mthode de rsultat valeur LesPersonnes collection d'objets 2.3Rsultat d'une requte : Type du rsultat : choix entre : - Objet - valeur : simple, structure En utilisant les constructeurs STRUCT, SET, LIST .. l'utilisateur peut crer de nouvelles valeurs structures - lment - collection La smantique de la requte dfinit si le rsultat est un lment ou une collection et son genre (SET, BAG) Requte : lensemble des enseignants assistants

OQL

SAOUDI Lalia

SELECT e FROM e IN LesEnseignants WHERE e.statut = 'assist' => SET d'objets Enseignant Requte : villes des enseignants SELECT e.adresse.ville FROM e IN LesEnseignants BAG de valeurs simples de type STRING (avec doubles) Requte : nom et ville de chaque enseignant Valeur structure => mot cl STRUCT SELECT STRUCT(nom: e.nom, ville: e.adresse.ville) FROM e IN LesEnseignants => BAG de valeurs complexes de type STRUCT(nom: STRIN_G, ville: STRING) ATTENTION : La cration explicite d'une nouvelle structure complexe (STRUCT...) est obligatoire (nom: e.nom, ville: e.adresse.ville) n'est pas d'un type connu d'OQL. Requte : pour chaque enseignant donner son nom et les noms de ses cours SELECT STRUCT( nom: e.nom, cours:(SELECT c.nomC FROM c IN e.cours_assurs)) FROM e IN LesEnseignants BAG de valeurs complexes de type STRUCT(nom: STRIN_G, cours: SET(STRING)) NB Ces structures comportant des multivalus seraient impossibles en relationnel 2. Manipulation d'objets et de valeurs structures Cration d'objets a- via la mthode associe chaque classe : le constructeur permet de crer des objets de type classe , le nom de cette mthode est celui de la classe . bda = Cours(nomC:'BDA' , cycle:2) 1) cre un objet permanent de format Cours 2) rend l'oid (dans la variable bda) 3) si une population existe (EXTENT...) y range l'objet (dans LesCours) b- Cration de valeurs structures d'un type existant dans le schma (TYPEDEF) a = Tadresse(rue:'chemin des oiseaux' , numro:'10A' , ville:'Morges' , NPA: 1033). c- Cration de valeurs structures d'un type nouveau via les constructeurs STRUCT, SET, LIST x = STRUCT(nomCours:'BDA' , nomprof:'C. Parent' , nomAssistant:'A. Osterwalder' , facult:'HEC' , tudiants: SET ('P. Rochat', 'A. Muller', 'N. Cullot', .)) Accs un attribut composant d'un STRUCT -Notation pointe : compos_monovalu . composant Phil.adresse.ville OK Phil.tudes n'est pas de type STRUCT, mais de type LIST, donc Phil.tudes.diplme N'EST PAS CORRECT Accs un composant d'un compos multivalu Solution gnrale : variable IN collection 1) variable IN compos_multivalu => la variable parcourt la collection 2) variable.composant Le (les) diplme que Phil a eu en 2000 SELECT x.diplme FROM x IN Phil.tudes WHERE x.anne = 2000 4. Parcours des liens de composition

OQL

SAOUDI Lalia

De l'objet compos l'objet composant : notation pointe (comme pour attribut complexe) Jointures trs faciles dans le sens du lien - Objet compos monovalu => notation pointe Nom du professeur du cours BD SELECT c.prof.nom FROM c IN LesCours WHERE c.nomC = 'BD' - Objet compos multivalu => variable Noms des tudiants inscrits au cours BD SELECT e.nom FROM c IN LesCours, e IN c.tudiants WHERE c.nomC = 'BD' c.tudiants.nom N'EST PAS CORRECT 5. Oprateurs sur les collections Le format gnral d'une requte Selectfrom...where est le suivant: Select [distinct] <dfinition-rsultat> from x in <collection1>, y in <collection2>, ... [ where <condition> ] ; o <dfinition-rsultat> est une expression qui, soit dsigne un objet ou une valeur existants, soit dfinit une nouvelle valeur structure avec son type. Cette requte dclare x, y comme variables locales la requte. Elle est quivalente la suite d'oprations: a- faire le produit cartsien des collections cites dans la clause "from". Si certaines de ces collections sont des listes ou des tableaux, elles sont auparavant transformes en ensembles; b- filtrer selon la condition de la clause "where"; c- pour chaque lment obtenu, construire un lment du rsultat selon le format dclar dans la clause "Select [distinct] <dfinition-rsultat>", c'est dire : - si <dfinition-rsultat> dsigne un objet ou une valeur, extraire l'oid ou la valeur, - si <dfinition-rsultat> dfinit une valeur structure via le constructeur STRUCT, construire cette valeur structure; d- si le mot cl "distinct" est prsent, supprimer les doubles du rsultat. Dans ce cas, le rsultat estun ensemble (SET), sinon c'est un multi-ensemble (BAG). Le rsultat d'une requte peut tre affect une variable de type ensemble ou multi-ensemble. Noms des cours suivis par Phil et Annie Muller (Annie et Phil doivent suivre tous les deux ces cours) SELECT c.nomC FROM c IN Phil.cours_suivis WHERE c IN ( SELECT x FROM e IN LesEtudiants, x IN e.cours_suivis WHERE e.nom='Muller' AND e.prnoms=LIST('Annie') ) 5.1 Quantificateur existentiel : L'expression: exists x in <collection> : <condition(x)> dclare une variable locale x sur la collection et a pour rsultat un boolen qui est vrai si et seulement si un lment au moins de la collection satisfait la condition. Exemple, trouver les enseignants qui donnent au moins un cours de 3me cycle. Select e from e in LesEnseignants where exists c in e.cours-assurs : c.cycle=3 ;

OQL

SAOUDI Lalia

5.2 Quantificateur universel : L'expression: for all x in <collection> : <condition(x)> dclare une variable locale x sur la collection et a pour rsultat un boolen qui est vrai si et seulement si tous les lments de la collection satisfont la condition. Exemple : trouver les enseignants qui ne donnent que des cours de 3me cycle (ainsi que ceux qui ne donnent aucun cours). Select e from e in LesEnseignants where for all c in e.cours-assurs : c.cycle=3 ; 5.3 Test d'appartenance une collection : L'expression: <lment> in <collection> a pour rsultat un boolen qui est vrai si et seulement si l'lment appartient la collection. Par exemple, la requte suivante retrouve les enseignants du cours "BDA". Select e from e in LesEnseignants, c in LesCours where c.nomC = "BDA" and c in e.cours-assurs ; 5.4 Fonctions d'agrgation : Les fonctions min, max, count, sum et avg, peuvent tre employes sur toute collection, comme par exemple: Count (Select e from e in LesEnseignants where e.statut="prof") ; qui compte le nombre total de professeurs. 5.5 Partitionnement d'une collection : La fonction "Group by" permet, de partitionner une collection en sous ensembles et de calculer des rsultats agrgs sur ces sous-ensembles. Ces sous-ensembles sont appels d'un nom prdfini "partition". L'instruction: Group x in <collection> by ( nom11: <expression11> , ... , nom1n: <expression1n> ) [ with ( nom21: <expression21> , ... , nom2p: <expression2p> ) ] ; o x est une variable locale l'instruction Group by, cre en rsultat un ensemble de valeurs structures du type: set ( struct ( nom11:domaine11,..., nom1n:domaine1n , nom21:domaine21,... nom2p:domaine2p)) o domaineij est le domaine de valeurs du rsultat de <expressionij>. Une telle instruction, applique une collection d'lments de type T est quivalente : - partitionner la collection selon la clause "by": un sous-ensemble est cr pour chaque valeur prise par <expression11>x... x <expression1n>. La collection est donc transforme en un ensemble du type: Set(struct(nom11: domaine11, ..., nom1n: domaine1n, partition: set(T))) o "partition" est le nom de l'attribut nouvellement cr qui contient l'ensemble des instances ayant mme valeur pour ( <expression11>x... x <expression1n> ); - pour chaque lment de cet ensemble, calculer la valeur des expressions <expression21>, ... , <expression2p> sur l'attribut ensembliste partition, et construire l'lment correspondant du rsultat. Par exemple, l'expression: Group c in LesCours by ( cycle : c.cycle ) with ( nbcours : count(partition) ) ; donne en rsultat un ensemble de couples (cycle:INT, nbcours:INT) qui dfinissent pour chaque cycle le nombre de cours de ce cycle. 5.6 Transformation d'une collection d'un lment en lment : Si une collection ne contient qu'un seul lment, la fonction "Element" rend en rponse l'lment.

OQL

SAOUDI Lalia

Cette fonction est utile quand on sait que le rsultat d'une requte "Select...." est un seul lment et qu'on veut le traiter en tant que tel, alors que du point de vue de la syntaxe ce rsultat est un ensemble. Element(<collection>) <lment> Attention, si la collection comporte plusieurs lments, l'instruction gnre une alerte ("exception") lors de l'excution. 5.7 Oprateurs ensemblistes : Les oprateurs des ensembles, union (appel "union"), diffrence (appel "except") et intersection (appel "intersect"), existent pour des collections de type ensemble ou multi-ensemble. Par exemple, la requte suivante recherche les tudiants qui ont obtenu le cours 'BD', mais pas le cours 'SI' : (select e from e in LesEtudiants, c in e.cours_obtenus where c.cours.nomC='BD') except (select e from e in LesEtudiants, c in e.cours_obtenus where c.cours.nomC='SI) ; 6. Mthodes Dans une requte, tout lment de type T peut tre remplac par une mthode fournissant un rsultat de type T. Par exemple, la requte suivante recherche les noms des cours qui ont plus de 120 inscrits (nb_inscrits() est une mthode de la classe Cours) : select c.nomC from c in LesCours where c.nb_inscrits()>120 ; nom et ge des tudiants SELECT STRUCT(nom: e.nom , ge: e.age()) FROM e IN LesEtudiants ;

Vous aimerez peut-être aussi