| mon master2 ISIFAR ISIFAR |
| | COURS 3 | |
| | Auteur | Message |
---|
Admin Admin
Nombre de messages : 418 Date d'inscription : 27/09/2005
| Sujet: COURS 3 Sam 3 Déc à 22:10 | |
| Vues du dictionnaire de données - Code:
-
DESC USER_TYPES DESC USER_TYPE_ATTRS DESC USER_TYPE_METHODS DESC USER_TYPE_VERSIONS DESC USER_COLL_TYPES DESC USER_TYPE_INDEXTYPES
--Structure des vues Objets-Relationnelles du dictionnaire
DESC USER_OBJECT_TABLES
--Exemple : Liste des types objets & leurs attributs
COL type_name FOR A20; COL attr_name FOR A20
SELECT type_name, attr_name, attr_type_name FROM user_type_attrs ORDER BY 1;
--Liste des tables objets
COL table_name FOR A20; COL object_id_type FOR A20; COL table_type_owner FOR A20; COL table_type FOR A20
SELECT table_name, object_id_type, table_type_owner, table_type FROM user_object_tables ORDER BY 1;
CREATION DES TYPES ET TABLES "OR" - Code:
-
CREATE OR REPLACE TYPE ty_adresse; CREATE OR REPLACE TYPE ty_personne;
CREATE OR REPLACE TYPE ty_adresse AS OBJECT (numero NUMBER, rue VARCHAR2(20), ville VARCHAR2(30) ) /
CREATE OR REPLACE TYPE ty_personne AS OBJECT (nom VARCHAR2(20), prenom VARCHAR2(20), adresse ty_adresse ) /
CREATE OR REPLACE TYPE ty_possede AS OBJECT (nom VARCHAR2(20), prenom VARCHAR2(20), immatriculation CHAR(10) ) /
CREATE OR REPLACE TYPE t_voiture AS OBJECT (immatriculation CHAR(10), marque VARCHAR2(20), modele VARCHAR2(20) ) /
CREATE TABLE OR_Personne of ty_personne ( CONSTRAINT pk_ORPersonne PRIMARY KEY(nom, prenom));
CREATE TABLE or_voiture OF t_voiture ( CONSTRAINT pk_ORVoiture PRIMARY KEY (immatriculation) );
CREATE TABLE or_possede OF ty_possede ( CONSTRAINT pk_ORPossede PRIMARY KEY (nom, prenom, immatriculation), CONSTRAINT fk_ORPersonne FOREIGN KEY (nom, prenom) REFERENCES OR_Personne, CONSTRAINT fk_ORVoiture FOREIGN KEY (immatriculation) REFERENCES OR_voiture );
Visualisation de la structure - Code:
-
-- La commande "DESC" de SQL*PLUS permet de visualiser DESC or_personne DESC or_voiture DESC or_possede
INSERT INTO or_personne(nom, prenom,adresse) VALUES('dupond','raymond', ty_adresse('33','rue de marseille', 'bordeaux 33000'));
INSERT INTO or_personne VALUES('dupont','cecile', ty_adresse('35','rue de paris', 'bordeaux 33000'));
INSERT INTO or_personne(prenom,nom,adresse) VALUES('charles','dickens', ty_adresse('33','rue de marseille', 'bordeaux 33000'));
INSERT INTO or_voiture(immatriculation, marque, modele) VALUES('205VF33','peugeot', '205');
INSERT INTO or_possede(nom, prenom,immatriculation) VALUES('dupond','raymond','205VF33');
INSERT INTO or_personne(nom,prenom,adresse) VALUES ('amuah','remi', ty_adresse(NULL,NULL,NULL));
INSERT INTO or_possede(nom, prenom,immatriculation) VALUES('dupont','cecile','284VF75');
INSERT INTO or_possede(nom, prenom,immatriculation) VALUES('dickens','charles','920XX33');
INSERT INTO or_voiture(immatriculation, marque, modele) VALUES('284VF75','citroen', 'picasso');
INSERT INTO or_voiture(immatriculation, marque, modele) VALUES('920XX33','peugeot', '307');
Visualisation les données - Code:
-
COL nom FORMAT A15 COL prenom FORMAT A15 COL adresse FORMAT A62
SELECT nom, prenom, adresse FROM or_personne;
SELECT x1.nom, x1.prenom, x1.adresse.numero, x1.adresse.rue, x1.adresse.ville FROM or_personne x1;
SELECT * FROM or_voiture;
SELECT * FROM or_possede;
COL nom FORMAT A9 HEAD 'Nom' COL prenom FORMAT A9 HEAD 'Prenom' COL no FORMAT 9999 HEAD 'Numero' COL voie FORMAT A20 HEAD 'Voie' COL City FORMAT A15 HEAD 'Ville' COL marque FORMAT A10 HEAD 'Marque' COL modele FORMAT A10 HEAD 'Modele' COL immatriculation FORMAT A10 HEAD 'immatri.'
SELECT x1.nom, x1.prenom, x1.adresse.numero no, x1.adresse.rue voie, x1.adresse.ville city, x3.* FROM or_personne x1, or_possede x2, or_voiture x3 WHERE x1.nom=x2.nom (+) AND x1.prenom=x2.prenom (+) AND x2.immatriculation =x3.immatriculation (+);
- Code:
-
-- La commande "SELECT REF(alias) FROM ..." permet d'extraire les OID (Objet IDentifier) -- des objets de la table à l'aide de la directive "REF":
SELECT REF(x1) FROM or_personne x1;
SELECT REF(x2) FROM or_possede x2;
SELECT REF(x3) FROM or_voiture x3;
SELECT REF(x1), x1.nom, x1.prenom, x1.adresse.numero, x1.adresse.rue, x1.adresse.ville FROM or_personne x1;
SELECT REF(x1), x1.*, REF(x3), x3.* FROM or_personne x1, or_possede x2, or_voiture x3 WHERE x1.nom = x2.nom (+) AND x1.prenom = x2.prenom (+) AND x2.immatriculation = x3.immatriculation (+);
- Code:
-
-- La commande "SELECT VALUE(alias) FROM ..." permet d'extraire le contenu sous la -- forme d'un type à l'aide de la dirctive "VALUE":
SELECT VALUE(x1) FROM or_personne x1;
SELECT VALUE(x2) FROM or_voiture x2;
SELECT VALUE(x3) FROM or_possede x3;
--Utilisation de "UPDATE & DELETE"
UPDATE or_personne x1 SET x1.adresse.numero='10' WHERE x1.nom = 'dupond';
DELETE FROM or_personne x1 WHERE x1.adresse.numero IS NULL;
- Code:
-
--La commande "ALTER TYPE...ADD..." permet d'ajouter un attribut à un TAD :
ALTER TYPE ty_adresse ADD ATTRIBUTE (codePostal VARCHAR2(5)) CASCADE;
DESC ty_adresse
SELECT * FROM or_personne;
MARCHE PAS!!! - Code:
-
--La commande "DROP TYPE...ADD..." supprime un TAD : DROP TYPE ty_adresse FORCE;
DESC or_personne
SELECT * FROM or_personne;
Dernière édition par le Lun 5 Déc à 22:16, édité 1 fois | |
| | | Admin Admin
Nombre de messages : 418 Date d'inscription : 27/09/2005
| Sujet: Re: COURS 3 Dim 4 Déc à 1:38 | |
| | |
| | | Admin Admin
Nombre de messages : 418 Date d'inscription : 27/09/2005
| Sujet: Re: COURS 3 Dim 4 Déc à 1:43 | |
| - Code:
-
CREATE OR REPLACE TYPE t_constructeur AS OBJECT (marque VARCHAR2(20), nonsociete VARCHAR2(20) ) /
CREATE TABLE or_constructeur of t_constructeur ( CONSTRAINT pk_ORconstructeur PRIMARY KEY(marque));
--Une référence est définie par l'utilisation du mot clé "REF" La fonction REF(alias) permet d'extraire un ou plusieurs OID :
drop table or_possede;
drop table or_voiture;
CREATE OR REPLACE TYPE ty_voiture AS OBJECT (immatriculation CHAR(10), marque REF t_constructeur, modele VARCHAR2(25) ) /
CREATE TABLE or_voiture OF ty_voiture (CONSTRAINT pk_ORVoiture PRIMARY KEY (immatriculation) ); DESC or_voiture
DESC or_constructeur
Insertion d'une référence - Code:
-
INSERT INTO or_constructeur(marque, nonsociete) VALUES ('peugeot','PSA:peugeot-citroen');
INSERT INTO or_voiture(immatriculation, marque, modele) VALUES ('303VF75', (SELECT REF(x1) FROM or_constructeur x1 WHERE x1.marque = 'peugeot'), '407');
INSERT INTO or_voiture(immatriculation, marque, modele) VALUES ('284VF75', (SELECT REF(x1) FROM or_constructeur x1 WHERE x1.marque = 'peugeot'), '207');
INSERT INTO or_voiture(immatriculation, marque, modele) SELECT '303VF', REF(x1), '407' FROM or_constructeur x1 WHERE x1.marque = 'peugeot';
SELECT VALUE(x1), x1.marque.marque, x1.marque.nonsociete FROM or_voiture x1 WHERE x1.marque.marque ='peugeot';
SELECT VALUE(x4), REF(x4) FROM or_constructeur x4 WHERE x4.marque ='peugeot';
CREATE TABLE or_possede OF ty_possede ( CONSTRAINT pk_ORPossede PRIMARY KEY (nom, prenom, immatriculation), CONSTRAINT fk_ORPersonne FOREIGN KEY (nom, prenom) REFERENCES OR_Personne, CONSTRAINT fk_ORVoiture FOREIGN KEY (immatriculation) REFERENCES OR_voiture );
INSERT INTO or_possede(nom, prenom,immatriculation) VALUES('dupond','raymond','303VF75');
INSERT INTO or_possede(nom, prenom,immatriculation) VALUES('dupont','cecile','284VF75');
INSERT INTO or_possede(nom, prenom,immatriculation) VALUES('dickens','charles','920XX33');
COL nom FORMAT A9 HEAD 'Nom'; COL prenom FORMAT A9 HEAD 'Prenom'; COL no FORMAT 9999 HEAD 'Numero'; COL voie FORMAT A20 HEAD 'Voie'; COL City FORMAT A15 HEAD 'Ville'; COL marq FORMAT A7 HEAD 'Marque'; COL modele FORMAT A10 HEAD 'Modele'; COL societe FORMAT A20 HEAD 'Societe'; COL immatri FORMAT A8 HEAD 'Immatri';
SELECT x1.nom, x1.prenom, x1.adresse.numero no, x1.adresse.rue voie, x1.adresse.ville city, x3.immatriculation immatri, x3.marque.marque marq, x3.marque.nonsociete societe FROM or_personne x1, or_possede x2, or_voiture x3 WHERE x1.nom = x2.nom (+) AND x1.prenom = x2.prenom (+) AND x2.immatriculation = x3.immatriculation (+) ;
| |
| | | Admin Admin
Nombre de messages : 418 Date d'inscription : 27/09/2005
| Sujet: Re: COURS 3 Dim 4 Déc à 3:10 | |
| DEFERENCEMENT:Le déférencement permet d'extraire un objet cible en fonction d'un OID(obtention de la valeur de l'objet) La fonction DEREF(reference) extrait le contenu de l'objet à l'adresse de la référence à l'aide de l'ordre SQL "SELECT DEREF(reference) FROM..." - Code:
-
SELECT x3.immatriculation, REF(x3) FROM or_voiture x3 ORDER BY immatriculation;
SELECT x4.immatriculation, DEREF(x4.marque) FROM or_voiture x4 ORDER BY immatriculation;
UPDATE:La commande "UPDATE" suivie de "SELECT REF(alias)..." permet d'attacher un objet d'une table à un autre objet d'une autre table - Code:
-
UPDATE or_voiture x3 SET x3.marque = NULL WHERE x3.immatriculation = '284VF75';
SELECT * FROM or_voiture WHERE immatriculation='284VF75';
UPDATE or_voiture x3 SET x3.marque = ( SELECT REF(x4) FROM or_constructeur x4 WHERE x4.marque = 'peugeot') WHERE x3.immatriculation = '284VF75';
SELECT * FROM or_voiture WHERE immatriculation = '284VF75';
| |
| | | Admin Admin
Nombre de messages : 418 Date d'inscription : 27/09/2005
| Sujet: Re: COURS 3 Dim 4 Déc à 13:01 | |
| Jointures implicite : Grâce à la notation pointée, les jointures implicites sont des jointures entre tables liées par la référence. L'utilisation de celle-ci à la place des clés étrangères évite de composer des jointures entre tables La notation pointée peut s'écrire de la manière suivante : * alias.objetColonne.référence ; * alias.colonneObjet.référence.colonne ; * alias.référence.colonne. Encapsulation des objets : L'encapsulation se traduit par la présence d'une interface composée de méthodes lors de la déclaration du type. Les méthodes permettent ainsi à l'accès des objets des "tables OR" L'encapsulation comprend deux parties : * La partie déclarative de la classe avec la commande CREATE TYPE <nomType> ... <nomMethode (parametre...)> * La partie du corps de la méthode avec la commande CREATE TYPE BODY <nomType> AS Chaque TAD peut comporter des méthodes Celles-ci peuvent être implémentée avec des fonctions ou une procédure. La directive SELF désigne l'objet sur lequel porte la méthode 3 types de méthodes : * MEMBER (méthode membre) * STATIC (méthode statique) * CONSTRUCTOR (méthode constructeur) MEMBER : sont invoquées explicitement par un objet du type (SELF) => au niveau des objets ligne (méthode d'instance) STATIC : sont invoquées par le type => impossible d'utiliser le paramètre SELF dans le code d'une méthode de catégorie STATIc (méthode de classe) CONSTRUCTOR : s'appliquent aux objets non persistants et implicitement à tout objet lors de l'instanciation - Code:
-
DROP TABLE or_possede; DROP TABLE or_personne;
CREATE OR REPLACE TYPE ty_personne AS OBJECT ( nom VARCHAR2(20), prenom VARCHAR2(20), datenaissance DATE, adresse ty_adresse, MEMBER FUNCTION nbdePersonne RETURN NUMBER, MEMBER FUNCTION possedeNbVoiture RETURN NUMBER, MEMBER PROCEDURE demenage (nvlAdresse IN ty_adresse), MEMBER PROCEDURE ajouterPersonne (nomPersonne IN VARCHAR2, prenomPersonne IN VARCHAR2, adressePersonne IN ty_adresse), MEMBER PROCEDURE majDateNaissance (nvlDateNaissance IN date) ) /
CREATE TABLE OR_Personne of ty_personne ( CONSTRAINT pk_ORPersonne PRIMARY KEY(nom, prenom));
CREATE TABLE or_possede OF ty_possede ( CONSTRAINT pk_ORPossede PRIMARY KEY (nom, prenom, immatriculation), CONSTRAINT fk_ORPersonne FOREIGN KEY (nom, prenom) REFERENCES OR_Personne, CONSTRAINT fk_ORVoiture FOREIGN KEY (immatriculation) REFERENCES OR_voiture );
- Code:
-
CREATE OR REPLACE TYPE BODY ty_Personne AS MEMBER FUNCTION possedeNbVoiture RETURN NUMBER IS nbVoiture NUMBER; BEGIN SELECT COUNT(x2.immatriculation) INTO nbVoiture FROM or_possede x2 WHERE x2.nom = SELF.nom; DBMS_OUTPUT.PUT_LINE('NB voiture(s):'||nbVoiture); RETURN (nbVoiture); END possedeNbVoiture;
MEMBER PROCEDURE demenage (nvlAdresse IN ty_adresse) IS BEGIN UPDATE or_Personne SET adresse = nvlAdresse WHERE nom = SELF.nom AND prenom = SELF.prenom; END demenage;
MEMBER FUNCTION nbdePersonne RETURN NUMBER IS totalPersonne NUMBER; BEGIN SELECT COUNT(*) INTO totalPersonne FROM or_personne; RETURN totalPersonne; END nbdePersonne;
MEMBER PROCEDURE ajouterPersonne (nomPersonne IN VARCHAR2, prenomPersonne IN VARCHAR2, adressePersonne IN ty_adresse) IS BEGIN INSERT INTO or_personne(nom,prenom) VALUES(nomPersonne, prenomPersonne); END ajouterPersonne;
MEMBER PROCEDURE majDateNaissance (nvlDateNaissance IN date) IS BEGIN UPDATE or_Personne SET dateNaissance = nvlDateNaissance WHERE nom = SELF.nom AND prenom = SELF.prenom END majDateNaissance;
END; /
Exemple d'utilisation - Code:
-
INSERT INTO or_personne(nom, prenom,adresse) VALUES('dupond','raymond', ty_adresse('33','rue de marseille', 'bordeaux 33000'));
INSERT INTO or_personne VALUES('dupont','cecile', ty_adresse('35','rue de paris', 'bordeaux 33000'));
INSERT INTO or_personne(prenom,nom,adresse) VALUES('charles','dickens', ty_adresse('33','rue de marseille', 'bordeaux 33000'));
INSERT INTO or_personne(nom,prenom,adresse) VALUES ('amuah','remi', ty_adresse(NULL,NULL,NULL));
SELECT VALUE(x1) FROM or_personne x1;
-- Exemple d'appel des méthodes MEMBER -- Nouvelle Adresse : Appel des la procédure "demenage()"
DECLARE personneAModifier ty_Personne; nouvelleAdresse ty_Adresse; BEGIN SELECT VALUE(x1) INTO personneAModifier FROM or_personne x1 WHERE x1.nom='dupond'; nouvelleAdresse := NEW ty_adresse('1','place gambetta', 'bordeaux 33000'); personneAModifier.demenage(nouvelleAdresse); END; /
SELECT VALUE(x1) FROM or_personne x1;
INSERT INTO or_possede(nom, prenom,immatriculation) VALUES('dupond','raymond','205VF33');
INSERT INTO or_personne VALUES('dupont','cecile','21-APR-81', ty_adresse('35','rue de paris', 'bordeaux 33000'));
INSERT INTO or_possede(nom, prenom,immatriculation) VALUES('dupont','cecile','303VF75');
INSERT INTO or_possede(nom, prenom,immatriculation) VALUES('dickens','charles','284VF75');
SELECT VALUE(x1) FROM or_possede x1;
-- Appel de la procédure "possedeNbVoiture()" -- Nb de voitures DECLARE laPersonneConcernee ty_personne; nbVoiture NUMBER; nomPersonne VARCHAR2(20):='dupond';
BEGIN SELECT VALUE(x1) INTO laPersonneConcernee FROM or_personne x1 WHERE x1.nom = nomPersonne;
nbVoiture := laPersonneConcernee.possedeNbVoiture(); DBMS_OUTPUT.PUT_LINE('dupond a : ' || nbVoiture || 'voiture(s)');
END; /
SELECT VALUE(x1) FROM or_personne x1;
-- Appel de la procédure "majDateNaissance()" -- Nb de voitures DECLARE personneAModifier ty_Personne; -- dateNaissance date:= '25/10/85'; dateNaissance date := TO_DATE('25/10/85','DD/MM/YY'); nomPersonne VARCHAR2(15) := 'dickens'; prenomPersonne VARCHAR2(15) := 'charles';
BEGIN SELECT VALUE(x1) INTO personneAModifier FROM or_personne x1 WHERE x1.nom = nomPersonne AND x1.prenom = prenomPersonne; personneAModifier.majDateNaissance(dateNaissance); END; /
SELECT VALUE(x1) FROM or_personne x1;
SUPPRESION D'UNE METHODE - Code:
-
ALTER TYPE ty_personne DROP MEMBER PROCEDURE ajouterPersonne (nomPersonne IN VARCHAR2, prenomPersonne IN VARCHAR2, adressePersonne IN ty_adresse) CASCADE;
DESC ty_personne
| |
| | | Admin Admin
Nombre de messages : 418 Date d'inscription : 27/09/2005
| Sujet: Re: COURS 3 Dim 4 Déc à 16:54 | |
| | |
| | | Admin Admin
Nombre de messages : 418 Date d'inscription : 27/09/2005
| Sujet: Re: COURS 3 Dim 4 Déc à 17:08 | |
| Les méthodes implémentées - Code:
-
--Affichage des méthodes implémentées SELECT type_name, method_name, method_type, parameters, DECODE(results, 1, 'Function', 'Procedure') methods FROM user_type_methods ORDER BY 5;
--Affichage des méthodes implémentées avec leur paramètres COL method_name FORM A20; COL param_name FORM A20; COL param_type_name FORM A20;
SELECT method_name, method_no, param_name, param_type_name FROM user_method_params ORDER BY 5;
-- Affichage des méthodes implémentées avec leur paramètres de retour
COL methd_name FORM A20 COL param_name FORM A20 COL âram_tye_name FORM A20
SELECT method_name, method_no, result_type_name FROM user_method_results ORDER BY 2;
| |
| | | Admin Admin
Nombre de messages : 418 Date d'inscription : 27/09/2005
| Sujet: Re: COURS 3 Dim 4 Déc à 17:09 | |
| | |
| | | Admin Admin
Nombre de messages : 418 Date d'inscription : 27/09/2005
| Sujet: Re: COURS 3 Dim 4 Déc à 17:16 | |
| TYPE "VARRAY" - Code:
-
CREATE TYPE typ_telephone AS OBJECT (numTel VARCHAR2(20)) /
CREATE TYPE typ_telephones AS VARRAY(3) OF typ_telephone /
CREATE TYPE typ_etudiant AS OBJECT (numEtud NUMBER, nom VARCHAR2(30), telephone typ_telephones) /
CREATE TABLE etudiants OF typ_etudiant (CONSTRAINT pk_Etudiants PRIMARY KEY(numEtud));
DESC typ_telephone DESC typ_telephones DESC typ_etudiant DESC etudiants
INSERT INTO etudiants (numEtud, nom, telephone) VALUES('1','dupond',typ_telephones(typ_telephone('01.46.00.10.20')));
INSERT INTO etudiants (numEtud, nom, telephone) VALUES('2','dupont',typ_telephones( typ_telephone('01.46.00.10.21'), typ_telephone('01.46.00.10.22')) );
INSERT INTO etudiants (numEtud, nom, telephone) VALUES('3','dubony',typ_telephones( typ_telephone('01.46.00.10.23'), typ_telephone('01.46.00.10.24'), typ_telephone('01.46.00.10.25')) );
SELECT VALUE(x1) FROM etudiants x1;
SELECT * FROM etudiants;
--Initialisation du VARRAY à nul & dépassement de la taille du varray
INSERT INTO etudiants (numEtud, nom, telephone) VALUES('4','duvignyy',typ_telephones(typ_telephone(NULL), typ_telephone(NULL), typ_telephone(NULL)) );
INSERT INTO etudiants (numEtud, nom, telephone) VALUES('5','bill',typ_telephones( typ_telephone('01.46.00.10.26'), typ_telephone('01.46.00.10.27'), typ_telephone('01.46.00.10.28'), typ_telephone('01.46.00.10.29')) );
MODIFICATION D'UN VARRAY * Pas de possibilité de manipuler sous SQL un élément d'une collection VARRAY * Obligation d'utiliser le PL/SQL Exemple : - Code:
-
DECLARE tableauTel typ_telephones; BEGIN SELECT telephone INTO tableauTel FROM etudiants WHERE numEtud = 1 FOR UPDATE OF telephone; tableauTel(1).telephone := '05.56.31.00.01'; UPDATE etudiants set telephone = tableauTel WHERE numetud = 1; END; /
| |
| | | Contenu sponsorisé
| Sujet: Re: COURS 3 | |
| |
| | | | COURS 3 | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |
|