Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/01/2012, 15h22   #1
Futur Membre du Club
 
Inscription : octobre 2008
Messages : 70
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 70
Points : 18
Points : 18
Par défaut Objet : Héritage et type énuméré

Bonjour et bonne année ,

J'ai réalisé des requêtes objets avec PostgresSQL et je me demande si c'est possible de faire la même chose avec Oracle.

J'ai une table d'employés emp dont voici la structure :

Code sql :
1
2
3
4
5
6
7
8
9
10
CREATE TABLE emp (
empno integer NOT NULL,
ename varchar(15),
job varchar(15),
mgr integer,
hiredate date,
sal integer,
comm integer,
deptno integer NOT NULL,
PRIMARY KEY (empno)) ;

J'ai une table de médecins med qui hérite de la table emp. Voici la structure :
Code sql :
CREATE TABLE med (level level) INHERITS (emp);
La colonne level sert à préciser le niveau du médecin. Voici la définition du type :
Code sql :
CREATE TYPE level AS ENUM ('intern','doctor','specialist');

Maintenant voici mes deux questions :
- comment créer le type level en Oracle ? Je précise qu'une requête de type select * from med where level>'intern' doit me retourner les médecins dont le niveau est doctor ou specialist
- comment faire l'héritage entre les tables employés et médecins ? Est-ce considéré comme des tables ? Des objets ?

Merci d'avance pour votre aide,

Romain
rom117 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2012, 16h58   #2
Futur Membre du Club
 
Inscription : octobre 2008
Messages : 70
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 70
Points : 18
Points : 18
Par défaut Essais dans Oracle

Re bonjour,

Voici ce que j'ai fait dans Oracle :
Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE emplevel(
  name VARCHAR2(10) CHECK( name IN ('intern','doctor','specialist') )
);
 
CREATE OR REPLACE
TYPE emp AS OBJECT (
	empno NUMBER(4)
) ;
 
CREATE OR REPLACE
TYPE med AS OBJECT UNDER emp (
	levelOfEmployee emplevel
)

Ma table emplevel est bien créée mais je ne pense pas que ce soit la solution à mon problème. Cependant j'ai vu sur d'autres forums que c'était une manière de créer le type énuméré avec Oracle.
Mon type emp est bien créé pas de problème.
Par contre mon type med est créé avec des erreurs. Apparemment Oracle n'aime pas le "under" et mon type "emplevel".

Encore merci par avance,

Romain
rom117 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2012, 23h27   #3
Nouveau Membre du Club
 
Homme
Développeur informatique
Inscription : novembre 2009
Messages : 40
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : novembre 2009
Messages : 40
Points : 34
Points : 34
Citation:
Envoyé par rom117 Voir le message

Maintenant voici mes deux questions :
- comment créer le type level en Oracle ? Je précise qu'une requête de type select * from med where level>'intern' doit me retourner les médecins dont le niveau est doctor ou specialist
- comment faire l'héritage entre les tables employés et médecins ? Est-ce considéré comme des tables ? Des objets ?

Romain


Là j'ai vraiment pas trop compris ce que tu voulais faire, tu as l'aire bien confondu les types d'oracle et les tables, y a bien une différence entre oracle et postgres !!
Apparemment tu veux faire héritage avec Oracle Objet, alors après ce que j'ai compris tu veux faire un multiple héritage d'employe, medecin et différent type de medecin.
Alors, sous Oracle tu crée ta table en suite tu crées ta table, si tu veux la code ca serait à peu près un truc comme:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 
 
--Employes
CREATE type emp AS object(
empno integer,
ename varchar(15),
job varchar(15),
mgr integer,
hiredate date,
sal integer,
comm integer,
deptno integer
);
 
 
--Heritage d'employe
CREATE type medecinInterne under emp(
attributs varchar2(255)
);
 
CREATE type medecinDocteur under emp(
attributs varchar2(255)
);
 
CREATE type medecinspecialist under emp(
attributs varchar2(255)
);
 
 
--Création de table.
 
CREATE TABLE emp_table of emp(
constraint pk_Emp_ID PRIMARY KEY(empno)
);

Là on crée une seule table pour tous types d'héritage. Si tu veux insérer maintenant un médecin docteur, tu dois préciser son type:

insert into emp_table values(
medecinDocteur(
'empno',
'ename',
'job',
'mgr',
'hiredate',
'sal',
'comm',
'deptno'
'medecin docteur'
)
);


voila, arpès c'est un peu plus compliquer car tu vas te amuser avec des ref, treat, is of ...

bon courage
jamboo est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/01/2012, 15h08   #4
Futur Membre du Club
 
Inscription : octobre 2008
Messages : 70
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 70
Points : 18
Points : 18
Bonjour,

Merci pour le code jamboo, c'est beaucoup plus clair maintenant. Je m'aperçois maintenant que PostgreSQL et Oracle ont des approches bien différentes.
Une dernière chose : est-ce possible de gérer ce genre de requêtes (possible avec PostgreSQL) :
Code sql :
SELECT * FROM med WHERE level>'intern'
Dans cette requête je veux sélectionner tous les médecins de niveau supérieur à interne (stagiaire). J'aurais donc tous les médecins généraux et les spécialistes.

Merci d'avance,

Romain
rom117 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 17h18   #5
Nouveau Membre du Club
 
Homme
Développeur informatique
Inscription : novembre 2009
Messages : 40
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : novembre 2009
Messages : 40
Points : 34
Points : 34
Citation:
Envoyé par rom117 Voir le message
Bonjour,


Code sql :
SELECT * FROM med WHERE level>'intern'

Dans cette requête je veux sélectionner tous les médecins de niveau supérieur à interne (stagiaire). J'aurais donc tous les médecins généraux et les spécialistes.
Je ne sais pas utiliser les types énumérative mais dans le code que je t'ai écrit, si tu veux avoir tous les médecins sauf les interns t'écrit plutôt:

Code :
1
2
 
SELECT * FROM emp e WHERE value(e) IS of(medecinDocteur, medecinspecialist);
Ici tu retire tous les employes qui sont de type medecinspecialist ou medecinDocteur.

Ca peu paraitre un peu compliqué pour le début c'est normal. Tiens y a des cours d'Oracle Objet ca peut t'aider ,)

http://ufrsciencestech.u-bourgogne.f...Multimedia/CM/
jamboo est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/01/2012, 19h41   #6
Futur Membre du Club
 
Inscription : octobre 2008
Messages : 70
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 70
Points : 18
Points : 18
Par défaut Résolu !

Citation:
Envoyé par jamboo
Code sql :
SELECT * FROM emp e WHERE value(e) IS of(medecinDocteur, medecinspecialist);
Ah ben oui, c'était pas si compliqué finalement .
Ce qui confirme ce que je disais : pour faire la même chose, on utilise des notions (et syntaxes) différentes entre Oracle, PostgreSQL et sans doutes les autres SGBD.

Et merci pour les cours, je m'en sers déjà .

Résolu !

Bonne soirée, merci encore,

Romain
rom117 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h35.


 
 
 
 
Partenaires

Hébergement Web