Oracle, problème avec une procédure

Bonjour,

Voilà, je dois m’occuper de créer une procédure qui me crée un utilisateur et qui ajoute une langue dans une autre table (pour avoir un listing des langues).
Je dois pouvoir donc tester mes paramètres,avant l’insertion, par rapport à ce qu’il y aurait déjà de contenu dans les tables concernées.

create or replace procedure create_user (
	   nameuser varchar2,
	   lname varchar2,
	   mdp varchar2,
	   langue varchar2
	   ) IS

begin
for rec in (select mot_de_passe,nom,prenom,t2.id_langue,t2.libelle_langue
from table1 t1,table2 t2
where t1.id_langue=t2.id_langue)
loop
if langue=rec.libelle_langue and nameuser<>rec.nom and lname<>rec.prenom and mdp<>rec.mot_de_passe then
insert into table1(id_utilisateur,mot_de_passe,nom,prenom,id_langue)
values(sequence.nextval,mdp,nameuser,lname,rec.id_langue);
elsif langue<>rec.libelle_langue and nameuser<>rec.nom and lname<>rec.prenom and mdp<>rec.mot_de_passe then
insert into table2(id_langue,libelle_langue)
values(seq_lang.nextval,langue);
insert into table1(id_utilisateur,mot_de_passe,nom,prenom,id_langue) 
values(sequence.nextval,mdp,nameuser,lname,seq_lang.currval);
end if;
exit;
end loop;
commit;
end;

Le fait est que pour une langue existante, tout se passe bien en ne mettant à jour que la table voulue.
Mais, dès lors qu’il ajoute une nouvelle langue pour un utilisateur, il insérera 2 fois la même langue pour ce même utilisateur(si je l’éxécute 2 fois bsur).
Apparemment, ma condition “if” n’est pas respectée et je ne vois pas trop le pourquoi du comment. Vu qu’ après avoir passé la première condition “comparer une langue entrée à une langue présente”, ma deuxième condition apparaît “langue entrée différente de langue présente”.
Bon je suppose que la manière dont je m’y prends n’est pas la bonne. Si il y a des suggestions, merci d’avance :slight_smile: !

Bonjour,

Je ne connait pas le PL-SQL, mais tu lance tes insert dans une boucle qui sélectionne toute la table, tu risque de créer autant d’élément que le contenu de la table, et si les tables sont vides tu ne crée rien :??:

. Est-ce qu’en PL-SQL tu ne peux pas juste tester l’existence du résultat?

ça seras plus simple (et plus juste) que de boucler sur toute la table.

Merci pour cette piste, je regarde ça et côté condition je ne sais pas trop commeny m’y prendre.
D’une part, si l’utilisateur existe déjà, je ne mets que le champ id_langue à jour, mais si la langue n’existe pas il faut pouvoir insérer et attribuer l’id, puis si l’utilisateur n’existe pas, le créé.
J’aurais : -si utilisateur existe et pas de langue, mettre à jour l’id langue
-si l’utilisateur existe pas et pas langue, insérer ds les 2 tables,
-si l’utilisateur existe pas mais ya langue, insérer et update.

Dans mon bloc pl-sql je peux avoir une requête que j’éxécute, faire mes conditions refaire une requête et faire d’autres conditions ?

ps:je tente de m’améliorer héhé …