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 30/08/2007, 17h18   #1
Invité régulier
 
Inscription : août 2007
Messages : 60
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 60
Points : 9
Points : 9
Par défaut Bloc anonyme pl/sql

Rebjr !

Voilà, je veux donc éxécuter un bloc pl/sql qui me permet d'appeler une procédure qui va inscrire l'utilisateur donnée à un client dans une table et tester s'ils st pas déjà présents dans la table.
J'emploie donc la procédure dans une boucle
Code :
1
2
3
4
5
6
7
8
9
10
 
BEGIN
FOR rec IN (SELECT nom,prenom,mdp FROM table_user
                WHERE NOT EXISTS (SELECT 'x' FROM table_inscrits t2 ,table_clients t3
                                                 WHERE t1.iduser=t2.iduser
                                                 AND t1.idclient=t3.idclient))
LOOP
mon_package.maprocedure(rec.nom,rec.prenom,rec.mdp,client);
END LOOP;
END;
Mais voilà, message d'erreur sur ma procédure "L'extraction exacte ramène plus que le nombre de lignes demandé".
Prtant la requête dans ma procédure fait une comparaison entre mes paramètres (IN) avec les données de mes tables, et fais l'insertion qd c'est le cas, donc ne renvoie qu'une seule ligne qd il y a correspondance car une seule ligne par utilisateur inscrit à un client donné.

Où pourrais-je me tromper ?
aldente est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2007, 17h32   #2
Membre actif
 
Avatar de Loyd1974
 
Inscription : août 2007
Messages : 176
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 176
Points : 172
Points : 172
L'erreur doit provenir peut-être de ta procédure, parce que là, d'un rapide coup d'oeil, je ne vois pas ce qui cloche.

Pourrais-tu donner plus de détail sur l'algo de ta procédure ?

Edit: Je parle bien sûr de la procédure que tu as représenté par :

Code :
 mon_package.maprocedure(rec.nom,rec.prenom,rec.mdp,client);
Loyd1974 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2007, 17h46   #3
Invité régulier
 
Inscription : août 2007
Messages : 60
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 60
Points : 9
Points : 9
Là voilà !

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
 
PROCEDURE ma_proc(name,fname,mdpwd,client)
--variables
BEGIN
--test client&utilisateur existent
SELECT id_utl,nom,prenom,mdp,id_cli,nomcli INTO iduser,idcli...
   FROM table_user,table_clients
   WHERE name=nom
   AND   fname=prenom
   AND   mdpwd=mdp
   AND  client=nom_client;         <---modification le 30/08 à 20h56
--test si utilisateur inscrit
SELECT actif INTO a 
FROM table_inscrit
 WHERE id_cli=idcli
 AND id_utl=iduser
  IF a=0 THen
   raise
  end IF;
EXCEPTION
 when no_data_found then
    IF iduser IS NULL THEN
      raise..
    else
      INSERT...
   end IF;
END;
aldente est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2007, 17h47   #4
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
cette requete doit ramener plus d'une ligne.
Code :
1
2
3
4
5
6
SELECT id_utl,nom,prenom,mdp,id_cli,nomcli 
INTO iduser,idcli...
   FROM table_user,table_inscrit,table_clients
   WHERE name=nom
   AND   fname=prenom
   AND   mdpwd=mdp
ou
Code :
1
2
3
4
SELECT actif INTO a 
FROM table_inscrit
 WHERE id_cli=idcli
 AND id_utl=iduser
Tu peux gérer le WHEN TOO_MANY_ROWS
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2007, 17h51   #5
Invité régulier
 
Inscription : août 2007
Messages : 60
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 60
Points : 9
Points : 9
Le fait est qu'elle va comparer ma chaîne de caractère et récupérer l'id de l'utilisateur et du client concerné. Comment se pourrait-il qu'il renvoie plus d'une ligne vu qu'il n'y a qu'une inscription possible ? étant donné qu'un utilisateur ne peut pas être membre plus d'une fois à un même client.

edit:non j'ai bien vérifié. qd je rentre les bons paramètres, mes ids concernés sur la première requête sont prises, puis dans la 2eme je fais une comparaison avec ces premiers pour gérer s'ils sont déjà inscrits. J'ai bien une ligne de retournée.
aldente est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2007, 18h02   #6
Membre à l'essai
 
Inscription : août 2007
Messages : 20
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 20
Points : 20
Points : 20
Bonjour,

Tu pourrais pour trouver d'où vient ton erreur ajouter une variable number
'numinst' et lui affecter des valeurs incrémentée avant et après chacun de tes select puis gérer l'exception TOO_MANY_ROWS et retourner en paramètre OUT de ta procédure le numéro d'instruction et pourquoi pas le concaténer avec le name et le client afin d'identifier quel enregistrement te pose problème.
Phil_67 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2007, 18h17   #7
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
Code :
1
2
3
4
5
6
select id_utl,nom,prenom,mdp,id_cli,nomcli 
INTO iduser,idcli...
   from table_user,table_inscrit,table_clients
   where name=nom
   and   fname=prenom
   and   mdpwd=mdp
1 : met des alias.
2 : Où sont les jointures avec ces tables table_inscrit,table_clients
3 : Attention aux paramètres du même nom qu'une colonne (pour éviter ça toujours avoir un nommage particulier pour les paramètres genre p_nomparam
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2007, 20h56   #8
Invité régulier
 
Inscription : août 2007
Messages : 60
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 60
Points : 9
Points : 9
Oula la grosse bêtise ça se voit que j'étais fatigué :p.
Pour cette requête,McM, voici sa correction, la table table_inscrit n'y est pas je ne l'utilise pas dans la première requête, uniquement dans la 2eme.
Pour les alias, vu que je ne récupère qu'un champ(enfin 2 j'oublie le nom ^^) de la table_client je n'ai pas jugé nécessaire de le mettre.
Code :
1
2
3
4
5
6
7
8
 
SELECT id_utl,nom,prenom,mdp,id_cli,nomcli 
INTO iduser,idcli...
   FROM table_user,table_clients
   WHERE name=nom
   AND   fname=prenom
   AND   mdpwd=mdp
   AND   client=nom_client
Voilou, Phil jte dis ça demain .
Merci de votre attention.
aldente est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2007, 09h40   #9
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
Table_client: le champ nom_client(qui n'est pas la pk qui doit être idclient) est-il unique ?
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2007, 09h44   #10
Invité régulier
 
Inscription : août 2007
Messages : 60
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 60
Points : 9
Points : 9
Oui il est unique.
Je ne comprends pas que l'extraction puisse tjs rammener plus de ligne.
Vu que ma première requête fait une comparaison entre les paramètres rentrés et ce qui est présent dans la table, et ma 2ème requête qui va bien vérifier avec les clauses where, les id sélectionnés par la première requête.
aldente est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2007, 09h49   #11
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
ajoute une trace
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
PROCEDURE ma_proc(name,fname,mdpwd,client)
--variables
BEGIN
--test client&utilisateur existent
SELECT id_utl,nom,prenom,mdp,id_cli,nomcli INTO iduser,idcli...
   FROM table_user,table_clients
   WHERE name=nom
   AND   fname=prenom
   AND   mdpwd=mdp
   AND  client=nom_client;         <---modification le 30/08 à 20h56
--test si utilisateur inscrit
SELECT actif INTO a 
FROM table_inscrit
 WHERE id_cli=idcli
 AND id_utl=iduser
  IF a=0 THen
   raise
  end IF;
EXCEPTION
 when no_data_found then
    IF iduser IS NULL THEN
      raise..
    else
      INSERT...
   end IF;
WHEN TOO_MANY_ROWS
THEN
 DBMS_OUTPUT.PUT_LINE('Toomany ' || name ||' '||fname ||' '||mdpwd ||' '||client);
END;
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2007, 09h53   #12
Membre actif
 
Avatar de Loyd1974
 
Inscription : août 2007
Messages : 176
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 176
Points : 172
Points : 172
En toute logique si une des 2 requêtes suivantes ramène au moins une ligne, tu auras identifié ton problème

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
-- recherche de doublon dans la première partie
   SELECT nom, prenom, mdpwd, client, count(*)
   FROM table_user,table_clients
   GROUP BY nom, prenom, mdpwd, client
   HAVING count(*) > 1;
 
-- recherche de doublon dans la 2nd partie
   SELECT id_cli, id_utl, count(*)
   FROM table_inscrit
   GROUP BY id_cli, id_utl
   HAVING count(*) > 1;
Sinon, cela veut dire que ton erreur ne provient pas de là.

La dernière fois que j'ai eu ce genre de mésaventure, c'était la faute d'un trigger : regarde si tu n'as pas un trigger BEFORE INSERT dans ta table cible, et si oui, vérifie qu'il n'y ait pas de loup à l'intérieur
Loyd1974 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2007, 10h08   #13
Invité régulier
 
Inscription : août 2007
Messages : 60
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 60
Points : 9
Points : 9
He bien merci à vous 2 pour ces solutions .

Dans un premier temps, j'ai testé ta première requête, et effectivement j'avais un doublon (incroyable lol).-->donc merci Loyd1974
Puis dans un deuxième temps, la gestion du "too_many_rows", a pu m'afficher le doublon concerné et l'insertion s'est bien passée-->donc merci McM.

Sympa pour le coup de main
aldente est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2007, 10h23   #14
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
alors
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2007, 10h24   #15
Invité régulier
 
Inscription : août 2007
Messages : 60
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 60
Points : 9
Points : 9
Citation:
Envoyé par McM Voir le message
alors
En effet voilà !
aldente 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 23h47.


 
 
 
 
Partenaires

Hébergement Web