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

SQL Procédural MySQL Discussion :

Procédure stockée, copie d'enregistrement d'une table vers une autre


Sujet :

SQL Procédural MySQL

  1. #1
    Membre du Club Avatar de sarah65536
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2006
    Messages : 93
    Points : 59
    Points
    59
    Par défaut Procédure stockée, copie d'enregistrement d'une table vers une autre
    Bonjour, j'ai une table avec une liste de clients et une autre avec les utilisateurs d'un site.

    table utilisateur :
    - id // l'id dans la table
    - Nom
    - Prénom
    - Code postal
    - Code profil
    - Code C
    - login
    - mot de passe
    - id client // id provenant de la table client (id client)
    - [...]

    table client :
    - id // id de la table
    - type client // e (entreprise) ou p (particulier)
    - nom
    - prénom
    - code postal
    - code C
    - id client // id venant d'une autre bdd (id client de la table utilisateur)
    -[...]
    Je dois copier dans la table des utilisateurs les nouveaux clients particuliers (type client). Le test se fait avec le nom, le prenom, le code postal et le code c
    ( il ne se fait pas avec l'id car ainsi je peux supprimer certains doublons de la table client)

    Lors de la copie, je dois également générer le login et le mot de passe. Ils seront de la forme :
    - login = <id client>'-'<première partie code c>'-log'
    exemple : 152-ard45-log
    - mdp = <2 premiers caractères du nom><jour,heure,minutes demande au format JJHHMM><2 caractères aléatoires>
    exemple : ah150957ij
    Comment puis-je faire ?

    PS : mes connaissance en SQL sont assez limités. jusqu'a présent je n'ai effectué que des opérations simples.

  2. #2
    Membre du Club Avatar de sarah65536
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2006
    Messages : 93
    Points : 59
    Points
    59
    Par défaut
    Voila la methode utilisée :

    1 - requete qui affiche la liste des utilisateurs
    2 - requete qui affiche les client qui existent deja dans la table des utilisateurs
    3 - requete qui n'affiche pas les client qui existent deja dans la table des utilisateurs
    4 - ajout de la generation des login e mot de passe
    5 - insert dans la table utilisateur.

    Actuellement, j'ai fais les étapes 1 et 2 et je bloque sur la 3 :

    1 - select
    upper(utilisateur.NOM) as nom,
    upper(utilisateur.PRENOM) as prenom,
    utilisateur.CODE_POSTAL,
    utilisateur.CO_C
    from
    utilisateur
    where
    co_profil="clien"
    2 - select
    upper(client.NOM) as nom,
    upper(client.PRENOM) as prenom,
    client.CODE_POSTAL,
    client.CO_C
    from
    client,
    (
    select
    upper(utilisateur.NOM) as nom,
    upper(utilisateur.PRENOM) as prenom,
    utilisateur.CODE_POSTAL,
    utilisateur.CO_C
    from
    utilisateur
    where
    co_profil="clien"
    )ut
    where
    client.nom = ut.nom and
    client.prenom =ut.prenom and
    client.CODE_POSTAL=ut.CODE_POSTAL and
    client.CO_C =ut.CO_C
    3 - select
    upper(client.NOM) as nom,
    upper(client.PRENOM) as prenom,
    client.CODE_POSTAL,
    client.CO_C
    from
    client,
    (
    select
    upper(utilisateur.NOM) as nom,
    upper(utilisateur.PRENOM) as prenom,
    utilisateur.CODE_POSTAL,
    utilisateur.CO_C
    from
    utilisateur
    where
    co_profil="clien"
    )ut
    where
    client.nom <> ut.nom and
    client.prenom
    <>ut.prenom and
    client.CODE_POSTAL
    <>ut.CODE_POSTAL and
    client.CO_C <>ut.CO_C
    Ici, my sql effectue un produit cartésien. Je ne sais pas comment l'enlever.


    Pour faire mes tests, j'utlise 5 enregistrements.

    utilisateur :
    - enregistrement a
    - enregistrement e

    client :
    - enregistrement a
    - enregistrement b
    - enregistrement c
    - enregistrement d

    actuellement, la requete me donne :
    a
    b
    b
    c
    c
    d
    d

    Je n'arrive pas à me débarrasser des doublons.

  3. #3
    Membre du Club Avatar de sarah65536
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2006
    Messages : 93
    Points : 59
    Points
    59
    Par défaut
    Petit à petit, l'oiseau fait son nid.

    A force de recherche et de réflexion, j'ai réussis à avancer et à "chopper" la migraine
    j'en suis maintenant à l'étape 4, qui est presque terminée :

    Voila l'étape 3 : Je suis repartit de l'étape 2 :
    3 -
    select
    NOM,
    PRENOM,
    CODE_POSTAL,
    CO_C

    from
    client
    where
    client.ID not in (
    select
    client.ID
    from
    client,
    (
    select
    upper(utilisateur.NOM) as nom,
    upper(utilisateur.PRENOM) as prenom,
    utilisateur.CODE_POSTAL,
    utilisateur.CO_C
    from
    utilisateur
    where
    co_profil="clien"
    )ut
    where
    client.nom = ut.nom and
    client.prenom =ut.prenom and
    client.CODE_POSTAL=ut.CODE_POSTAL and
    client.CO_C =ut.CO_C
    )
    Pour ce qui est de l'étape 4, j'ai assez bien avancé. Il ne me manque que la génération du mot de passe( caractères aléatoires).
    J'envisage de faire une autre procédure stockée qui le renverra. A moins que je puisse le faire directement (?)

    Voila actuellement à quoi ressemble la génération du login et du mot de passe :

    4 - select
    NOM,
    PRENOM,
    CODE_POSTAL,
    CO_C
    ,
    CONCAT(ID_CLIENT,"-",SUBSTRING_INDEX(CO_C, '-',1),"-log") as LOGIN,
    CONCAT (LEFT (NOM, 2),DATE_FORMAT(now(),'%d%H%i'),"**")as MDP,
    from
    client
    where
    client.ID not in (
    select
    client.ID
    from
    client,
    (
    select
    upper(utilisateur.NOM) as nom,
    upper(utilisateur.PRENOM) as prenom,
    utilisateur.CODE_POSTAL,
    utilisateur.CO_C
    from
    utilisateur
    where
    co_profil="clien"
    )ut
    where
    client.nom = ut.nom and
    client.prenom =ut.prenom and
    client.CODE_POSTAL=ut.CODE_POSTAL and
    client.CO_C =ut.CO_C
    )
    Comme vous vous en doutez, là où il y a les étoiles, je dois générer les 2 caractères aléatoires.

  4. #4
    Membre du Club Avatar de sarah65536
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2006
    Messages : 93
    Points : 59
    Points
    59
    Par défaut
    Et voila j'ai réussis ! Une journée de boulot entière mais ca à porté ses fruits :
    voila l'étape 4 :
    4 - select
    NOM,
    PRENOM,
    CODE_POSTAL,
    CO_C
    ,
    CONCAT(ID_CLIENT,"-",SUBSTRING_INDEX(CO_C, '-',1),"-log") as LOGIN,
    CONCAT (LEFT (NOM, 2),DATE_FORMAT(now(),'%d%H%i'),CHAR (ROUND((RAND()* 65),0)+65),CHAR (ROUND((RAND()* 65),0)+65))as MDP,
    from
    client
    where
    client.ID not in (
    select
    client.ID
    from
    client,
    (
    select
    upper(utilisateur.NOM) as nom,
    upper(utilisateur.PRENOM) as prenom,
    utilisateur.CODE_POSTAL,
    utilisateur.CO_C
    from
    utilisateur
    where
    co_profil="clien"
    )ut
    where
    client.nom = ut.nom and
    client.prenom =ut.prenom and
    client.CODE_POSTAL=ut.CODE_POSTAL and
    client.CO_C =ut.CO_C
    )
    Et l'étape 5 qui n'était pas la plus compliquée :

    5 - insert into
    utilisateur (
    NOM,
    PRENOM,
    CODE_POSTAL,
    CO_C,
    LOGIN,
    MDP)

    select

    NOM,
    PRENOM,
    CODE_POSTAL,
    CO_C
    ,
    CONCAT(ID_CLIENT,"-",SUBSTRING_INDEX(CO_C, '-',1),"-log") as LOGIN,
    CONCAT (LEFT (NOM, 2),DATE_FORMAT(now(),'%d%H%i'),CHAR (ROUND((RAND()* 65),0)+65),CHAR (ROUND((RAND()* 65),0)+65))as MDP,
    from
    client
    where
    client.ID not in (
    select
    client.ID
    from
    client,
    (
    select
    upper(utilisateur.NOM) as nom,
    upper(utilisateur.PRENOM) as prenom,
    utilisateur.CODE_POSTAL,
    utilisateur.CO_C
    from
    utilisateur
    where
    co_profil="clien"
    )ut
    where
    client.nom = ut.nom and
    client.prenom =ut.prenom and
    client.CODE_POSTAL=ut.CODE_POSTAL and
    client.CO_C =ut.CO_C
    )

    Je laisse tout le code, et la méthode utilisée, cela peut servir à quelqu'un. Si vous avez des questions, n'hésitez pas à les poser.

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

Discussions similaires

  1. copier une table d'une BDD dans une table d'une autre BDD
    Par faniette dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/05/2013, 10h17
  2. Réponses: 1
    Dernier message: 19/10/2011, 12h13
  3. Réponses: 7
    Dernier message: 25/03/2011, 10h52
  4. Copier les enregistrements d'une table vers une table d'une autre DB
    Par karinette21 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 18/11/2008, 21h50
  5. [VB.NET] Copie d'une table d'une DB vers une autre
    Par SergeF dans le forum Windows Forms
    Réponses: 9
    Dernier message: 20/11/2004, 09h54

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