Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
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 29/01/2008, 17h33   #1
Invité de passage
 
Inscription : juillet 2003
Messages : 8
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 8
Points : 1
Points : 1
Par défaut [Debutant] procedure PL/SQL association de donnees de plusieurs tables

Bonjour à tous!

Le décor:
je récupère des données contenant un index de lieu (ID_LIEUX) que je mets dans une table: TABLE1
Je dispose d'une table :TABLE2, contenant les ID (ID_LIEUX) et les libellés des lieux (LIB_LIEUX)

Je voudrais faire une procédure me permettant d'aller chercher les libellés de lieux de la table 2 pour les écrire à la place des libellés de lieu de la table 1 pour chaque enregistrement...

Je ne sais pas comment m'y prendre...
Je vois en VB mais le SQL c'est tout nouveau pour moi...Pourriez vous m'aiguiller?
Jagga est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2008, 18h34   #2
Membre Expert
 
Avatar de scheu
 
Inscription : juin 2007
Messages : 1 497
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 1 497
Points : 1 483
Points : 1 483
Il y a un tutoriel PL/SQL très bien fait sur ce site : http://sheikyerbouti.developpez.com/pl_sql/
scheu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2008, 18h36   #3
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
Un simple update devrait suffir non ?
Code :
1
2
UPDATE table1 SET libelle_lieux = (SELECT lib_lieux FROM table2 WHERE id_lieux = table1.id_lieux)
WHERE EXISTS (SELECT NULL FROM table2 WHERE id_lieux = table1.id_lieux)
La clause where est pour éviter de mettre à null des libellés de lieux présent dans la table1 et pas dans la table2.
__________________
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 30/01/2008, 15h25   #4
Invité de passage
 
Inscription : juillet 2003
Messages : 8
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 8
Points : 1
Points : 1
Tout d'abords, merci pour ta réponse Plainer

En fait, un simple update suffit mais c'est le fait de le passer sur chaque enregistrement de la table 1...
Je pourrai passer par une boucle mais je ne sais pas comment en sortir...
Dois je utiliser un curseur?


PS (scheu): Merci pour le tuto mais si je pose ma question ici c'est que je n'ai pas trouvé ou pas compris la réponse à ma question
Jagga est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2008, 16h52   #5
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
Citation:
Envoyé par Jagga Voir le message
En fait, un simple update suffit mais c'est le fait de le passer sur chaque enregistrement de la table 1...
Peux-tu préciser, je ne comprends pas ?
__________________
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 31/01/2008, 15h11   #6
Invité de passage
 
Inscription : juillet 2003
Messages : 8
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 8
Points : 1
Points : 1
Citation:
Peux-tu préciser, je ne comprends pas ?
Désolé c'est moi qui n'ai pas compris...
Cela marche très bien !

Merci beaucoup!
Jagga est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2008, 17h27   #7
Invité de passage
 
Inscription : juillet 2003
Messages : 8
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 8
Points : 1
Points : 1
Désolé mais comme je bosse sur d'autres projets, celui-ci est un peu réalisé en pointillés...et j'ai du mal à suivre...
Bref j'ai toujours un problème.

Cela marche très bien mais j'ai homis certaines données importantes.
Effectivement, la table 2 contient des dates et des heures de modifications...
Je peux donc avoir plusieurs enregistrements de même ID_Lieux mais de lieux et de date /heure différentes.
ex:
Citation:
| ID_LIEU | LIEU | DATE | HEURE |
1 | PARIS| 20071114 | 092334 |
2 | LONDRES| 20070910 | 221214 |
1 | MARSEILLES| 20061009 | 100330 |
....
1 | TUNIS| 20080120 | 190336 |

La table 1 contient elle aussi des dates et des heures par enregistrement.
ex:
Citation:
NOM|PRENOM|ID_LIEU|DATE|HEURE|
DURAND | MICHEL | 1 |20071115 | 083432 |
Il faut donc prendre le bon lieu en effectuant un test sur la date et l'heure.
Dans le cadre de mon exemple le lieu est PARIS.

L'avantage est que les dates et heures sont des integers.
C'est un vrai casse tête, pouvez vous me donner une orientation, une piste?
Comment feriez vous?
Jagga est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2008, 11h15   #8
Invité de passage
 
Inscription : juillet 2003
Messages : 8
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 8
Points : 1
Points : 1
J'ai tenté d'inclure des 'AND' dans la condition du WHERE mais cela ne fonctionne pas correctement...

Help me
Jagga est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2008, 23h20   #9
Membre actif
 
Étudiant
Inscription : février 2008
Messages : 224
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2008
Messages : 224
Points : 185
Points : 185
Bonjour,

Pourquoi avoir créé deux colonnes pour la date et l'heure au lieu d'une seule de type DATE ?

Sinon, montre ta requête avec ta fameuse clause AND supplémentaire, ca se trouve il s'agit juste d'une légère erreur
Milo59000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2008, 08h51   #10
Invité de passage
 
Inscription : juillet 2003
Messages : 8
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 8
Points : 1
Points : 1
Citation:
Pourquoi avoir créé deux colonnes pour la date et l'heure au lieu d'une seule de type DATE ?
Tout simplement parce que les données proviennent d'un autre système et que l'import ce fait de cette manière (je ne suis pas maitre d'oeuvre pour l'import... )

Pour les AND cela ne marche pas non pas dans le code mais dans le résultat...
Effectivement, il peut y avoir plus de 3 lieux avec un même ID_Lieux...
Il faut donc utiliser un intervalle...
Jagga est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2008, 12h04   #11
Membre actif
 
Étudiant
Inscription : février 2008
Messages : 224
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2008
Messages : 224
Points : 185
Points : 185
Citation:
Envoyé par Jagga Voir le message

Il faut donc prendre le bon lieu en effectuant un test sur la date et l'heure.
Dans le cadre de mon exemple le lieu est PARIS.
Il y a plusieurs choses que je ne comprend pas... pourquoi dans ta table 2 plusieurs villes ont le même ID_LIEUX ?

Ensuite tu dis pour ton exemple qu'il faut faire le test sur la date et l'heure et que dans ton exemple le lieu est PARIS or la seule chose qui réunit PARIS et MICHEL DURAND c'est ID_LIEUX. Donc je ne vois pas sur quoi tu veux te baser pour faire la mise à jour...

Pourquoi ne pas mettre une contrainte unique ou primary key sur l'ID_LIEUX de la table 2 ?
Milo59000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2008, 17h41   #12
Invité de passage
 
Inscription : juillet 2003
Messages : 8
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 8
Points : 1
Points : 1
Parce que les données sont maquillées mais je dois garder les données telles qu'elles sont... I
ls s'agit d'un historique permettant de faire des recherches à postériori...

Si je garde l'ID et qu'un même ID possède plusieurs valeurs, il faut bien que je travaille sur une autre donnée pour récupérer le bon ID_Lieu, en loccurence la date et l'heure.

J'ai finalement trouver la solution via une fonction...

Merci de votre aide!
Jagga est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2008, 17h43   #13
Membre actif
 
Étudiant
Inscription : février 2008
Messages : 224
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2008
Messages : 224
Points : 185
Points : 185
Ok.

Peux-tu quand même nous mettre ta solution ?
Milo59000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2008, 11h57   #14
Invité de passage
 
Inscription : juillet 2003
Messages : 8
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 8
Points : 1
Points : 1
Citation:
create or replace FUNCTION MAJ_LIB_PAYS
RETURN VARCHAR2 AS
begin
declare
cursor cur_adresse is select enreg_id_pays,xact_date,xact_time,rowid from qui.adresse;
v_lib_pays varchar2(2000);
begin
for rcur_adresse in cur_adresse loop
dbms_output.put_line(
rcur_adresse.enreg_id_pays||'|'||
rcur_adresse.xact_date ||'|'||
lpad(to_char(rcur_adresse.xact_time),6,'0')
);
select *
into v_lib_pays
from (select lib_pays
from qui.pays
where id_pays = rcur_adresse.enreg_id_pays
and modify_date||lpad(to_char(modify_time),6,'0') <= rcur_adresse.xact_date||lpad(to_char(rcur_adresse.xact_time),6,'0')
order by modify_date desc, modify_time desc)
where rownum =1;
update qui.adresse set pays=v_lib_pays where rowid=rcur_adresse.rowid;
end loop;
commit;
end;
RETURN NULL;
END;
Jagga 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 13h03.


 
 
 
 
Partenaires

Hébergement Web