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

PostgreSQL Discussion :

Créer un exception lors d'une erreur 22P02


Sujet :

PostgreSQL

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 98
    Points : 59
    Points
    59
    Par défaut Créer un exception lors d'une erreur 22P02
    Bonjour à tous,

    J'ai un petit problème que je n'arrive pas à résoudre seule, j'espère que certains d'entre vous auront des idées sur ce sujet :

    Le principe :
    J'ai une base de données géométrique dans la quelle j'importe des coordonnées (x,y,z) et quelques autres données type nom, lieu, dates... Ces données sont importées via une interface sous python. Je lis un fichier Excel et importe ces données dans ma base.
    Parfois, j'ai des cases vides dans mon tableau ou des données différentes de ce que j'ai en temps normal. Par exemple, au lieu d'une hauteur double précision "40.2" je vais avoir un texte "non calculé". Dans ces cas-là, j'ai naturellement une erreur de type puisque j'importe un texte dans un double precision.

    Exemples de messages d'erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    1---
    ProgrammingError: FEHLER:  Spalte „pt_y“ hat Typ integer, aber der Ausdruck hat Typ text
    LINE 4:   SELECT data65, data3,data4,data5,data67
                                   ^
    HINT:  Sie müssen den Ausdruck umschreiben oder eine Typumwandlung vornehmen.
    QUERY:  INSERT INTO point( pt_projnum , pt_x , pt_y ,  pt_z, pt_projname[
    En francais : type du champ int et type de la donnée text. Types incompatibles 
    2----
    FEHLER: ungültige Eingabesyntax für ganze Zahl: „la“
    SQL Status:22P02
    En francais : Erreur de syntaxe, "la" invalide pour un nombre
    Ce que j'aimerais :
    J'aimerais pouvoir continuer l'importation des données, même si j'ai cette erreur et remplacer la valeur invalide par une case vide ou un code d'erreur.
    Je ne suis pas habituée aux bases de donnée, j'aimerais faire quelque chose comme en programmation du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    try :
        blablabla
    except Error... :
        pass
    J'ai vu que des choses existaient, mais je n'ai aucune idée de comment cela fonctionne. Exemple :
    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 insert_false() RETURNS VOID AS $$
    BEGIN 
    	insert into point(pt_projnum, pt_y) values ('ex1','la'),('ex2', '2'),('ex3', '12');
    EXCEPTION 
    	WHEN invalid_text_representation THEN
    	-- Do nothing.
    END;
    $$
    LANGUAGE plpgsql;
     
    select insert_false();
    select * from point ;
    Merci d'avance pour vos conseils !

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 770
    Points : 52 726
    Points
    52 726
    Billets dans le blog
    5
    Par défaut
    Un SGDB relationnel comme PG fonctionne de manière ensembliste. Il ne fait pas du ligne à ligne par itération. Les données sont chargées d'un seul bloc en une seule opération atomique ; c'est la notion de transaction.
    Or, vous pensez naïvement qu'il fait des itérations, ce qui n'est jamais le cas en matière de SGBDR !

    Pour traiter votre problème, il suffit de :
    1) insérer vos données dans une table intermédiaire "lâche", c'est à dire avec des colonnes de type "flou", par exemples toutes en varchar ;
    2) nettoyer votre table à coup de requêtes qualifiant les données ;
    3) effectuer une insertion finale des données vers la table de production.

    Si vous voulez en sus une trace des problématiques, utilisez 2 tables intermédiaires : l'une contient les données brutes, l'autre les données rectifiées et ajoutez une colonne décrivant la nature de la correction entreprise ou de la non qualification des données.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 98
    Points : 59
    Points
    59
    Par défaut
    Bonjour,
    J'ai bien compris que en SQL chaque action était effectuée en bloc.
    2) nettoyez votre table à coup de requête qualifiant les données
    Si je comprends et transpose à mon problème de type de données, je dois faire une requête pour chaque champ afin de savoir si le type initial correspond au type du champ receveur et, si oui, alors je peux insérer mes données. Si ce n'est pas le cas je ne peux rien faire.

    Je pose la question suivante : dans un bloc, comment savoir où est le problème (récupérer automatiquement la location du problème ligne et champ) lorsque l'on reçoit un message d'erreur. Est-ce possible de savoir cela ?

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 770
    Points : 52 726
    Points
    52 726
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par aurelie.guegan.15 Voir le message
    Si je comprends et transpose à mon problème de type de données, je dois faire une requête pour chaque champ afin de savoir si le type initial correspond au type du champ receveur et, si oui, alors je peux insérer mes données. Si ce n'est pas le cas je ne peux rien faire.
    Pas nécessairement, mais une série de requêtes par classe de problème.

    Je pose la question suivante : dans un bloc, comment savoir où est le problème (récupérer automatiquement la location du problème ligne et champ) lorsque l'on reçoit un message d'erreur. Est-ce possible de savoir cela ?
    Il suffit d'avoir une clef dans la table..

    Par exemple, vous pouvez faire la chose suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE MaTableIntermédiaireNiveau1
    SET Message = COALESCE(Message, '') || CASE WHEN Colonne1 pas conforme OR Colonne2 pas conforme
                                    THEN 'Erreur de format de date sur colonne 1 ou 2. '
                                 ELSE NULL
                         END;
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. [Wamp] 500 Internal Server Error lors d'une erreur PHP
    Par savageman86 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 17/10/2008, 14h13
  2. Réponses: 6
    Dernier message: 25/06/2007, 13h41
  3. [XSD] Exception lors d'une validation
    Par cash3000 dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 08/06/2006, 09h17
  4. Réafficher un formulaire lors d'une erreur
    Par Viau dans le forum Langage
    Réponses: 22
    Dernier message: 03/02/2006, 09h38
  5. [JDBC] SQL Exception lors d'une Query !
    Par Castagnems dans le forum JDBC
    Réponses: 5
    Dernier message: 30/04/2004, 12h00

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