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

Oracle Discussion :

Utiliser merge pour chaque enregistrement d'un tableau


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juillet 2012
    Messages : 58
    Par défaut Utiliser merge pour chaque enregistrement d'un tableau
    Bonjour,
    J'ai déjà posté quelques messages à ce sujet, mais comme à chaque fois, je change de stratégie...
    je suis actuellement en stage en entreprise ou mon tuteur m'a demandé de faire un module (via une page web) qui récupérerait un fichier csv , mettrait ses données dans un tableau pour ensuite le compareravec la table de la base de données oracle et faire les insert, update et delete en conséquence...
    J'ouvre, je lis mon fichier csv et je met les données dans un tableau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $handle = fopen($fichier, "r"); // ouvre le fichier csv en lecture seule
    	while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) 
    	{
    	    $num2 = count($data); //nous donne le nombre de champs
     
    	    for ($c=0; $c < $num2; $c++) 
    	    {
    			$donneesCSV[]= array(
    				  'NUMTICKET_CSV'=>''.$data[$c++].'',
    				  'DATEHEURETIC_CSV'=>''.$data[$c++].'',
    				  'MONTANT_CSV'=>''.$data[$c++].'',
    				  'TYPEACHAT_CSV'=>''.$data[$c++].''  );
    }}
    j'utilise merge pour faire des insert ou update:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $sqlMerge= "MERGE INTO TICKET USING dual ON (NUMTICKET = '29')
    			 WHEN MATCHED THEN UPDATE SET MONTANT = '2780', TYPEACHAT='Maurice', DATEHEURETIC=TO_DATE('2012-08-19 15:38:48', 'SYYYY-MM-DD HH24:MI:SS')
    			 WHEN NOT MATCHED THEN INSERT (NUMTICKET, MONTANT, TYPEACHAT, DATEHEURETIC) VALUES ('29', '2780', 'Maurice', TO_DATE('2012-08-19 15:38:48', 'SYYYY-MM-DD HH24:MI:SS'))";
     
    		$resultatMerge = $db->query($sqlMerge);
    sauf que ce que je veux faire c'est utiliser merge pour chaque enregistrement de mon tableau, au lieu de rentrer les données à la main...et là je coince!!! Quelqu'un peut-il m'aider?!!

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Merge Into table 
    Using (Select 'toto', 'tata', to_date(...) from dual)
    ...
    et qui dans ce cas devrait plutôt utiliser les variables de liaison
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Merge Into table 
    Using (Select :bind1, :bind2, to_date(:bind3... from dual)
    ...
    A noter que ça reste un traitement ligne à ligne donc "lent"!

  3. #3
    Membre averti
    Femme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juillet 2012
    Messages : 58
    Par défaut
    oui, je sais que ça risque d'être lent, tu aurais une solution plus rapide?!!
    Et je n'ai pas très bien compris ce que tu me proposais comme code,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Merge INTO TABLE 
    USING (SELECT :bind1, :bind2, to_date(:bind3... FROM dual)
    ...
    ça equivaut à quoi pour mon code?!! C'est peut-être simple, mais je suis un peu à la ramasse là!!! désolée!!!

  4. #4
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Pourquoi ne pas passer par une table de travail, et faire un merge propre ensuite ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    {Initialiser}
    TRUNCATE TABLE TICKET_TEMP
    {à faire dans une boucle}
    INSERT INTO TICKET_TEMP ( colonnes ) VALUES ( :1, :2, :3, :4);
    {...}
    MERGE INTO TICKET USING TICKET_TEMP { ... }

  5. #5
    Membre averti
    Femme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juillet 2012
    Messages : 58
    Par défaut
    je ne sais pas trop, on est arrivé à ce résultat en cherchant des heures et des heures durant, et je n'ai jamais vu la solution que tu me proposes sur les différents sites visités...
    en fait tu voudrais que je mettes les données du fcihier csv dans une table et que je fasse un merge entre ces 2 tables?!

  6. #6
    Membre Expert Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Par défaut
    Citation Envoyé par flokent7 Voir le message
    en fait tu voudrais que je mettes les données du fcihier csv dans une table et que je fasse un merge entre ces 2 tables?!
    voire mieux, monter le fichier CSV en table externe et faire le merge avec la table externe

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

Discussions similaires

  1. [MySQL] Une case à cocher pour chaque enregistrement d'un tableau
    Par batoule80 dans le forum PHP & Base de données
    Réponses: 29
    Dernier message: 28/09/2008, 16h48
  2. Réponses: 3
    Dernier message: 18/11/2006, 20h21
  3. Evènement pour chaque enregistrement
    Par krfa1 dans le forum Access
    Réponses: 5
    Dernier message: 07/03/2006, 13h41
  4. Réponses: 11
    Dernier message: 01/03/2006, 10h32
  5. Réponses: 1
    Dernier message: 08/12/2005, 20h58

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