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

  1. #1
    Nouveau membre du Club
    Inscrit en
    avril 2009
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : avril 2009
    Messages : 44
    Points : 32
    Points
    32

    Par défaut requetes multiple continuer malgré erreur

    Bonjour,

    Voici, mon problème, j'insère un fichier dans une de mes tables avec la commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    COPY CANCER FROM '/path.../file.txt' WITH DELIMITER '|';
    et je rencontre un problème, la première variable de ma table est un VARCHAR, et à une ligne de mon fichier, le champ que je veux saisir pose un problème: "birt-hogg-dub¡§?" , en effet il présente un caractère § ce qui provoque une erreur.

    Donc, j'aimerais savoir si il est possible avec la commande COPY, de dire à psql que même si il y a une erreur à une ligne de passer à la suivante et de me renvoyer l'erreur quelquepart.
    Ou comment faire accepter ce symbole à psql ? quelle type de champs dois-je mettre?

    Merci de votre aide.

    Voici l'erreur :
    ERREUR: séquence d'octets invalide pour l'encodage « UTF8 » : 0xa1
    HINT: Cette erreur peut aussi survenir si la séquence d'octets ne correspond pas
    au jeu de caractères attendu par le serveur, le jeu étant contrôlé par
    « client_encoding ».
    CONTEXT: COPY cancer, ligne 50

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    janvier 2006
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : janvier 2006
    Messages : 388
    Points : 603
    Points
    603

    Par défaut

    bonjour essaye avant ta commande copy :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set client_encoding to 'utf8';

  3. #3
    Nouveau membre du Club
    Inscrit en
    avril 2009
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : avril 2009
    Messages : 44
    Points : 32
    Points
    32

    Par défaut

    ça ne fonctionne pas mais merci quand même

    quelqu'un saurait comment passer à l'insert suivant même si le précédent a échoué? de préférence en utilisant 'COPY'

    EDIT: j'ai résolu mon problème de caractère non-conforme en formattant ma donnée, avant son injection dans la base de donnée, mais certaines lignes continuent de provoquer quelques erreurs (clé dupliquée)

    Passer outre une erreur, je pense que ce n'est pas possible avec COPY mais si vous savez comment faire en utilisant une autre méthode, svp merci de me la faire connaitre.

    Citation Envoyé par PosqgreSQL_doc
    COPY stops operation at the first error. This should not lead to problems in the event of a COPY TO, but the target table will already have received earlier rows in a COPY FROM. These rows will not be visible or accessible, but they still occupy disk space. This may amount to a considerable amount of wasted disk space if the failure happened well into a large copy operation. You may wish to invoke VACUUM to recover the wasted space.

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    janvier 2006
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : janvier 2006
    Messages : 388
    Points : 603
    Points
    603

    Par défaut

    bonjour, il faut pour chaque enregistrement creer une commande sql ,
    et creer un trigger avant insert pour gerer les éventuelles erreurs (clé dupliquées...)

  5. #5
    Membre expérimenté Avatar de scheu
    Inscrit en
    juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : juin 2007
    Messages : 1 506
    Points : 1 726
    Points
    1 726

    Par défaut

    Si tu as beaucoup de lignes à charger, les INSERT un à un peuvent être très longs ...
    Pour répondre à ta question, NON, la commande Postgresql COPY ne sait pas actuellement gérer les erreurs. Il faudrait passer par un outil de chargement (ETL) externe plus évolué.
    Tu as par exemple pour Postgresql l'outil gratuit benetl
    La théorie, c'est quand on sait tout mais que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi.
    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi !

    Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/

  6. #6
    Nouveau membre du Club
    Inscrit en
    avril 2009
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : avril 2009
    Messages : 44
    Points : 32
    Points
    32

    Par défaut

    Merci pour vos réponses.

    Citation Envoyé par scheu
    Si tu as beaucoup de lignes à charger, les INSERT un à un peuvent être très longs ...
    Question bête, mais pour toi scheu: Est-ce que 6000 lignes c'est beaucoup?

    Citation Envoyé par xavier-pierre
    et creer un trigger avant insert pour gerer les éventuelles erreurs (clé dupliquées...)
    Aurais-tu un exemple de code pour capturer les erreurs d'insert?

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    janvier 2006
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : janvier 2006
    Messages : 388
    Points : 603
    Points
    603

    Par défaut

    voici un exemple de trigger (mon_trigger) qui vérifie avant insertion dans la table ma_table si la clé (ici id)est déjà presente
    on crée d'abord une procédure (qui retourne opaque) pour tester la présence ou non de la clé et donc si on fait un insert. puis dans un deuxième temps on crée le trigger avant insert en utilisant la procédure précédemment définie.
    je ne dis pas que mon exemple est "parfait" mais il te montre le principe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE OR REPLACE FUNCTION ma_procedure() returns opaque AS $body$
    begin
    IF NEW.id  IN ( SELECT id FROM ma_table) then
    RETURN NULL;
    end IF;
    RETURN NEW;
    end;
    $body$
     LANGUAGE 'plpgsql';
     
    CREATE TRIGGER mon_trigger BEFORE INSERT ON ma_table
    FOR each row execute procedure ma_procedure();

  8. #8
    Membre expérimenté Avatar de scheu
    Inscrit en
    juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : juin 2007
    Messages : 1 506
    Points : 1 726
    Points
    1 726

    Par défaut

    Citation Envoyé par Saoua83 Voir le message
    Question bête, mais pour toi scheu: Est-ce que 6000 lignes c'est beaucoup?
    Non 6000 lignes c'est rien ! Avec des insert 1 à 1 les perfs resteront correctes
    Ca peut avoir un impact négatif de faire des inserts ligne à ligne plutôt que du COPY si vraiment tu as au moins quelques centaines de milliers de lignes

    J'ai personnellement souvenir d'un fichier texte de 35 millions de lignes que je chargeais en 45 minutes avec COPY mais en 20 heures avec des insert ligne à ligne
    La théorie, c'est quand on sait tout mais que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi.
    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi !

    Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/

  9. #9
    Nouveau membre du Club
    Inscrit en
    avril 2009
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : avril 2009
    Messages : 44
    Points : 32
    Points
    32

    Par défaut

    D'accord, merci à vous deux

    Je vais regarder les triggers mais je n'ai jamais touché au pl/pgsql j'espère que je vais m'en sortir

Discussions similaires

  1. Envoyer un mail, suite à une requete multiple.
    Par Z[ee]k dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 06/07/2006, 14h06
  2. Réponses: 9
    Dernier message: 22/06/2006, 10h11
  3. problème requete multiplication
    Par MichMich29 dans le forum Langage SQL
    Réponses: 28
    Dernier message: 24/05/2006, 10h16
  4. Optimisation requete avec sous-requetes multiples
    Par gege.boubou dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/09/2005, 10h42
  5. [VB6]Prob avec les requêtes multiples
    Par cammipascal dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 30/03/2004, 18h46

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