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

  1. #1
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juillet 2012
    Messages : 58
    Points : 24
    Points
    24
    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 éminent sénior 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
    Points : 11 252
    Points
    11 252
    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 à l'essai
    Femme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juillet 2012
    Messages : 58
    Points : 24
    Points
    24
    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 chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    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 à l'essai
    Femme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juillet 2012
    Messages : 58
    Points : 24
    Points
    24
    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 expérimenté 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 : 50
    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
    Points : 1 597
    Points
    1 597
    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

  7. #7
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juillet 2012
    Messages : 58
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par ojo77 Voir le message
    voire mieux, monter le fichier CSV en table externe et faire le merge avec la table externe
    c'est ce que je voulais faire au début mais mon tuteur m'a dit que c'était trop compliqué, du coup je me suis rabattue sur cette solution, mais au final je bloque aussi!!! donc, à ce que je vois mon problème est trop compliqué pour avoir une solution simple...

  8. #8
    Membre expérimenté 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 : 50
    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
    Points : 1 597
    Points
    1 597
    Par défaut
    A moins que votre table externe ne contienne des champs vraiment complexes la procédure est assez simple (et assez proche de la procédure d'import SQL Loader dont elle reprnd la syntaxe sur bien des points )

    Un tutoriel au bout de ce liens : http://oracle.developpez.com/guide/a...age=Chap1#L1.5

  9. #9
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juillet 2012
    Messages : 58
    Points : 24
    Points
    24
    Par défaut
    Merci pour vos réponse mais j'ai trouvé!!
    Je met mon code si jamais quelqu'un d'autre se trouve dans la même galère!!!
    Après avoir mis le code précédent avec ma construction de tableau
    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
    $ligneTableau= count($donneesCSV);//nombre de lignes contenues dans le tableau 
     
    	//Apres avoir rempli mon tableau, faut lancer la comparaison avec la table de la base de donées oracle via merge
    	for($a=0;$a<$ligneTableau;$a++)
    	{
     
    		$sqlMerge= "MERGE INTO $NOMTABLE  USING dual ON (NUMTICKET = '".$donneesCSV[$a]['NUMTICKET_CSV']."')
    		WHEN MATCHED THEN UPDATE SET MONTANT = '".$donneesCSV[$a]['MONTANT_CSV']."', TYPEACHAT='".$donneesCSV[$a]['TYPEACHAT_CSV']."',DATEHEURETIC=TO_DATE('".$donneesCSV[$a]['DATEHEURETIC_CSV']."', 'SYYYY-MM-DD HH24:MI:SS')
    		WHEN NOT MATCHED THEN INSERT (NUMTICKET, MONTANT, TYPEACHAT,DATEHEURETIC) VALUES ('".$donneesCSV[$a]['NUMTICKET_CSV']."','".$donneesCSV[$a]['MONTANT_CSV']."','".$donneesCSV[$a]['TYPEACHAT_CSV']."',TO_DATE('".$donneesCSV[$a]['DATEHEURETIC_CSV']."', 'SYYYY-MM-DD HH24:MI:SS'))";
     
    		$resultatMerge = $db->query($sqlMerge);
     
    	}
     
    	fclose($handle); //ferme le fichier csv
    Voilà, en epérant que ça serve à quelqu'un!!!!

  10. #10
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Citation Envoyé par flokent7 Voir le message
    Merci pour vos réponse mais j'ai trouvé!!
    Je met mon code si jamais quelqu'un d'autre se trouve dans la même galère!!!
    Si quelqu'un d'autre est dans la même galère, c'est un parfait exemple de ce qu'il ne faut pas faire !

  11. #11
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juillet 2012
    Messages : 58
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Si quelqu'un d'autre est dans la même galère, c'est un parfait exemple de ce qu'il ne faut pas faire !
    Pourquoi? Je ne comprend pas!!

  12. #12
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Les réponses et la bonne manière de faire vous ont déjà été données :
    Citation Envoyé par mnitu Voir le message
    A noter que ça reste un traitement ligne à ligne donc "lent"!
    Citation Envoyé par Rei Ichido Voir le message
    Pourquoi ne pas passer par une table de travail, et faire un merge propre ensuite ?
    Citation Envoyé par ojo77 Voir le message
    voire mieux, monter le fichier CSV en table externe et faire le merge avec la table externe

  13. #13
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juillet 2012
    Messages : 58
    Points : 24
    Points
    24
    Par défaut
    D'accord, mais comme je l'ai dis précédemment, je ne code pas toute seule, je suis les directives de mon tuteur, qui n'allaient pas dans le même sens que les réponses apportées sur le forum... s'il y a d'autres personnes qui ne peuvent prendre vos solutions pour différentes raisons, celle la fonctionne...
    Voilà, je vous remercie encore une fois de l'aide que vous m'avez apportée et à bientôt sur le forum!

+ 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, 17h48
  2. Réponses: 3
    Dernier message: 18/11/2006, 21h21
  3. Evènement pour chaque enregistrement
    Par krfa1 dans le forum Access
    Réponses: 5
    Dernier message: 07/03/2006, 14h41
  4. Réponses: 11
    Dernier message: 01/03/2006, 11h32
  5. Réponses: 1
    Dernier message: 08/12/2005, 21h58

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