ift-3202tp3 version bonifiée

36
Page 1 © A. Gamache Version de ZOP du lundi, 6 mars 2017 Avionnerie ZOP Quelques informations générales sur les activités industrielles de ZOP et sur son financement L’avionnerie ZOP est une grande société à capital-actions qui construit différents genres d’avions destinés à des marchés spécialisés. Son capital boursier est important; un administrateur (ou directeur) choisi parmi les actionnaires de ZOP doit posséder au moins 10% actions que possèdent l’ensemble des autres administrateurs. Les autres actionnaires se partagent le reste des actions sans pour autant être administrateur. Ils sont les financiers de ZOP. Le CA est renouvelé à chaque année. Le financement de ZOP s’appuie essentiellement sur son capital boursier. Les membres du conseil d’administration sont au nombre de 3, élus parmi les actionnaires. Il peut y avoir temporairement moins que 3 suite à la vente par un actionnaire de ses actions. Lorsqu’un administrateur n’est plus éligible, il se retire du CA. Un actionnaire négocie ses prêts avec un nombre limité et prédéterminé de banques d’affaires. En sus des administrateurs (directeurs), il y a un PDG choisi obligatoirement parmi les actionnaires qui ne peut agir comme administrateur. Il n’a pas le droit de vote sauf en cas d’égalité. Le siège-social de ZOP gère les usines spécialisées de l’avionnerie, chacune pouvant construire un seul modèle d’avion parmi les suivants: passagers (AP), avion cargo (AC), avion citerne (ACI) et avion épandeur (AEP). La complexité et la rentabilité de la construction des avions nécessitent souvent de faire appel à la sous-traitance spécialisée située dans la même ville que celle de l’usine de ZOP qui offre un contrat de sous-traitance. Les avions construits par ZOP sont destinés au marché du transport du cargo ou des passagers. Les avions cargos peuvent être aménagés pour le transport des liquides ou l’épandage des fertilisants sous la forme liquide ou solide. Pour le transport des passagers, l’avion doit détenir un certificat de vol valide pour 36 mois et renouvelable à terme, à tous les trois ans. Pour ce faire, il ne faut pas que le dernier certificat de vol ait été l’objet d’une restriction sur la durée c’est-à-dire avoir une durée de moins de 36 mois pour qu’il soit renouvelé. Sinon, une procédure spéciale de certification est déclenchée. En cas de non renouvellement, toute modification au certificat de vol est interdite. Toutes les actions sur la base sont effectuées au moyen des méthodes dont les signatures composent l’interface de chaque classe. Aucune désencapsulation pour avoir accès directement aux données des objets n’est permise.

Upload: others

Post on 01-May-2022

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: IFT-3202TP3 version bonifiée

Page 1

© A. Gamache Version de ZOP du lundi, 6 mars 2017

Avionnerie ZOP

Quelques informations générales sur les activités industrielles de ZOP et sur son financement

L’avionnerie ZOP est une grande société à capital-actions qui construit différents genres d’avions destinés à des marchés spécialisés. Son capital boursier est important; un administrateur (ou directeur) choisi parmi les actionnaires de ZOP doit posséder au moins 10% actions que possèdent l’ensemble des autres administrateurs. Les autres actionnaires se partagent le reste des actions sans pour autant être administrateur. Ils sont les financiers de ZOP. Le CA est renouvelé à chaque année. Le financement de ZOP s’appuie essentiellement sur son capital boursier. Les membres du conseil d’administration sont au nombre de 3, élus parmi les actionnaires. Il peut y avoir temporairement moins que 3 suite à la vente par un actionnaire de ses actions. Lorsqu’un administrateur n’est plus éligible, il se retire du CA. Un actionnaire négocie ses prêts avec un nombre limité et prédéterminé de banques d’affaires. En sus des administrateurs (directeurs), il y a un PDG choisi obligatoirement parmi les actionnaires qui ne peut agir comme administrateur. Il n’a pas le droit de vote sauf en cas d’égalité.

Le siège-social de ZOP gère les usines spécialisées de l’avionnerie, chacune pouvant construire un seul modèle d’avion parmi les suivants: passagers (AP), avion cargo (AC), avion citerne (ACI) et avion épandeur (AEP). La complexité et la rentabilité de la construction des avions nécessitent souvent de faire appel à la sous-traitance spécialisée située dans la même ville que celle de l’usine de ZOP qui offre un contrat de sous-traitance.

Les avions construits par ZOP sont destinés au marché du transport du cargo ou des passagers. Les avions cargos peuvent être aménagés pour le transport des liquides ou l’épandage des fertilisants sous la forme liquide ou solide. Pour le transport des passagers, l’avion doit détenir un certificat de vol valide pour 36 mois et renouvelable à terme, à tous les trois ans. Pour ce faire, il ne faut pas que le dernier certificat de vol ait été l’objet d’une restriction sur la durée c’est-à-dire avoir une durée de moins de 36 mois pour qu’il soit renouvelé. Sinon, une procédure spéciale de certification est déclenchée. En cas de non renouvellement, toute modification au certificat de vol est interdite.

Toutes les actions sur la base sont effectuées au moyen des méthodes dont les signatures composent l’interface de chaque classe. Aucune désencapsulation pour avoir accès directement aux données des objets n’est permise.

Page 2: IFT-3202TP3 version bonifiée

Page 2

© A. Gamache Version de ZOP du lundi, 6 mars 2017

Modèle UML de l’avionnerie ZOP

noSS* : number(3,0) villeSS : varchar (40) [pdg: varchar(40) ]

SiegeSoc:

noAct* : number(3,0) nasAc t: char(9) nbAction : integer

Actionnaire:

Inter1 Inter2

0..*

1..*

noBqe*: integer dirBqe : varchar(40)

BqeAFF :

Inter5

FinancePar

Trsansige >

1..4

1..1

1..n

1..1

0..*

Gere

noAv* varchar(4) modelAv : char(3) sortMotAv: char(2)

<<Avion >>

ConstrAv

1..11

<

<

<

<

Usine :

nbPas : int nbClasse : int

AvionPass: poidsC: int nbPorteC : int

AvionCargo:

(c,d)

(i,d)

Usine :

noUs* : char(2) villeUs: varchar(40) nbEmpl : int

Usine :

Inter3

Inter4

Inter7

Inter8

noEntr* : int villeST : varchar(40) lesSpec : [int,int,int]

SousTraitant

Inter6

Administre

contenu : char(1) volMax : int

AvionCiterne

Contracte : dateC :Date

nbBuses : int

AvionEpandeur (i,d)

1..3 0..1

0..n

Inter10

Inter9

noC*: int dateCertif : Date duree : int

CertifVol:

Inter11

1..*

1..1

1..1

DirigePar > 0..1 1..1

Page 3: IFT-3202TP3 version bonifiée

Page 3

© A. Gamache Version de ZOP du lundi, 6 mars 2017

Voici quelques signatures pour les interfaces du modèle UML:

Inter1 : creerSS( ) méthode STATIC pour la création d’un siège social dont le pdg a été nommé par le groupe d’actionnaires fondateurs. RempPdg méthode Member pour remplacer le pdg par un autre administrateur éligible. Inter2 : ajoutAct( ) méthode STATIC pour l’ajout d’un actionnaire ayant obtenu un prêt avec une banque agrée. SuppAct () méthode MEMBER pour la suppression d’un actionnaire qui est aussi administrateur au CA et transigeant avec une banques d’affaires agrée. modifNbAct() méthode MEMBER pour la modification du nombre d’actions détenues par un actionnaire. Valider dans le cas d’un actionnaire administrateur si la contrainte imposée aux actionnaires en ce qui concerne le pourcentage d’actions à détenir. ajoutDir() : méthode MEMBER pour ajouter un administrateur au CA choisi parmi les actionnaires qui détiennent plus de 10% des actions émises par ZOP. RemplAdmin(remplace un administrateur membre du CA par un autre actionnaire éligible. Inter3 : majUs( ) méthode MEMBER pour modifier le nombre d’employés dans une usine. creationUs ( ) : méthode STATIC pour créer une usine gérée par le siège social et qui construit des avions d’un seul modèle. ajoutST( ) Méthode MEMBER pour ajouter un nouveau sous-traitant à une usine en date d’aujourd’hui. Inter4 : creerAvionP ( ) méthode MEMBER pour créer un modèle d’avion de passagers construit entièrement par une usine.

Inter5 : creerBqe () méthode STATIC pour ajouter une nouvelle banque ne faisant pas encore affaire avec des actionnaires de ZOP. CompterCl() méthode MEMBER pour compter le nombre de clients de la banque qui sont actionnaires de ZOP. TransigeAc méthode Member pour créer une association entre un actionnaire et une banque d’affaires. Inter6 : créer un sous-traitant avec 3 spécialités et qui a déjà sous-contracté avec une usine existante. specST : Affichez les spécialités d’un sous-traitant. Inter7 : creerAP( ) un nouvel avion de passagers certifié. suppAP () méthode MEMBER pour supprimer un avion de passager et ses certificats de vol. Inter8 :

Page 4: IFT-3202TP3 version bonifiée

Page 4

© A. Gamache Version de ZOP du lundi, 6 mars 2017

suppAC() méthode pour supprimer un avion-cargo.

Inter9 : modMax() méthode MEMBER pour modifier la capacité d’un avion citerne. Inter10 : ajoutAE () méthode MEMBER pour ajouter un avion épandeur. Inter11 : modifDureeCert () méthode MEMBER pour modifier la durée du certificat de vol d’un avion de passagers pour une durée différente en deçà de la valeur régulière de 36 mois. RenouvCert() méthode MEMBER pour renouveler le certificat (ajout de 36 mois) Toute méthode doit valider toutes les contraintes définies sur les données qu’elle affecte.

Remarque : Les interfaces du modèles sont volontairement incomplètes. Elles sont présumées renforcer les contraintes définies dans le modèle. Les contraintes de domaine et de syntaxe sont définies pour les attributs.

Aattribut Domaine syntaxique Classe UML Sémantique et/ou domaine Contenu Char(1) AvionCiterne [A,B,C] dateC Date Contracte Date du contrat dateCertif Date CertifVol Date de la certification dirBqe Varchar(40) BqeAff Nom du directeur de la banque Duree int CertifVol Durée en mois [1..36] modeleAV Char(3) Avion ‘Mxx’ ex. : M25 nasAct Char(9) Actionnaire Nas à 9 caractères nbAction integer Actionnaire Nb d’actions détenues nbBuses int AvionEpandeur Nb de buses d’épandage nbClasse int AvionPass Nb de classes de passagers

[1..3] nbEmpl int Usine [10…100] nbPas int AvionPass Nb de passagers [1…450] nbPorteC int AvionCargo Nb de portes de déchargement [1…5] noAct Number(3,0) Actionnaire [1-100] noAv varchar(4) Avion Chaìne de 1 à 4 caractères noBqe int BqeAFF [400, …,900] noC int CertifVol [100…2500] noEntr int SousTraitant [1,…20] noSS Number(3,0) SiegeSoc Id du siège social noUs Char(2) Usine [u1..u9] Pdg varchar(40) SiegeSoc Nom du pdg poidsC int AvionCargo Poids max du cargo sortMotAv char(2) Avion [‘pw’, ‘ja’, ‘ge’] Spec int SousTraitant [1,2,3,9]

Page 5: IFT-3202TP3 version bonifiée

Page 5

© A. Gamache Version de ZOP du lundi, 6 mars 2017

villeSS Varchar(40) SiegeSoc Chaîne de caractères villeST Varchar(40) SousTraitant Chaîne de caractères VilleUs Varchar(40) Usine Chaîne de caractères volMax int AvionCiterne Volume du bac à liquide

Les objets à charger dans la base initiale (voir le modèle navigationnel fourni)

** Les constantes ne sont pas données typées; leur type est sous-entendu en accord avec celui exprimé dans le modèle UML.

SiegeSocial : [100, Québec, Paul-André, {oidUs1, oidUs2}, { oidAct1, oidAct2, oidAct3}, { oidAct1, oidAct2, oidAct3, oidAct4, oidAct5}, oidAct4 ] Usine : [u1, Québec, 50, oidAv1] [u2, Montréal, 100, oidAv2]

[u3, Québec, 100, oidAv3]

[u4, Montréal, 100, oidAv4]

[u5, Montréal, 100, oidAv5]

[u6, Montréal, 100, oidAv6]

Actionnaire : [1, 100600700, 5000, {oidBqe500, oidBqe700, oidBqe800}] [2, 200620720, 2000, {oidBqe500, oidBqe900}] [3, 300630730, 1000, {oidBqe700}] [4, 400530590, 4000, {oidBqe600}] [5, 500680530, 4000, {oidBqe700}] Banque d’Affaires : [500, Vachon, { oidAct1, oidAct2} ] [700, Pouliot, { oidAct1, oidAct3, oidAct5} ] [600, Vandry, { oidAct4] [800, Dion, {oidAct1 } ] [900, Baudry, {oidAct2 }] [400, Danois, { } ]

Contracte : [10-06-2012, oidu1, oidst9] [21-09-2012, oidu2, oidst8]

[28-01-2013, oidu5, oidst7]

Page 6: IFT-3202TP3 version bonifiée

Page 6

© A. Gamache Version de ZOP du lundi, 6 mars 2017

SousTraitant : [9, Québec, [1, 2, null ]] [8,Montréal, [1, 2, 3]] [7, Montréal, [1, null, null]] Les divers types d’avion fabriqués par les différentes usines de ZOP sont représentés dans la base de manière à permettre les parcours les plus rapides de la base. Cette exigence contraint la façon de stocker les objets.

Avion de type passager : [Av1, m3, pw, 200,2, [450, 2012, 36]] [Av4, m9, ja, 250,2, [140, 2013, 24]]

Avion de type cargo Cargo : [Av2, m8, ge, 50, 4] Avion de type Citerne: [Av3, m12, ge, 50, 2, C, 2000] Avion de type Epandeur : [Av5, m56, ge, 55, 2, A, 1800, 10] [Av6, m8, ge, 75, 2, B, 4000, 15]

Lecture des données et des références:

*Convention pour représenter les liens de référence :

oidUs1 est une référence de type oid sur l’objet usine no u1

oidAct4 représente l’oid de l’actionnaire dont le numéro d’actionnaire est 4

oidAv5 représente l’oid de l’avion épandeur dont le numéro est 5

Av5 est l’avion dont le numéro est 5.

Page 7: IFT-3202TP3 version bonifiée

Page 7

© A. Gamache Version de ZOP du lundi, 6 mars 2017

Rapport

Le rapport No1 est fait sur papier et déposé dans le casier à mon nom en face de l’ascenseur du 3e étage du pavillon Pouliot. Chaque rapport doit aussi être signé par chaque membre de l’équipe soulignant qu’il a participé activement à l’élaboration de la solution. Les autres rapports seront transmis par voie électronique.

Localisation de la boîte de remise des TP

Pour les étudiants(es) de l’extérieur de la grande région de Québec qui suivent le cours comme étudiant inscrit à distance, vous pouvez transmettre votre rapport (broché) à mon attention au secrétariat du département IFT-GLO. Gardez toujours une copie pour parer à toute perte dans l’acheminement du courrier.

A. Gamache (Travail pratique Cours ift-3208) département IFT-GLO, faculté des Sciences et de Génie, Université Laval, Québec, Qc G1K 7P4

Travail en équipe

Les TP sont réalisés en équipe de 2. Les équipes seront réputées formées définitivement pour tout le cours avec les noms inscrits sur le rapport du tp1 et signé par chaque membre de l’équipe.

Boîte de remise des TP : casier à mon nom

Bureau du directeur et secrétariat : Pouliot 3e étage porte 3907

Couloir du 3e étage du Pouliot

Direction Sud

Ascenseur no :

Secrétariat IFTGLO

Page 8: IFT-3202TP3 version bonifiée

Page 8

© A. Gamache Version de ZOP du lundi, 6 mars 2017

Une exception est possible, par exemple pour ceux et celles de l’extérieur de la région de Québec inscrites au cours à distance et qui ne viennent pas sur le campus. Dans ce cas, une personne peut travailler seule.

Travaux pratiques

TP-1 Échéance : 6 octobre

1.1- Énoncez cinq contraintes à renforcer lors d’une action sur la base de données. Ces contraintes sont différentes de celles ayant trait spécifiquement au type et au domaine sémantique des données.

1.2-Transformez cette partie du modèle ML en un modèle navigationnel. Ne traitez pas les interfaces.

1.3- Combien de genres d’avions peut-il y avoir dans la base?

1.4- Est-il possible de créer une table-objet Avion pour y loger tous les genres d’avion construits par les usines de ZOP. Expliquez brièvement votre réponse.

noSS* : number(3,0) villeSS : varchar (40) pdg: varchar(40)

Inter1

1..* FinancePar

Trsansige >

1..1

1..1

0..*

Gere

noAv* varchar(4) modelAv : char(3) sortMotAv: char(2)

<<Avion >>

ConstrAv

1..11

<

<

<

<

Inter4

Administre

1..1

DirigePar > 0..1 1..1

noAct* : number(3,0) nasAc t: char(9) nbAction : integer

Actionnaire:

Inter2

0..*

Gere

1..3

Usine :

noUs* : char(2) villeUs: varchar(40) nbEmpl : int

Usine :

Inter3

noBqe*: integer dirBqe : varchar(40)

BqeAFF :

Inter5

0..*

1..4

Page 9: IFT-3202TP3 version bonifiée

Page 9

© A. Gamache Version de ZOP du lundi, 6 mars 2017

1.5- Quel est le maximum de containeurs-objets (table-objet) est-il possible d’avoir pour y loger des avions? Quel est le minimum de tables-objets?

1.6- Expliquez les avantages d’avoir une association pour représenter le pdg.

1.7- Quel serait l’effet sur la base d’avoir une couverture (c,d) pour la dernière spécialisation qui est incidente à la classe navigationnelle AvionEpandeur.

1.8- Quelle serait l’utilité d’ajouter les deux clés primaires à la classe d’association Contracte?

1.9- Formulez la clause SQL pour afficher les sous-traitants de l’usine u2?

1.10- L’attribut refAV de la classe Usine peut-il référer à un avion peu importe sa description? Expliquez brièvement votre réponse.

1.11- Si la spécialisation de Avion devenait (i,d), que faut-il modifier dans le modèle navigationnel ?

1.12 Que faut-il ajouter au modèle UML pour pouvoir enlever un lien multiple externe dirigé vers la classe externe Actionnaire sans faire appel à un oid?

1.13 Si dans le modèle UML d’origine, l’agrégation forte était plutôt une agrégation faible, quelles modifications faudrait-il apporter au modèle navigationnel initial?

1.14 Modifiez le Mnav initial pour supprimer le varray utilisé dans la classe externe SousTraitant.

1.15 Comment faut-il représenter les infos sur le pdg si l’on veut éviter de créer une association.

***

Page 10: IFT-3202TP3 version bonifiée

Page 10

© A. Gamache Version de ZOP du lundi, 6 mars 2017

Le modèle navigationnel ci-dessous est à utiliser obligatoirement pour le projet

noAct*:number(3) nasAc t: char(9) nbAction : integer lesBqes

Actionnaire:

Inter2

noBqe* : integer dirBqe : varchar(40) lesCliAct

BqeAFF :

Inter5

noAv* varchar(4) modelAv : char(3) sortMotAv : char(2)

<<Avion >>

AvionPass:

poidsC: int nbPorteC : int

AvionCargo:

(c,d)

(i,d)

Usine :

noUs* : char(2) villeUs : varchar(40) nbEmpl : int refAv

Usine :

Inter3

Inter4

Inter7

Inter8

noEntr* : int villeST : varchar(40) Spec :

SousTraitant

Inter6

contenu : char(1) volMax : int

AvionCiterne

nbBuses : int

avionEpandeur

(i,d)

Contracte : dateC :Date refUs refSt

Inter10

Inter9

noSS* : number(3,0) villeSS : varchar (40) pdg: varchar(40) lesUs lesDir lesFin refPdg

SiegeSoc:

Inter1

noC*: int annee : Date duree : int

Inter11

certifVol:

nbPas : int nbClasse : int lesCV

noC *: int dateCertif : Date duree : int

:

CertifVol

Page 11: IFT-3202TP3 version bonifiée

Page 11

© A. Gamache Version de ZOP du lundi, 6 mars 2017

Quelques contraintes du modèle (autres que celles découlant de la multiplicité)

1- Le maximum d’administrateurs ou directeurs est 3 2- Lors de sa nomination, un PDG est obligatoirement un actionnaire éligible. 3- Un administrateur (directeur) est choisi parmi les actionnaires mais doit avoir 10%

d’actions au regard du nombre total d’actions possédées par l’ensemble des actionnaires. Cette contrainte reste en vigueur peu importe les ventes ou les achats d’actions effectués par la suite par les administrateurs. Un administrateur qui ne vérifie pas cette contrainte quitte le CA ou ne peut y être nommé.

4- Un avion de passagers dont le dernier certificat de vol est moins de 36 mois ne peut pas avoir une nouvelle certification sans être l’objet d’une vérification complète. S’il passe le test, la durée est mise à jour pour 36 mois.

5- Un sous-traitant doit-être dans la même ville que l’usine qui accorde la sous-traitance. 6- Aucun avion qui n’est pas du genre passager ou cargo ne peut être représenté dans la

base. 7- Le pdg est obligatoirement un actionnaire. Il ne peut pas être à la fois un administrateur

et le pdg.

TP2

Échéance : 11 novembre 2013

2a- Formulez le schéma du modèle navigationnel commun ci-joint et procédez à l’implantation de la base-objet Oracle. Utilisez que les types publiés dans le Mnav ci-joint. Les interfaces ne sont pas à définir. Aucun trigger n’est à développer.

2b- Créez les tables-objets de cette base avec les contraintes qui peuvent être formulées par le DDL.

2c- Chargez la base qu’avec les objets fournis et cela avec l’application SQLPlus

2d- Développez une procédure PL/SQL anonyme pour afficher les certificats de vol des avions de passagers représentés dans la base i.e. les noAv, noC et la durée. Démontrez qu’elle fournit la réponse attendue avec la base d’objets d’essai.

2e- Avec une procédure PL/SQL anonyme, modifiez le pdg actuel pour le remplacer par l’actionnaire oidAct5.

2f- Développez une procédure PL/SQL laquelle sera appelée dans un bloc PL/SQL anonyme exécuté par SQLPlus pour modifier la spécialité des sous-traitants et remplacer la spécialité no 1 par celle de 9, la nouvelle spécialité.

Page 12: IFT-3202TP3 version bonifiée

Page 12

© A. Gamache Version de ZOP du lundi, 6 mars 2017

Schéma de ZOP (2013)

Version avec un containeur pour chaque type d’avion

Création des types :

Create or replace type actionnaire_t / Create or replace type avion_t / Create or replace type usine_t / Create or replace type Avion_t as object (noAV varchar(4), modelAv char(3), sortMotAv char(2)) not instantiable not final / Create or replace type certifVol_t as object (noC int, dateCertif Date, duree int) / Create or replace type lesCV_t as table of certifVol_t / Create or replace type AvionPass_t under Avion_t (nbPas int, nbClasse int, lesCV lesCV_t) instantiable not final / Create or replace type AvionCargo_t under avion_t (poidsC int, nbPortec int) not final instantiable / Create or replace type AvionCiterne_t under avionCargo_t (contenu char(1), volMax int) not final instantiable / Create or replace type avionEpandeur_t under avionCiterne_t ( nbBuses int) final instantiable / Create or replace type usine_t as object(noUs char(2), villeUs varchar(40), nbEmpl int, refAv REF avion_t) / Create or replace type Spec_t as varray (3) of integer / Create or replace type sousTraitant_t as Object (noEntr int, ville varchar(40), Spec Spec_t) / Create or replace type contracte_t as object (dateC Date, refUs REF usine_t, refST REF soustraitant_t) / Create or replace type lesUs_t as table of REF usine_t / Create or replace type lesDir_t as table of REF actionnaire_t / Create or replace type lesFin_t as table of REF actionnaire_t /

Page 13: IFT-3202TP3 version bonifiée

Page 13

© A. Gamache Version de ZOP du lundi, 6 mars 2017

Create or replace type siegeSoc_t as object (noSS number(3,0), villeSS varchar(40), pdg varchar(40), lesUs lesUs_t, lesDir lesDir_t, lesFin lesFin_t, refPdg REF actionnaire_t) / Create or replace type lesCliAct_t as table of REF actionnaire_t / Create or replace type BqeAFF_t as object (noBqe integer, dirBqe varchar(40), lesCliAct lesCliAct_t) / Create or replace type lesBqes_t as table of REF BqeAff_t / Create or replace type actionnaire_t as object(noAct int, nasAc char(9), nbAction int, lesBqes lesBqes_t) / Réinitialisation de la base Suppression des types (vérification de la suppression de tous les types) sans égard à leur dépendance. Vérification plus simple par la suite avec SQLDevelopper. Drop type avion_t force; Drop type avionPass_t force; Drop type avionCargo_t force; Drop type avionCiterne_t force; Drop type avionEpandeur_t force; Drop type sousTraitant_t force; Drop type contracte_t force; Drop type usine_t force ; Drop type siegeSoc_t force; Drop type actionnaire_t force; Drop type bqeAff_t force; Drop type lesDir_t force; Drop type lesFin_t Force; Drop type lesUs_t force; Drop type lesCV_t force; Drop type lesCliAct_t force; Drop type lesBqes_t force; Drop type refPdg_t Force; Drop type spec_t Force; Drop type certifVol_t Force; /* 2b Créez les tables-objets de cette base avec les contraintes qui peuvent être formulées par le DDL. */

CREATE TABLE Avion OF avion_t ( constraint pk_avion primary key(noAv), constraint c1_modelAv check ( length(modelAV) = 3 ), constraint c2_modelAv_nonNull check (modelAV IS NOT NULL),

Page 14: IFT-3202TP3 version bonifiée

Page 14

© A. Gamache Version de ZOP du lundi, 6 mars 2017

constraint c3_modelAv_valide check (upper(modelAv) LIKE 'M%'), constraint c4_sortMotAv check ( sortMotAv IS NOT NULL) ); / /* Création de la table AvionCargo et réplication des contraintes*/ /* Aucune contrainte concernant le poid dans l'énoncé*/ CREATE TABLE AvionCargo OF avionCargo_t ( constraint pk_avionCargo primary key(noAv), constraint c1_nbPorteAC check (nbPorteAC BETWEEN 1 AND 5), constraint c2_modelAvC check ( length(modelAV) = 3 ), constraint c3_modelAvC_nonNull check (modelAV IS NOT NULL), constraint c4_modelAvC_valide check (upper(modelAv) LIKE 'M%'), constraint c5_sortMotAvC check ( sortMotAv IS NOT NULL), constraint c6_sortMotAvC_valide check (sortMotAv IN ('pw','ja','ge')) ); / CREATE TABLE AvionCiterne OF avionCiterne_t ( constraint pk_avionCiterne primary key(noAv), constraint c1_nbPorteACiterne check (nbPorteAC BETWEEN 1 AND 5), constraint c2_modelAvCiterne check ( length(modelAV) = 3 ), constraint c3_modelAvCiterne_nonNull check (modelAV IS NOT NULL), constraint c4_modelAvCiterne_valide check (upper(modelAv) LIKE 'M%'), constraint c5_sortMotAvCiterne check ( sortMotAv IS NOT NULL), constraint c6_sortMotAvCiterne_valide check (sortMotAv IN ('pw','ja','ge')), constraint c7_contenu_valide check (sortMotAv IN ('A','B','C')) ); / CREATE TABLE AvionEpandeur OF avionEpandeur_t ( constraint pk_avionEpandeur primary key(noAv), constraint c1_nbPorteAEpandeur check (nbPorteAC BETWEEN 1 AND 5), constraint c2_modelAvEpandeur check ( length(modelAV) = 3 ), constraint c3_modelAvEpandeur_nonNull check (modelAV IS NOT NULL), constraint c4_modelAvEpandeur_valide check (upper(modelAv) LIKE 'M%'), constraint c5_sortMotAvEpandeur check ( sortMotAv IS NOT NULL), constraint c6_sortMotAvEpandeur_valide check (sortMotAv IN ('pw','ja','ge')), constraint c7_contenuAvEpandeur_valide check (sortMotAv IN ('A','B','C')) ); /

Page 15: IFT-3202TP3 version bonifiée

Page 15

© A. Gamache Version de ZOP du lundi, 6 mars 2017

CREATE TABLE AvionPass OF avionPass_t ( constraint pk_avionPass primary key(noAv), constraint c2_modelAvPass check ( length(modelAV) = 3 ), constraint c3_modelAvPass_nonNull check (modelAV IS NOT NULL), constraint c4_modelAvPass check (upper(modelAv) LIKE 'M%'), constraint c5_nbPas check (nbPas BETWEEN 1 AND 450), constraint c6_nbClasse check (nbClasse BETWEEN 1 AND 3) ) NESTED TABLE lesCV STORE AS Table_lesCertifVol ; / ALTER TABLE Table_lesCertifVol ADD ( constraint pk_noC primary key(noC), constraint c1_noC check(noC BETWEEN 100 and 2500), constraint c2_dateCertif check (dateCertif is not null), constraint c3_duree check (duree BETWEEN 1 AND 12)); / /* Contrainte sur spec à définir dans une méthode. */ CREATE TABLE SousTraitant OF sousTraitant_t( constraint pk_noEntr primary key(noEntr), constraint c1_noEntr check (noEntr BETWEEN 1 and 20), constraint c2_villeST_nonNull check ( villeST IS NOT NULL)); / CREATE TABLE Usine of usine_t ( constraint pk_noUS primary key(noUs), constraint c1_villeUs check (villeUs IS NOT NULL), constraint c2_nbEmpl check (nbEmpl BETWEEN 10 and 100), constraint c3_refAv_nonNull check (refAv IS NOT NULL), constraint c4_refAv_ref refAv REFERENCES AVION); / CREATE TABLE Contracte2 of contracte_t( constraint c12_dateC_nonNull check (dateC IS NOT NULL), constraint c22_refUS_nonNull check (refUs IS NOT NULL), constraint c32_refSt_nonNull check (refSt IS NOT NULL), constraint c42_refUs_ref refUs REFERENCES Usine, constraint c52_refSt_ref refSt REFERENCES SousTraitant); / CREATE TABLE BqeAFF OF BqeAFF_t ( constraint pk_noBqe primary key(noBqe), constraint c1_noBqe check (noBqe BETWEEN 400 AND 900), constraint c2_dirBqe_nonNull check(dirBqe IS NOT NULL)) NESTED TABLE lesCliAct STORE AS Table_lesCliAct ; /

Page 16: IFT-3202TP3 version bonifiée

Page 16

© A. Gamache Version de ZOP du lundi, 6 mars 2017

CREATE TABLE Actionnaire OF actionnaire_t ( constraint pk_noAct primary key(noAct), constraint c1_noAct check (noAct BETWEEN 1 and 100), constraint c2_nas check (nasAct IS NOT NULL), constraint c3_nbAction check (nbAction IS NOT NULL), constraint c4_lesBqes_nonNull check ( lesBqes IS NOT NULL)) NESTED TABLE lesBqes STORE AS Table_lesBqes; / CREATE TABLE SiegeSoc2 of siegeSoc_t ( constraint pk2_noSS primary key(noSS), constraint c12_ville_nonNull check (villeSS IS NOT NULL), constraint c22_pdg_nonNull check (pdg IS NOT NULL), constraint c32_refLesDir_nonNull check (lesDir IS NOT NULL), constraint c42_refLesFin_nonNull check (lesFin IS NOT NULL), constraint c52_refPdg refPdg REFERENCES Actionnaire) NESTED TABLE lesUs STORE AS Table_lesUs2 NESTED TABLE lesDir STORE AS Table_lesDir2 NESTED TABLE lesFin STORE AS Table_lesFin2; /Pour supprimer toute la base de données: Drop table Usine ; Drop table Contracte ; Drop table SousTraitant ; Drop table Actionnaire; Drop table Avion ; Drop table AvionPass ; Drop table AvionCargo ; Drop table AvionCiterne; Drop table AvionEpandeur ; Drop table BqeAFF; Drop table SiegeSoc ;

2c- Chargez la base qu’avec les objets fournis et cela avec l’application SQLPlus

/* Création des usines: */

Insert into Usine values (usine_t(‘u1’, ‘Québec’, 50, (select ref(ap) from AvionPass ap where ap.noAv = ‘Av1’)));

Insert into Usine values (usine_t(‘u2’, ‘Montréal’, 100, (select ref(ap) from AvionPass ap where ap.noAv = ‘Av2’)));

Insert into Usine values (usine_t(‘u3’, ‘Québec’, 100, (select ref(ap) from AvionPass ap where ap.noAv = ‘Av3’)));

Page 17: IFT-3202TP3 version bonifiée

Page 17

© A. Gamache Version de ZOP du lundi, 6 mars 2017

Insert into Usine values (usine_t(‘u4’, ‘Montréal’, 100, (select ref(ap) from AvionPass ap where ap.noAv = ‘Av4’)));

Insert into Usine values (usine_t(‘u5’, ‘Montréal’, 100, (select ref(ap) from AvionPass ap where ap.noAv = ‘Av5’)));

Insert into Usine values (usine_t(‘u6’, ‘Montréal’, 100, (select ref(ap) from AvionPass ap where ap.noAv = ‘Av6’)));

/* Création des banques d’affaires: sans spécifier les actionnaires*/

Insert into BqeAFF values (bqeAff_t(500, 'Vachon',lesCliAct_t( (null),(null))));

Insert into BqeAFF values (bqeAff_t(700, 'Pouliot',lesCliAct_t( (null),(null), (null))));

Insert into BqeAFF values (bqeAff_t(600, 'Vandry',lesCliAct_t( (null))));

Insert into BqeAFF values (bqeAff_t(800, 'Dion',lesCliAct_t( (null))));

Insert into BqeAFF values (bqeAff_t(900, 'Beaudry',lesCliAct_t( (null))));

Insert into BqeAFF values (bqeAff_t(400, ‘Danois’, lesCliAct_t( null))); /* Création des actionnaires avec référence aux banques avec lesquelles ils font des affaires créées : */ Insert into Actionnaire values ( actionnaire_t( 1, 100600700, 5000,

lesBqes_t( (Select ref(b) from BqeAff b where b.noBqe = 500), (Select ref(b) from BqeAff b where b.noBqe = 700),

(select ref(b) from BqeAff b where b.noBqe =800)))); Insert into Actionnaire values ( actionnaire_t( 2, 200620720, 2000,

lesBqes_t( (Select ref(b) from BqeAff b where b.noBqe = 500), (select ref(b) from BqeAff b where b.noBqe =900))));

Insert into Actionnaire values ( actionnaire_t( 3, 300630730, 1000,

lesBqes_t( (Select ref(b) from BqeAff b where b.noBqe = 700)))); Insert into Actionnaire values ( actionnaire_t( 4, 430530590, 4000,

lesBqes_t( (Select ref(b) from BqeAff b where b.noBqe = 600)))); Insert into Actionnaire values ( actionnaire_t( 5, 500680530, 4000,

lesBqes_t( (Select ref(b) from BqeAff b where b.noBqe = 700))));

Page 18: IFT-3202TP3 version bonifiée

Page 18

© A. Gamache Version de ZOP du lundi, 6 mars 2017

/* Les banque d’affaires /* update BqeAFF ba set ba.lesCliAct = lesCliAct_t((select ref(a) from Actionnaire a where a.noAct=2),

( select (a) from Actionnaire a where a.noAct =1)) where ba.noBqe =500; update BqeAFF ba set ba.lesCliAct = lesCliAct_t((select ref(a) from Actionnaire a where a.noAct=1),

(select ref(a) from Actionnaire a where a.noAct=3), (select ref(a) from Actionnaire a where a.noAct=5))

where ba.noBqe =700; update BqeAFF ba set ba.lesCliAct = lesCliAct_t((select ref(a) from Actionnaire a where a.noAct=4)) where ba.noBqe =600; update BqeAFF ba set ba.lesCliAct = lesCliAct_t((select ref(a) from Actionnaire a where a.noAct=1)) where ba.noBqe =800; update BqeAFF ba set ba.lesCliAct = lesCliAct_t((select ref(a) from Actionnaire a where a.noAct=2)) where ba.noBqe =900; update BqeAFF ba set ba.lesCliAct = lesCliAct_t((null)) where ba.noBqe =400; /* Création des sous-traitants */

Insert into SousTraitant values (soustraitant_t(9, 'Québec', Spec_t (1,2,null))) Insert into SousTraitant values (soustraitant_t(8, ‘Montréal’, Spec_t (1,2,3))); Insert into SousTraitant values (soustraitant_t(7, ‘Québec’, Spec_t (1, null, null))); /*Création des Contrats: */ Insert into Contracte values (contracte_t(to_date(’10-06-2012’, ‘DD-MM-YYYY’), (select ref(u) from Usine u Where u.noUs = ‘u1’), (select ref(st) from SousTraitant st Where st.noEntr = 9 ))); Insert into Contracte values (contracte_t(to_date(’21-09-2012’, ‘DD-MM-YYYY’), (select ref(u) from Usine u Where u.noUs = ‘u2’), (select ref(st) from SousTraitant st Where st.noEntr =8 ))); Insert into Contracte values (contracte_t(to_date(’28-01-2012’, ‘DD-MM-YYYY’),

Page 19: IFT-3202TP3 version bonifiée

Page 19

© A. Gamache Version de ZOP du lundi, 6 mars 2017

(select ref(u) from Usine u Where u.noUs = ‘u5’ ), (select ref(st) from SousTraitant st Where st.noEntr = 7))); /* Création des avions de passagers */ Insert into AvionPass values (avionPass_t ( ‘Av1’, ‘m3 ‘, ‘pw’,

200, 2, lesCV_t (certifVol_t(450, to_Date(2012,’YYYY’), 36) ) ));

Insert into AvionPass values (avionPass_t ( ‘Av4’, ‘m9 ‘, ‘ja’, 250, 2, lesCV_t

(certifVol_t(250, to_Date(2013,’YYYY’), 24) ) ));

Insert into AvionCargo values ( avionCargo_t(‘Av2’, ‘m8 ’, ‘ge’, 50, 4)); Insert into AvionCiterne values ( avionCiterne_t(‘Av3’, ‘m12’, ‘ge’, 50, 2, ‘C’, 2000)); Insert into AvionEpandeur values ( avionEpandeur_t(‘Av5’, ‘m56’, ‘ge’, 55, 2, ‘F’, 1800, 10)); Insert into AvionEpandeur values ( avionEpandeur_t(‘Av6’, ‘m8’, ‘ge’, 75, 2, ‘G’, 4000, 15)); /* Création du siège social */

Insert into SiegeSoc values ( siegeSoc_t(100, ‘Québec’, ‘Paul-André’,

lesUs_t( (select ref(u) from Usine u where u.noUs= ‘u1’), (select ref(u) from Usine u Where u.noUs = ‘u2’)),

lesdir_t((select ref(d) from Actionnaire d where d.noAct = 1),

(select ref(d) from Actionnaire d where d.noAct = 2),

(select ref(d) from Actionnaire d where d.noAct = 3)),

lesFin_t ((select ref(f) from Actionnaire f where f.noAct = 1),

(select ref(f) from Actionnaire f where f.noAct = 2),

(select ref(f) from Actionnaire f where f.noAct =3),

(select ref(f) from Actionnaire f where f.noAct =4),

(select ref(f) from Actionnaire f where f.noAct =5)),

(select ref(pdg) from Actionnaire pdg where pdg.noAct =4)));

Page 20: IFT-3202TP3 version bonifiée

Page 20

© A. Gamache Version de ZOP du lundi, 6 mars 2017

Suppression de tous les objets

Delete Usine ; Delete Contracte ; Delete SousTraitant ; Delete Actionnaire; Delete Avion ; Delete AvionPass ; Delete AvionCargo ; Delete AvionCiterne; Delete AvionEpandeur ; Delete BqeAFF; Delete SiegeSoc ;

********************************** FIN ************************************

2d- Développez une procédure PL/SQL anonyme pour afficher les certificats de vol des avions de passagers représentés dans la base i.e. les noAv, noC et la durée. Démontrez qu’elle fournit la réponse attendue avec la base d’objets d’essai.

Set serveroutput ON Declare v_noAv varchar(4); v_noC int; v_duree int; Cursor c1 is Select ap.noAv, c.noC, c.duree from AvionPass ap, Table(ap.lesCV) c; Begin open c1; LOOP fetch c1 into v_noAV, v_noC, v_duree; exit when c1%notfound; dbms_output.put_line(v_noAv ||' ' || v_noC ||' '|| v_duree); end loop; Close C1; End; / Av1 450 36

Av4 250 24

PL/SQL procedure successfully completed.PL/SQL procedure successfully completed.

2e- Avec une procédure PL/SQL anonyme, modifiez le pdg actuel, oid4 pour le remplacer par l’actionnaire oidAct5 soit l’actionnaire no5

Page 21: IFT-3202TP3 version bonifiée

Page 21

© A. Gamache Version de ZOP du lundi, 6 mars 2017

Dans ce cas il s’agit de modifier un lien soit du pdg allant vers l’actionnaire qui occupe ce poste.

Update SiegeSoc ss set ss.refpdg = (select ref(a) from Actionnaire a where a.noAct =5) Where ss.noSSf =4;

2f- Développez une procédure PL/SQL laquelle sera appelée dans un bloc PL/SQL anonyme exécuté par SQLPlus pour modifier la spécialité des sous-traitants (7, 8 et 9) en remplaçant la spécialité no 1 par celle de 9, la nouvelle spécialité.

[9, Québec, [1, 2, null ]] [8,Montréal, [1, 2, 3]] [7, Québec, [1, null, null]]

Set serveroutput on Declare v_Spec spec_t := spec_t(9,9,9); -- array de 3 places pour nb entier v_nbST int; -- nb de sous-traitants v_noEntr int; v_nbEntr int ; Cursor C1 is Select noEntr, spec from SousTraitant ; Begin open C1; select count (*) into v_nbEntr from sousTraitant; Loop

Fetch C1 into v_noEntr, v_spec; Exit when C1%notfound; If (v_noEntr = 8 or v_noEntr = 7 or v_noEntr = 9 ) then

For I in 1 .. 3 loop If (v_spec (I) = 1) then v_spec (I) := 9 ; End IF; End Loop;

End if; dbms_output.Put_line ( v_noEntr || ’ ‘ ||’ ‘ || v_spec (1) || ’ ‘ || v_spec(2) || ’ ‘ || v_spec(3));

End loop; Close C1; End; 8 9 2 3 7 9 null null

Page 22: IFT-3202TP3 version bonifiée

Page 22

© A. Gamache Version de ZOP du lundi, 6 mars 2017

9 9 2 null PL/SQL procedure successfully completed.

Fin du TP-2

*****************************************************************************

IFT-3202 A-2013 (AG)

TP-3 Développement des interfaces (Échéance 11 décembre)

NB Pour faciliter les manipulations de la BD utilisez le copier/coller des commandes pour recréer votre schéma et votre base dans l’état initial pour que la base créée soit fidèle au jeu

d’essai.

En utilisant le schéma et la base de référence, chargez à nouveau le jeu d’essai pour avoir une base de départ cohérente et commune à toutes les équipes. Les avions sont stockés respectivement dans le containeur de leur type.

Développez les interfaces et les méthodes ci-dessous. Vérifiez le bon fonctionnement d’une méthode en élaborant un bloc PL/SQL pour l’appeler et affichez les résultats. Ne faites aucun traitement d’erreur pour l’exécution des clauses DML sur la base.

Création d’une interface

1-Créez l’interface Inter 5 de la classe BqeAFF et son body en vous limitant au body de la signature de la seule méthode creerBqe(). C creerBqe () méthode STATIC pour ajouter une nouvelle banque ne faisant pas encore affaire avec des actionnaires de ZOP. CompterCl() méthode MEMBER pour compter le nombre de clients de la banque qui sont actionnaires de ZOP. TransigeAc méthode Member pour créer une association entre un actionnaire et une banque d’affaires. Ajouter une signature et le body d’une méthode à une interface 2- Ajouter à l’interface 8 (AvionCargo), la signature de la méthode Member Vevac(noAv,ve ) pour calculer la vitesse d’évacuation du cargo d’un avion de ce type selon la formule empirique suivante (non démontrable):

Page 23: IFT-3202TP3 version bonifiée

Page 23

© A. Gamache Version de ZOP du lundi, 6 mars 2017

ve = (poidsC / nbPorteC) * 2,5

Ensuite, créez le body du type

Développer un applicatif PL/SQL qui appelle Vevac pour chaque avion-cargo dans la base et insérez le résultat dans une table-objet créée au préalable en dehors de la base objet :

Vev (noAv, ve)

Affichez le contenu de la table-objet Vev.

Redéfinition d’une méthode 3- Au niveau de l’interface Inter10 (AvionEpandeur) REDEFINIR la méthode Vevac () pour calculer cette fois la vitesse d’épandage en tenant compte du volume maximum du réservoir du cargo liquide de chaque avion-citerne. Cette vitesse est calculée par cette formule empirique (bien sûr encore non démontrable) :

ve = 3.14 (volMax / nbBuses)

Vérification d’une contrainte de la base objets

4- Un contrat est signé entre une usine et un sous-traitant sous une condition stricte : (voir contrainte 5) Un sous-traitant doit-être dans la même ville que l’usine qui accorde la sous-traitance).

a- Créez l’interface de la classe Contracte avec une seul signature : AjoutContrat() qui établit un lien entre Usine et SousTraitant à la condition que l’usine soit située dans la même ville que celle du Sous-traitant.

b- Développez le body de la méthode Member AjoutContrat() pour ajouter en date de ce jour un contrat conclu entre l’usine u1 et l’entreprise no 7 comme sous-traitant. En cas de refus, la méthode doit retourner le code 0;

c- Ajoutez avec la méthode un contrat entre l’entreprise u1 et le sous-traitant 8. Si l’ajout se fait correctement, la méthode retourne 1.

Recherche et traitement des objets dans une hiérarchie

5.1- Créez une nouvelle base dont le modèle est composé uniquement d’une hiérarchie des classes dont la racine est la classe Avion. Chargez les données du jeu d’essai pertinentes à cette hiérarchie. A la création, tous les objets de type avionCargo_t, avionCiterne_t et avionEpandeur_t sont rangés dans une seule table-objet soit le containeur de la racine. Cependant les avions de passagers sont rangés dans une table-objet séparée soit AvionPass.

Page 24: IFT-3202TP3 version bonifiée

Page 24

© A. Gamache Version de ZOP du lundi, 6 mars 2017

6.1 Développez une méthode pour modifier tous les avions, sauf ceux de passagers et ceux des avions citernes, équipés par un moteur ‘ ge’ et le remplacer par ‘pw’. Affichez le no de l’avion et leur nouveau moteur.

Solution au TP-3

1-Créez l’interface Inter 5 de la classe BqeAFF et son body en vous limitant au body de la signature de la seule méthode creerBqe(). C creerBqe () méthode STATIC pour ajouter une nouvelle banque ne faisant pas encore affaire avec des actionnaires de ZOP. CompterCl() méthode MEMBER pour compter le nombre de clients de la banque qui sont actionnaires de ZOP. TransigeAc méthode Member pour créer une association entre un actionnaire et une banque d’affaires. Create type actionnaire_t / Create type lesCliAct_t as table of REF Actionnaire_t / Create or replace type BqeAFF_t as object (noBqe integer, dirBqe varchar(40), lesCliAct lesCliAct_t, STATIC Function creerBqe (noB In int, dir In varchar) return number, MEMBER Procedure compteurClient (nbC Out int) , MEMBER Procedure TransigeAc (noAct in int, noB in int, rep out int)) / 2- Ajouter à l’interface 8, la signature et le body de la méthode Member Vevac(noAv,ve ) pour calculer la vitesse d’évacuation du cargo d’un avion de ce type selon la formule empirique suivante (non démontrable):

ve = (poidsC / nbPorteC) * 2,5

et insérez le résultat dans la table-objet : Vev (noAv, ve).

Il faut en premier créer la hiérarchie des types et ensuite modifier le type de la classe AvionCargo en ajoutant les signatures de l’interface. Utilisez les stubs pour les bodys non essentiels.

Création de l’interface du type AvionCargo_t :

Alter type avionCargo_ t ADD Member procedure suppAC (noAC in varchar, rep out int); Alter type avionCargo_t ADD Member Vevac (noAC in varchar); create type Vev_t as object (noAv varchar(4))

Page 25: IFT-3202TP3 version bonifiée

Page 25

© A. Gamache Version de ZOP du lundi, 6 mars 2017

/ Create table Vev of vev_t ; )); - la nouvelle table-objet Création du body de l’interface 8; Create or replace type body avionCargo_t as Member procedure suppAC (noAv in varchar, rep out int) is Null; -- stub End suppAC; Member Vevac (noAv in varchar) is Declare v_poids int; v_nbPorte int; v_ve number(5,2); Begin Select poidsC, nbPorteC into v_poids, v_nbPorte From AvionCargo ac where ac.noAv = noAv; v_ve := v_poidsC /nbPorteC) * 2.5; insert into ve values (ve_t (noAc, v_ve)); End Vevac; End; 3- Au niveau de l’interface Inter10 redéfinir la méthode Vevac () pour calculer cette fois la vitesse d’épandage en tenant compte du volume maximum du réservoir du cargo liquide de chaque avion-citerne. Cette vitesse est calculée par cette formule empirique :

ve = 3.14 (volMax / nbBuses)

Alter type avionEpandeur_t ADD … Create or replace type body avionEpandeur_t as Member procedure ajoutAE (noAv in varchar) is Null; End ajoutAE; Member Vevac (noAv in varchar) is Declare v_volMax int; v_nbBuses int; v_ve number(5,2); Begin Select volMax, nbBuses into v_volMax, v_nbBuses From AvionEpandeur ae where ae.noAv = noAv; v_ve := v_volMax /V_nbBuses); insert into ve values (ve_t (noAv, v_ve)); End Vevac; End;

Page 26: IFT-3202TP3 version bonifiée

Page 26

© A. Gamache Version de ZOP du lundi, 6 mars 2017

4- voir plus loin

Version de la BD avec une seule table pour tous les avions

Création des types :

Create or replace type actionnaire_t / Create or replace type avion_t / Create or replace type usine_t / Create or replace type Avion_t as object (noAV varchar(4), modelAv char(3), sortMotAv char(2)) not instantiable not final / Create or replace type certifVol_t as object (noC int, dateCertif Date, duree int) / Create or replace type lesCV_t as table of certifVol_t / Create or replace type AvionPass_t under Avion_t (nbPas int, nbClasse int, lesCV lesCV_t) instantiable not final / Create or replace type AvionCargo_t under avion_t (poidsC int, nbPortec int) not final instantiable / Create or replace type AvionCiterne_t under avionCargo_t (contenu char(1), volMax int) not final instantiable / Create or replace type avionEpandeur_t under avionCiterne_t ( nbBuses int) final instantiable / Create or replace type usine_t as object(noUs char(2), villeUs varchar(40), nbEmpl int, refAv REF avion_t) / Create or replace type Spec_t as varray (3) of integer / Create or replace type sousTraitant_t as Object (noEntr int, ville varchar(40), Spec Spec_t) / Create or replace type contracte_t as object (dateC Date, refUs REF usine_t, refST REF soustraitant_t) / Create or replace type lesUs_t as table of REF usine_t

Page 27: IFT-3202TP3 version bonifiée

Page 27

© A. Gamache Version de ZOP du lundi, 6 mars 2017

/ Create or replace type lesDir_t as table of REF actionnaire_t / Create or replace type lesFin_t as table of REF actionnaire_t / Create or replace type siegeSoc_t as object (noSS number(3,0), villeSS varchar(40), pdg varchar(40), lesUs lesUs_t, lesDir lesDir_t, lesFin lesFin_t, refPdg REF actionnaire_t) / Create or replace type lesCliAct_t as table of REF actionnaire_t / Create or replace type BqeAFF_t as object (noBqe integer, dirBqe varchar(40), lesCliAct lesCliAct_t) / Create or replace type lesBqes_t as table of REF BqeAff_t / Create or replace type actionnaire_t as object(noAct int, nasAc char(9), nbAction int, lesBqes lesBqes_t) / Réinitialisation de la base Suppression des types (vérification de la suppression de tous les types) sans égard à leur dépendance. Vérification plus simple par la suite avec SQLDevelopper. Drop type avion_t force; Drop type sousTraitant_t force; Drop type contracte_t force; Drop type usine_t force ; Drop type siegeSoc_t force; Drop type actionnaire_t force; Drop type bqeAff_t force; Drop type lesDir_t force; Drop type lesFin_t Force; Drop type lesUs_t force; Drop type lesCV_t force; Drop type lesCliAct_t force; Drop type lesBqes_t force; Drop type refPdg_t Force; Drop type spec_t Force; Drop type certifVol_t Force; /* 2b Créez les tables-objets de cette base avec les contraintes qui peuvent être formulées par le DDL. */

/* NB les contraintes ne sont pas incluses pour garder le schéma lisible */

Page 28: IFT-3202TP3 version bonifiée

Page 28

© A. Gamache Version de ZOP du lundi, 6 mars 2017

Create Table Usine of usine_t; Create Table Contracte of Contracte_t; Create Table SousTraitant of sousTraitant_t; Create table Avion of avion_t; Create table BqeAFF of bqeAff_t NESTED Table lesCliAct store as Table_lesCliAct ; Create table Actionnaire of actionnaire_t Nested table lesBqes store as Table_lesBqes; Create table SiegeSoc of siegeSoc_t Nested table lesUs store as Table_lesUs

Nested table lesDir store as table_lesDir Nested table lesFin store as table_lesFin;

Pour supprimer toute la base de données: Drop table Usine ; Drop table Contracte ; Drop table SousTraitant ; Drop table Actionnaire; Drop table Avion ; Drop table BqeAFF; Drop table SiegeSoc ;

2c- Chargez la base qu’avec les objets fournis et cela avec l’application SQLPlus

/* Création des banques d’affaires: sans spécifier les actionnaires*/

Insert into BqeAFF values (bqeAff_t(500, 'Vachon',lesCliAct_t( (null),(null))));

Insert into BqeAFF values (bqeAff_t(700, 'Pouliot',lesCliAct_t( (null),(null), (null))));

Insert into BqeAFF values (bqeAff_t(600, 'Vandry',lesCliAct_t( (null))));

Insert into BqeAFF values (bqeAff_t(800, 'Dion',lesCliAct_t( (null))));

Insert into BqeAFF values (bqeAff_t(900, 'Beaudry',lesCliAct_t( (null))));

Insert into BqeAFF values (bqeAff_t(400, ‘Danois’, lesCliAct_t( null))); /* Création des actionnaires avec référence aux banques avec lesquelles ils font des affaires créées : */ Insert into Actionnaire values ( actionnaire_t( 1, 100600700, 5000,

lesBqes_t( (Select ref(b) from BqeAff b where b.noBqe = 500), (Select ref(b) from BqeAff b where b.noBqe = 700),

(select ref(b) from BqeAff b where b.noBqe =800))));

Page 29: IFT-3202TP3 version bonifiée

Page 29

© A. Gamache Version de ZOP du lundi, 6 mars 2017

Insert into Actionnaire values ( actionnaire_t( 2, 200620720, 2000, lesBqes_t( (Select ref(b) from BqeAff b where b.noBqe = 500),

(select ref(b) from BqeAff b where b.noBqe =900)))); Insert into Actionnaire values ( actionnaire_t( 3, 300630730, 1000,

lesBqes_t( (Select ref(b) from BqeAff b where b.noBqe = 700)))); Insert into Actionnaire values ( actionnaire_t( 4, 430530590, 4000,

lesBqes_t( (Select ref(b) from BqeAff b where b.noBqe = 600)))); Insert into Actionnaire values ( actionnaire_t( 5, 500680530, 4000,

lesBqes_t( (Select ref(b) from BqeAff b where b.noBqe = 700)))); /* Les banque d’affaires /* update BqeAFF ba set ba.lesCliAct = lesCliAct_t((select ref(a) from Actionnaire a where a.noAct=2),

( select (a) from Actionnaire a where a.noAct =1)) where ba.noBqe =500; update BqeAFF ba set ba.lesCliAct = lesCliAct_t((select ref(a) from Actionnaire a where a.noAct=1),

(select ref(a) from Actionnaire a where a.noAct=3), (select ref(a) from Actionnaire a where a.noAct=5))

where ba.noBqe =700; update BqeAFF ba set ba.lesCliAct = lesCliAct_t((select ref(a) from Actionnaire a where a.noAct=4)) where ba.noBqe =600; update BqeAFF ba set ba.lesCliAct = lesCliAct_t((select ref(a) from Actionnaire a where a.noAct=1)) where ba.noBqe =800; update BqeAFF ba set ba.lesCliAct = lesCliAct_t((select ref(a) from Actionnaire a where a.noAct=2)) where ba.noBqe =900; update BqeAFF ba set ba.lesCliAct = lesCliAct_t((null)) where ba.noBqe =400; /* Création des sous-traitants */

Insert into SousTraitant values (soustraitant_t(9, 'Québec', Spec_t (1,2,null))) Insert into SousTraitant values (soustraitant_t(8, ‘Montréal’, Spec_t (1,2,3)));

Page 30: IFT-3202TP3 version bonifiée

Page 30

© A. Gamache Version de ZOP du lundi, 6 mars 2017

Insert into SousTraitant values (soustraitant_t(7, ‘Québec’, Spec_t (1, null, null))); /*Création des Contrats: */ Insert into Contracte values (contracte_t(to_date(’10-06-2012’, ‘DD-MM-YYYY’), (select ref(u) from Usine u Where u.noUs = ‘u1’), (select ref(st) from SousTraitant st Where st.noEntr = 9 ))); Insert into Contracte values (contracte_t(to_date(’21-09-2012’, ‘DD-MM-YYYY’), (select ref(u) from Usine u Where u.noUs = ‘u2’), (select ref(st) from SousTraitant st Where st.noEntr =8 ))); Insert into Contracte values (contracte_t(to_date(’28-01-2012’, ‘DD-MM-YYYY’), (select ref(u) from Usine u Where u.noUs = ‘u5’ ), (select ref(st) from SousTraitant st Where st.noEntr = 7))); /* Création des avions de passagers */ Insert into Avion values (avionPass_t ( ‘Av1’, ‘m3 ‘, ‘pw’,

200, 2, lesCV_t (certifVol_t(450, to_Date(2012,’YYYY’), 36) ) ));

Insert into Avion values (avionPass_t ( ‘Av4’, ‘m9 ‘, ‘ja’, 250, 2, lesCV_t

(certifVol_t(250, to_Date(2013,’YYYY’), 24) ) ));

Insert into Avion values ( avionCargo_t(‘Av2’, ‘m8 ’, ‘ge’, 50, 4)); Insert into Avion values ( avionCiterne_t(‘Av3’, ‘m12’, ‘ge’, 50, 2, ‘C’, 2000)); Insert into Avion values ( avionEpandeur_t(‘Av5’, ‘m56’, ‘ge’, 55, 2, ‘F’, 1800, 10)); Insert into Avion values ( avionEpandeur_t(‘Av6’, ‘m8’, ‘ge’, 75, 2, ‘G’, 4000, 15)); /* Création du siège social */

Insert into SiegeSoc values ( siegeSoc_t(100, ‘Québec’, ‘Paul-André’,

lesUs_t( (select ref(u) from Usine u where u.noUs= ‘u1’), (select ref(u) from Usine u Where u.noUs = ‘u2’)),

lesdir_t((select ref(d) from Actionnaire d where d.noAct = 1),

Page 31: IFT-3202TP3 version bonifiée

Page 31

© A. Gamache Version de ZOP du lundi, 6 mars 2017

(select ref(d) from Actionnaire d where d.noAct = 2),

(select ref(d) from Actionnaire d where d.noAct = 3)),

lesFin_t ((select ref(f) from Actionnaire f where f.noAct = 1),

(select ref(f) from Actionnaire f where f.noAct = 2),

(select ref(f) from Actionnaire f where f.noAct =3),

(select ref(f) from Actionnaire f where f.noAct =4),

(select ref(f) from Actionnaire f where f.noAct =5)),

(select ref(pdg) from Actionnaire pdg where pdg.noAct =4)));

/* Création des usines: */

Insert into Usine values (usine_t(‘u1’, ‘Québec’, 50, (select ref(ap) from Avion ap where ap.noAv = ‘Av1’)));

Insert into Usine values (usine_t(‘u2’, ‘Montréal’, 100, (select ref(ap) from Avion ap where ap.noAv = ‘Av2’)));

Insert into Usine values (usine_t(‘u3’, ‘Québec’, 100, (select ref(ap) from Avion ap where ap.noAv = ‘Av3’)));

Insert into Usine values (usine_t(‘u4’, ‘Montréal’, 100, (select ref(ap) from Avion ap where ap.noAv = ‘Av4’)));

Insert into Usine values (usine_t(‘u5’, ‘Montréal’, 100, (select ref(ap) from Avion ap where ap.noAv = ‘Av5’)));

Insert into Usine values (usine_t(‘u6’, ‘Montréal’, 100, (select ref(ap) from Avion ap where ap.noAv = ‘Av6’)));

2d- Développez une procédure PL/SQL anonyme pour afficher les certificats de vol des avions de passagers représentés dans la base i.e. les noAv, noC et la durée. Démontrez qu’elle fournit la réponse attendue avec la base d’objets d’essai.

La procédure ci-dessous devra être modifiée si chaque avion a son containeur d’objets . Set serveroutput on; Declare v_avion avion_t; v_avionPass avionPass_t; Cursor c1 is select value(a)

Page 32: IFT-3202TP3 version bonifiée

Page 32

© A. Gamache Version de ZOP du lundi, 6 mars 2017

from Avion a where value(a) is of (avionPass_t); Begin open c1; LOOP fetch c1 into v_avion ; exit when c1%notfound; dbms_output.put_line(v_avion.noAv || ‘ ‘ ||v_avion.modelAv) ; end loop; Close C1; End; / Av1 m3 Av4 m9 PL/SQL procedure successfully completed. Une autre solution: DECLARE v_avionPass avionPass_t; v_lesCV lesCV_t; v_CV certifVol_t; CURSOR c_lesAvionsPass IS SELECT Treat (value(a) as avionPass_t) FROM Avion a WHERE value(a) IS OF (avionPass_t); BEGIN open c_lesAvionsPass; DBMS_OUTPUT.Put_Line('NO_AV - ' || 'NO_CERTIF - ' || 'Duree ' ); LOOP Exit when c_lesAvionsPass%NOTFOUND; Fetch c_lesAvionsPass into v_avionPass; SELECT value(x) INTO v_CV FROM Table(v_avionPass.lesCV) x; -- Unnesting DBMS_OUTPUT.Put_Line( v_avionPass.NoAv || ' ' || v_CV.noC || ' ' || v_CV.duree ); END LOOP; END; / 18* END; NO_AV NO_CERTIF Duree Av1 450 36 Av4 250 24

Page 33: IFT-3202TP3 version bonifiée

Page 33

© A. Gamache Version de ZOP du lundi, 6 mars 2017

Av4 250 24 PL/SQL procedure successfully completed. TP-3 Développement des interfaces (version du 17 novembre)

NB Pour faciliter les manipulations de la BD utilisez le copier/coller des commandes pour recréer votre schéma et votre base dans l’état initial pour que la base créée soit fidèle au jeu

d’essai. Les ajouts sont caractères italiques.

En utilisant le schéma et la base de référence, chargez à nouveau le jeu d’essai pour avoir une base de départ cohérente et commune à toutes les équipes. Les avions sont stockés respectivement dans le containeur de leur type.

Développez les interfaces et les méthodes ci-dessous. Vérifiez le bon fonctionnement d’une méthode en élaborant un bloc PL/SQL pour l’appeler et affichez les résultats. Ne faites aucun traitement d’erreur pour l’exécution des clauses DML sur la base. En cours de travail, vous devrez supprimer des types pour les redéfinir autrement. Pour montrer que vos méthodes fonctionnent correctement, utiliser les données du jeu d’essai.

Création d’une interface

1-Recréez l’interface Inter 5 (avec seulement la première signature) de la classe BqeAFF et son body (du type) en vous limitant au body complet de la signature de la seule méthode creerBqe(). creerBqe () méthode STATIC pour ajouter une nouvelle banque ne faisant pas encore affaire avec des actionnaires de ZOP. Réponse : Alter Type bqeAff_t ADD Static Function creerBqe (noB in int, dirB in varchar, lesCliACt lesCliAct_t) return int CASCADE; Create or replace type body bqeAff_t as Static Function creerBqe (noB in int, dirB in varchar, lesCliACt lesCliAct_t) return int IS rep int; Begin Insert into bqeAff values( bqeAff_t ( noB, dirB, lesCliAct )) ; Return 1; End creerBqe; End; /

Page 34: IFT-3202TP3 version bonifiée

Page 34

© A. Gamache Version de ZOP du lundi, 6 mars 2017

Ajouter une signature et le body d’une méthode à une interface 2- Ajouter à l’interface 8 (AvionCargo)du modèle initial, la signature de la méthode Member Vevac(noAv,ve ) pour calculer la vitesse d’évacuation du cargo d’un avion de ce type selon la formule empirique suivante (non démontrable):

ve = (poidsC / nbPorteC) * 2,5

Ensuite, créez le body du type.

Vous n’avez pas en écrire explicitement le body de la méthode supp(); utilisez un stub.

Développer un applicatif PL/SQL qui appelle Vevac pour chaque avion-cargo dans la base et insérez le résultat dans une table-objet créée au préalable en dehors de la base objet :

Vev (noAv, ve)

Affichez le contenu de la table-objet Vev.

Réponse :

Alter type avionCargo_t ADD Instantiable not final member procedure vevac ( noAv in int, vevac out number) Cascade;

Create or replace type body avionCargo_t as Instantiable not final member procedure supp(ac avionCargo_t) Is Null; Instantiable not final member procedure vevac ( noAv in int, vevac out number) is v_av avionCargo_t; Begin Select value(ac) into v_av From AvionCargo ac Where ac.noav = noav; vevac := ( v_av.poidsC / v_av.nbPorteC ) * 2.5; End; End; / Applicatif d’appel pour la method vevac

Redéfinition d’une méthode 3- Au niveau de l’interface Inter10 (AvionEpandeur) REDEFINIR la méthode Vevac () pour calculer cette fois la vitesse d’épandage en tenant compte du volume maximum du réservoir

Page 35: IFT-3202TP3 version bonifiée

Page 35

© A. Gamache Version de ZOP du lundi, 6 mars 2017

du cargo liquide de chaque avion-citerne. Cette vitesse est calculée par cette formule empirique (bien sûr encore non démontrable) :

ve = 3.14 (volMax / nbBuses)

Réponse :

Alter type avionEpandeur_t ADD overriding instantiable final member procedure vevac ( noAv in int, vevac out number) Cascade; / Create or replace type body avionEpandeur_t as OVERRIDING Instantiable Final member procedure vevac ( noAv in int, vevac out number) is v_ae avionEpandeur_t; Begin Select value(ae) into v_ae From AvionEpandeur ae Where ae.noav = noav; vevac := 3.14 * (volMax / nbBuses) ; End; End; / Appel de la méthode redéfinie Dans un applicatif, appel de vevac avec l’objet (avionEpandeur) av5 pour calculer la valeur de vevac pour cet avion épandeur. Réponse : Vérification d’une contrainte de la base objets

4- Un contrat est signé entre une usine et un sous-traitant sous une condition stricte : (voir contrainte 5) Un sous-traitant doit-être dans la même ville que l’usine qui accorde la sous-traitance).

a- Créez l’interface de la classe Contracte avec une seul signature : AjoutContrat() qui établit un lien entre Usine et le sous-traitant à la condition que l’usine soit située dans la même ville que celle du Sous-traitant.

Page 36: IFT-3202TP3 version bonifiée

Page 36

© A. Gamache Version de ZOP du lundi, 6 mars 2017

b- Développez le body de la méthode Member AjoutContrat() pour ajouter en date de ce

jour un contrat conclu entre l’usine u1 et l’entreprise no 7 comme sous-traitant. En cas de refus, la méthode doit retourner le code 0;

c- Ajoutez avec la méthode un contrat entre l’entreprise u1 et le sous-traitant 8. Si l’ajout se fait correctement, la méthode retourne 1.

Réponse :

Alter type sousTraitant_t ADD member ajoutContrat

Recherche et traitement des objets dans une hiérarchie

5.1- Créez une nouvelle base dont le modèle est composé uniquement d’une hiérarchie des classes dont la racine est la classe Avion. Chargez les données pertinentes du jeu d’essai à cette hiérarchie en laissant vide la table-objet AvionPass. Pour cette nouvelle base, les objets de type avionCargo_t, avionCiterne_t et avionEpandeur_t sont rangés dans une seule table-objet soit le containeur de la racine Avion.

6.1 Développez une méthode pour modifier tous les avions, sauf ceux de passagers et ceux des avions citernes, équipés par un moteur ‘ ge’ et le remplacer par ‘pw’. Affichez le no de l’avion et leur nouveau moteur.

*************