- Il y a une difficulté supplémentaire, la table MessageObj contient une table imbriquée contenant les réponses du message. On procède en deux temps.
- On commence par insérer les messages sans tenir compte des réponses stockées dans ReponseTas que l'on initialise à vide (...)
[...] Blin Christine Tardivel Sylvain M1 Miage TP BDAV : Objet-Relationnel 05/05/2005 Page 1 sur 5 I. Création de la base de données : On apporte quelques modifications aux tables données dans l'énoncé : On ajoute SalleRef (référence à SalleT) dans le type MessageT On ajoute la clé étrangère pkMessageObjSalleRef (correspondant à SalleRef) dans la table MessageObj. A. Définition des types CREATE OR REPLACE TYPE UtilisateurT AS OBJECT( idUtilisateur INTEGER, Nom VARCHAR2(16), Email VARCHAR2(32), DateInscription DATE, FINAL MEMBER FUNCTION NbActions RETURN INTEGER) / CREATE OR REPLACE TYPE SalleT AS OBJECT ( Theme VARCHAR2(32), ModerateurRef REF UtilisateurT, FINAL MEMBER FUNCTION NbThreads RETURN INTEGER) / CREATE OR REPLACE TYPE MessageT / CREATE OR REPLACE TYPE ReponseT AS OBJECT ( ReponseRef REF MessageT) / CREATE TYPE ReponseTasT AS TABLE OF ReponseT / CREATE OR REPLACE TYPE MessageT AS OBJECT ( IdMessage INTEGER, SalleRef REF SalleT, AuteurRef REF UtilisateurT, DateEnvoi DATE, ReponseTas ReponseTasT, Titre VARCHAR2(32), Corps VARCHAR(512), Etat VARCHAR2(6) ) NOT FINAL / B. [...]
[...] Insérer dans la structure obtenue les données de votre TP de PL-SQL A. Insertion des Utilisateurs Il n'y a aucune difficulté puisque la table UtilisateurObj ne contient aucune référence à une autre table. INSERT INTO UtilisateurObj (SELECT id_utilisateur, nom, mail, inscription FROM utilisateur); B. Insertion des Salles Ici nous avons le modérateur de la salle qui est une référence à un utilisateur. Il faut donc passer la référence à l'utilisateur et non l'utilisateur dans la table. [...]
[...] INSERT INTO SalleObj (SELECT theme, REF(U) FROM salle, UtilisateurObj U WHERE U.IdUtilisateur=id_moderateur C. Insertion des Messages Il ya une difficulté supplémentaire, la table MessageObj contient une table imbriquée contenant les réponses du message. On procède en deux temps. On commence par insérer les messages sans tenir compte des réponses stockées dans ReponseTas que l'on initialise à vide. On insère les message avec la table des réponses (ReponseTasT) vide INSERT INTO MessageObj (idMessage,AuteurRef,SalleRef,DateEnvoi,ReponseTas,Titre,Corps,Etat) SELECT id_message,REF(U),REF(S),date_envoi,ReponseTasT(),NULL,corps,etat FROM message M ,salle Sa, UtilisateurObj SalleObj S WHERE U.IdUtilisateur=id_auteur AND M.id_salle=Sa.id_salle AND Sa.theme=S.theme ; Page 3 sur 5 On peut maintenant mettre à jour la table MessageObj afin de remplir la table ReponseTas avec toutes les réponses des messages. [...]
[...] Nous proposerons deux versions afin de traiter ce sujet. 2ème version (celle que l'on a retenu) : On utilise table DECLARE id NUMBER; --identifiant du message curseur qui parcourt les messages de la base. CURSOR curs_messages IS SELECT id_message FROM message; BEGIN --ouverture du curseur OPEN curs_messages; LOOP --parcourt du curseur et arrêt quand il n'y a plus de données FETCH curs_messages INTO id; EXIT WHEN curs_messages%NOTFOUND; --insertion des réponses du message dans sa table ReponseTas INSERT INTO TABLE (SELECT ReponseTas FROM MessageObj WHERE IdMessage = id) SELECT REF(M) FROM MessageObj message WHERE M.IdMessage = id_message AND id_parent = id; END LOOP; CLOSE curs_messages; --fermeture du curseur END; / show errors; 1ère version : on utilise multiset afin de faire un cast sur les réponses qui sont stockées dans une variable de type ReponseTasT. [...]
[...] CURSOR curs_fils IS SELECT id_message FROM message; BEGIN on ouvre le curseur OPEN curs_fils; FETCH curs_fils INTO id_fils; WHILE curs_fils%found LOOP select id_parent into id_pere from message where id_message=id_fils; if id_pere is Not Null then recupere les reponses dans la variable temp de type ReponseTasT select cast(multiset(select ref(a) from messageObj a where a.idMessage=id_fils) as ReponseTasT) into temp from dual; met à jour ReponseTas dans la table MessageObj update messageObj set ReponseTas=temp where idMessage=id_pere; end if; FETCH curs_fils INTO id_fils; END LOOP; on ferme le curseur CLOSE curs_fils; Page 4 sur 5 END; / show errors; On donne un titre aux messages (il n'y en avait pas avec la précédente base) et cela sera nécessaire dans la suite de l'énoncé. UPDATE MessageObj SET titre=substr(corps,1,10); III. [...]
Source aux normes APA
Pour votre bibliographieLecture en ligne
avec notre liseuse dédiée !Contenu vérifié
par notre comité de lecture