Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour 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 23/06/2008, 18h06   #1
Nouveau Membre du Club
 
Inscription : octobre 2006
Messages : 82
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 82
Points : 39
Points : 39
Par défaut Requêtes imbriquées et récupération du résultat

Bonjour,

Je souhaiterai faire une requête en SQL qui pourrait effectuer un gros traitement en une seule fois, mais je ne sais pas comment c'est faisable.

J'en appelle à vous pour me guider, car je débute seulement en Oracle.


Imaginons que la base que je souhaite remplir est composée de 2 tables :

- table_noms (nom_id [INTEGER auto increment], nom [VARCHAR]) qui contient une liste de noms de personnes
et
- table_telephones (tel_id [INTEGER auto increment], tel_number [VARCHAR], nom_id [INTEGER]) qui contient une liste de numéros de téléphones.

J'ai une clé étrangère sur le champ "nom_id" : un numéro de téléphone est forcement lié à un nom de personne.


Je code un ETL en PHP qui me permet de remplir cette base de données.
J'ai réussi à créer et remplir une table temporaire, qui contient toutes mes infos :
temp_nom_tel (nom [VARCHAR], telephone [VARCHAR]).

Je souhaiterai pouvoir faire de manière la plus optimisée mon chargement de tables.

La première chose que j'ai faite, c'est un script PHP qui fait :
Code :
1
2
3
4
5
6
7
 
pour chaque ligne je j'ai dans "temp_nom_tel"
{
  - je fais un INSERT dans "table_nom" du nom
  - je récupère le "nom_id" qui a été créé
  - je fais un INSERT dans "table_telephones" du telephone et de l'id que j'ai récupéré à l'instant
}
Je fais donc pour chaque ligne 2 requêtes SQL.

Le problème, c'est que quand j'ai 200'000 lignes, ça prend des plombes !!!


Existe-t-il une façon de faire ce traitement avec un minimum de requêtes ?
(quelle est la façon la plus optimisée de faire ce traitement ?)

Je code en PHP en faisant des requêtes PDO, donc je ne sais pas si je peux exécuter des blocs de PL/SQL (sans parler du fait que je ne sais pas faire de scripts PL/SQL).



Mon modèle est en réalité beaucoup plus compliqué que ce que j'ai présenté, c'est pour ça que je ne peux pas tout simplement changer mon modèle
PhunkyBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 11h42   #2
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Chef de projet en SSII
Secteur : Conseil

Informations forums :
Inscription : janvier 2004
Messages : 2 866
Points : 3 448
Points : 3 448
Si ta question est de savoir si tu peux insérer dans deux tables en une seule requête : pas à ma connaissance.

Sinon essaie de repréciser ton problème.
__________________
Un problème sans solution est un problème mal posé

Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 11h55   #3
Nouveau Membre du Club
 
Inscription : octobre 2006
Messages : 82
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 82
Points : 39
Points : 39
Citation:
Envoyé par plaineR Voir le message
Si ta question est de savoir si tu peux insérer dans deux tables en une seule requête : pas à ma connaissance.

Sinon essaie de repréciser ton problème.
C'était effectivement une partie de ma question, merci.


L'autre partie est "comment faire au mieux ?".

Faut-il (peut-on) passer par un script PL/SQL ? Un script PHP ? Une procédure stockée ?


Pour moi, tous les avis sont bons à prendre
PhunkyBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 12h04   #4
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Chef de projet en SSII
Secteur : Conseil

Informations forums :
Inscription : janvier 2004
Messages : 2 866
Points : 3 448
Points : 3 448
Peut-être en faisant deux insert "globaux" :
Code :
1
2
3
4
5
6
7
8
9
INSERT INTO table_noms (...)
SELECT ...
FROM temp_nom_tel
WHERE ...
 
INSERT INTO table_tel (nom_id, .....)
SELECT table_noms.nom_id, ...
FROM temp_nom_tel, table_noms
WHERE <jointure entre les deux tables>
__________________
Un problème sans solution est un problème mal posé

Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 12h18   #5
Nouveau Membre du Club
 
Inscription : octobre 2006
Messages : 82
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 82
Points : 39
Points : 39


J'avais retourné le problème dans tous les sens, et je n'ai jamais envisagé cette solution qui est pourtant simple et logique !

Je te remercie beaucoup
PhunkyBob 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 03h20.


 
 
 
 
Partenaires

Hébergement Web