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

AS/400 Discussion :

Requête sql sous AS400


Sujet :

AS/400

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 25
    Par défaut Requête sql sous AS400
    Bonjour à tous,
    J'ai une requete sql de mise à jour d'un champ dans ma base avec une requete imbriquée.
    Je m'explique:
    J'ai une requete qui permet de renvoyer une valeur au hasard à partir d'un fichier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select * from ikinternet/mdp
    order by rand()
    fetch first 1 rows only
    Cette requete marche bien.

    Je voudrais récupérer cette valeur pour mettre à jour un champ dans un autre fichier, quelque chose de ce style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    update ikinternet/intauto
    set password = (select * from ikinternet/mdp
    order by rand()
    fetch first 1 rows only)
    Cette requete semble marcher correctement quand c'est testé sur phpmyadmin. Mais lorsque c'est testé sur AS400, ça ne marche pas..
    Il me renvoie une erreur précisant que ORDER est mal placé et qu'il attend un ")".

    Je n'y comprends plus rien, avez vous une idée?
    Merci beaucoup d'avance

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Par défaut
    Question. Pourquoi ne fais-tu pas directement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update ikinternet/intauto set password = rand()

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 25
    Par défaut
    J'ai essayé mais les types des colonnes ne sont pas compatibles apparemment..
    En fait dans mon premier fichier j'ai généré une liste de mot de passe et je veux affecter ces mots de passe à mon fichier intauto en les prevelevant au hasard.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Par défaut
    Quel est le type de la zone password ? CHAR ? DEC ? NUM ? etc...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 25
    Par défaut
    du CHAR sur 8 caractères

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Par défaut
    Quelles sont les colonnes qui constituent la table ikinternet/mdp ?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 25
    Par défaut
    ben en fait la table ikinternet/mdp ne possède qu'une seule colonne qui s'appelle iimdp et comme la colonne password elle est de type CHAR sur 8 caractères

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Par défaut
    Alors fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update ikinternet/intauto set password = char(int(rand() * 10000000+0,5))

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 25
    Par défaut
    Mon soucis c'est que password doit comporter du alphanumérique (pour plus de sécurité)
    Avec ta requete je n'obtiens malheureusement que du numérique.
    c'est pour ça que j'ai généré un fichier à part avec une liste de mot de passe à affecter.
    Ce n'est pas très joli comme procédé mais c'est le plus simple que j'ai pu trouver..

    Merci pour votre aide.
    Je suis désespérée

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Par défaut
    Pas de problème, on va résoudre celà. Je pense avoir compris ton prb.
    Avant de te donner une solution quelques questions supplémentaires.
    Ton fichier mdp contient-il autant d'enregistrements que ton fichier intauto ?
    Ou alors tu as une liste de qq mots de passes que tu voudrais affecter au hasard ?

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 25
    Par défaut
    Merci K2R400 de bien vouloir m'aider.

    Alor pour répondre à tes questions.
    Mon fichier mdp contient 10 000 enregistrements.
    et le fichier intauto est variable mais en général ne contient qu'à peu près 100 lignes.
    Sur les 10 000 enregistrements je voudrais en sélectionner 1 au hasard puis de l'affecter à une des lignes de intauto, ce procédé sera répété autant de fois qu'il y a d'enregistrements dans intauto.
    J'espère avoir bien expliqué mon problème

  12. #12
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    update ikinternet/intauto a
    set a.password = ( select iimdp from ikinternet/mdp b
    where rrn(b) = ( INT( RAND(  INT( 100 ) * 10000 ) ) )
    J'essaie ici d'obtenir la valeur entière d'un nombre aléatoire entre 0 et 100 en fonction des 10000 enreg contenus dans la table mdp. Cette valeur entière est comparée au RRN de la table mdp pour récupérer aléatoirement un mot de passe.

    J'ai pas testé, je souhaite que ça marche, mais pas sûr. Faudrait ajouter un CASE pour le cas de la valeur 0.

    M'enfin, c'est l'idée...

  13. #13
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...where rrn(b) >=  INT(decimal(RAND( 10000000 * 100 ), 15, 5) * 10000)
    me semble bien meilleur.

  14. #14
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Par défaut
    Philippe,

    Je pense que dans ta requête, il ne génèra qu'un seul mot de passe, certes aléatoire, mais unique.

    Il est clair que la requête est assez difficile à coder en une seule.
    Par programme, celà est plus facile, sur une ligne de commande SQL c'est plus chaud.

    Je partirai plutôt sur une table temporaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    create table qtemp/tbl1 as(                                        
       select rrn(intauto) Rang,                                      
       int(CEILING(RAND() * ((select count(*) from iimdp)-1) + 0,5)) Alea
    from intauto) with data
    On obtient dans ce fichier temporaire, autant d'enregistrements que dans intauto (environ 100). La première colonne RANG contient le rrn de intauto.
    La seconde colonne ALEA contient un nombre alétoire en 1 et le nombre maximal d'enregistrements de iimp (environ 10000).
    Il ne manque plus qu'à mettre à jour intauto en faisant une jointure du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    update intauto                                           
    set password = (select iimdp from intauto a, mdp b, tbl1  
    where rrn(a) = rang                                       
    and   rrn(b) = alea )
    Pour être certain qu'au premier passage tous les enregs soient misà jour, il faudra faire au prélable un RGZPFM de MDP car les nombres aléatoires générés doivent correspondrent à un RRN.

  15. #15
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Par défaut
    ok (j'ai pas testé mais ça semble correct, j'ai voulu tout faire en une seule requête), mais l'idée de base en fait, c'est bien de s'arranger pour utiliser RAND() de façon à pouvoir le rapprocher du RRN de la table MDP pour faire la MAJ.

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 25
    Par défaut
    Merci à vous 2 de vous pencher sur mon problème.

    Ta requete Mercure semble par contre pas faire d'aléatoire à l'exécution mais lorsque je rafraichis en demandant d'afficher la 1ère ligne mes mots de passe sont alors mélangés.. Par contre il me renvoie prsque 5 000 lignes.

    J'ai essayé tes requetes K2R400. Je n'aurai jamais pu penser à ça toute seule..
    La requete select me renvoie bien 1 aléatoire sur ma table ikinternet/mdp mais le seul hic c'est que lorsque j'essaie de faire la mise à jour avec le update, j'ai l'erreur comme quoi le résultat du select dépasse une ligne.

    Vous avez une idée?

  17. #17
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Par défaut
    Citation Envoyé par tenah34. (Tu n'as pas un vrai prénom ?)
    ... lorsque je rafraichis en demandant d'afficher la 1ère ligne mes mots de passe sont alors mélangés.. Par contre il me renvoie prsque 5 000 lignes.
    STP, colle ici toute la requête telle que tu l'as faite pour que j'y voie plus clair.

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 25
    Par défaut
    Pourquoi tu dis ça?
    (Tu n'as pas un vrai prénom ?)
    ça te convient pas tenah34?
    Ben je me présente, je m'appelle Hanh
    Plus facile pour discuter peut être..

    Voici la requête que tu m'as proposée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    update ikinternet/intauto a 
    set a.password = ( select iimdp from ikinternet/mdp b 
    where rrn(b) >= INT(decimal(RAND( 10000000 * 100), 15, 5) * 10000))
    et là celle de K2R400 telle qu'il m'a proposée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE IKINTERNET/TEMP as (select rrn(intauto) rang,           
    int(ceiling(rand()*((select count(*) from ikinternet/mdp)-1)+0,5)) Alea
    from ikinternet/intauto) with data 
    
    update ikinternet/intauto                                                 
    set password = (select b.iimdp from ikinternet/intauto a, ikinternet/mdp b, ikinternet/temp 
    where rrn(a) = rang                                  
    and rrn(b) = alea )
    Merci infiniment

  19. #19
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Par défaut
    Oups, voici la réponse à ton prb.

    Tu crées une table temporaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE TABLE IKINTERNET/TEMP as (select uSer Cle,           
    int(ceiling(rand()*((select count(*) from ikinternet/mdp)-1)+0,5)) Alea
    from ikinternet/intauto) with data
    La zone User (surement differente dans ton fichier) est une zone représentant une clé unique (le code user par exemple)

    Puis tu fais un update de ton fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    update ikinternet/intauto a                                                 
    set password = (select b.iimdp from ikinternet/mdp b, ikinternet/temp c 
    where a.User = Cle                                  
    and rrn(b) = alea )

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 25
    Par défaut
    Ah c'est super génial!!
    ça marche enfin !
    Tu a droit à toute ma reconnaissance
    Merci merci merci !!

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Requête SQL sous VBA - Between
    Par p'tite Sandrine dans le forum VBA Access
    Réponses: 3
    Dernier message: 16/08/2012, 20h24
  2. limitation de caractére dans une requête SQL sous Acces
    Par amka dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 18/08/2006, 15h15
  3. Réponses: 8
    Dernier message: 11/08/2006, 09h30
  4. requête sql sous access
    Par jadey dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 04/08/2006, 21h20
  5. affichage requête sql sous phppgadmin
    Par kerzut dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 25/02/2005, 12h39

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