IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Bloc anonyme pl/sql


Sujet :

PL/SQL Oracle

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 61
    Points : 28
    Points
    28
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  2. #2
    Membre habitué Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Points : 196
    Points
    196
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
     mon_package.maprocedure(rec.nom,rec.prenom,rec.mdp,client);

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 61
    Points : 28
    Points
    28
    Par défaut
    Là voilà !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

  4. #4
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    cette requete doit ramener plus d'une ligne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 61
    Points : 28
    Points
    28
    Par défaut
    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.

  6. #6
    Membre à l'essai
    Inscrit en
    Août 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 20
    Points : 23
    Points
    23
    Par défaut
    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.

  7. #7
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 61
    Points : 28
    Points
    28
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  9. #9
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    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
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 61
    Points : 28
    Points
    28
    Par défaut
    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.

  11. #11
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    ajoute une trace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  12. #12
    Membre habitué Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Points : 196
    Points
    196
    Par défaut
    En toute logique si une des 2 requêtes suivantes ramène au moins une ligne, tu auras identifié ton problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 61
    Points : 28
    Points
    28
    Par défaut
    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

  14. #14
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    alors
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 61
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par McM Voir le message
    alors
    En effet voilà !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/05/2010, 00h19
  2. probleme avec group by dans un bloc anonyme
    Par lucaazori1988 dans le forum PL/SQL
    Réponses: 2
    Dernier message: 04/05/2010, 14h09
  3. Réponses: 5
    Dernier message: 16/05/2008, 15h34
  4. bloc anonyme PL/PGSQL
    Par moumoune65 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 08/02/2008, 14h02
  5. DIstinct sur un bloc basé PL/SQL Forms9i
    Par maradi dans le forum PL/SQL
    Réponses: 3
    Dernier message: 19/12/2007, 15h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo