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

Sybase Discussion :

[BCP]Proc de Gestion d'erreur après import de données.


Sujet :

Sybase

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Mai 2003
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 6
    Points : 1
    Points
    1
    Par défaut [BCP]Proc de Gestion d'erreur après import de données.
    Bonjour,

    Je travaille actuellement dans un environnement Sybase 12.0/Unix. Un script importe quotidiennement des données via un bcp.
    Je rencontre un pb avec des fichiers d'import qui contiennent des données complètement farfelues.

    Précisement :
    Colonne source : DATE_VL -> CHAR (10)
    Colonne destination (en base) : DATE_VALO -> SMALLDATETIME

    Exemple de données erronnées qui font planter les proc liées :
    DATE_VL : "2007/17/07 5:35 PM"

    Je devrais avoir à la place :
    DATE_VALO : "17/07/2007 17:35"

    La conversion renvoie une erreur et oblige la procédure à sortir en erreur.

    Je recherche un moyen d'annuler la connversion si celle-ci revient en erreur.

    Je pensais faire quelque chose du genre :
    --------------------------------------------------------------------
    DECLARE @DATE_VL CHAR (10)
    DECLARE @DATE_VALO SMALLDATETIME
    DECLARE @MESSAGE VARCHAR (128)

    SELECT @DATE_VALO = (CONVERT (@DATE_VL,SMALLDATETIME))

    SELECT @@ERROR

    IF @@ERROR <> 0
    BEGIN
    SELECT@MESSAGE = "DONNEE INCORRECTE"
    ROLLBACK TRAN
    RETURN
    END
    ELSE
    BEGIN
    SELECT @MESSAGE =" DONNEE OK"
    END


    SELECT @MESSAGE
    COMMIT TRAN
    ------------------------------------------------------------------------

    Le pb est que l'erreur dans la conversion empêche la suite de l'exécution de la requête. De ce fait, la condition IF ne fonctionne que quand il n'y a pas d'erreur.

    Pouvez-vous m'aider à trouver une parade ?
    Par avance, je vous remercie.

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Points : 1 828
    Points
    1 828
    Par défaut
    Je ne suis pas sûre de bien comprendre la séquence.

    En principe, la chaine "2007/17/07 5:35 PM" est comprise par Sybase comme une date. Donc un bcp in de cette chaine vers un champ de type DATETIME doit fonctionner correctement.

    De même, un CONVERT(datetime, "2007/17/07 5:35 PM") ne devrait pas poser de problème non plus.

    Est-ce que tu peux préciser le problème ?

    Merci,

    Michael
    Michael Peppler
    Membre de TeamSybase - www.teamsybase.com

    "A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Mai 2003
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Je dois avouer que c'est suprenant mais Sybase n'arrive effectivement pas à convertir la donnée suivante en datetime :

    DECLARE @DATE_VL VARCHAR (128)
    DECLARE @DATE_VALO DATETIME

    SELECT @DATE_VL = "2007/17/07 5:35 PM"
    SELECT @DATE_VALO = CONVERT (DATETIME,@DATE_VL)

    J'obtiens l'erreur suivante :
    "Arithmetic overflow during explicit conversion of CHAR value '2007/17/07' to a DATETIME field"

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Mai 2003
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    de manière générale, je cherche à intercepter une erreur de conversion et à effectuer une action dans ce cas, par exemple insérer la ligne en erreur dans une table temporaire et afficher un message d'erreur personnalisé.

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Points : 1 828
    Points
    1 828
    Par défaut
    Pff... j'avais mal lu. Evidemment, 2007/17/07 va poser problème (il n'y a en général pas de mois 17 )

    Il est possible que l'on puisse gérer cela via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    set arithabort off
    (sous ASE 15.0.1 il y a bien une fonction isdate(), mais cela ne va pas beaucoup t'aider...)


    Michael
    Michael Peppler
    Membre de TeamSybase - www.teamsybase.com

    "A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Mai 2003
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Je dois préciser la version de sybase utilisée : 12.5.4

    j'imagine que c'est pour cela que la fonction indiquée ci-dessus ne fonctionne pas ... Sniff !

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Points : 1 216
    Points
    1 216
    Par défaut
    si si elle existe mais pourquoi ne pas utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    1> set dateformat ydm
    2> go
    1> declare @toto datetime
    2> select @toto="2007/17/07 5:35PM"
    3> go
    (1 row affected)
    Emmanuel T.

  8. #8
    Nouveau Candidat au Club
    Inscrit en
    Mai 2003
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Je pense que ma question initiale a été mal comprise, donc je reprend :

    Dans le cadre de mon projet, je reçois des fichiers texte de l'extérieur via un bcp in.

    Avant d'intégrer ces données dans les tables, je dois passer par des étapes de cv de conversions dont celle du datetime est un exemple.

    Mon problème est qu'avec la version 12.5.04 de Sybase ASE, je fais face à des limitations.

    Mon soucis est qu'une erreur de conversion de données entraine non seulement un message d'erreur mais surtout amène une sortie inconditionnelle du script.

    Or je voudrais justement pouvoir trouver un moyen de forcer Sybase à continuer le déroulement du script afin de pouvoir récupérer la valeur de @@error et d'agir en fonction de ce qu'elle contient.

    J'espère que vous pourrez m'aider ...

    @ bientôt !

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Points : 1 216
    Points
    1 216
    Par défaut
    désolé, je relirais les posts depuis le début promis

    Un peu à l'arrache, tu pourrais peut-être passer par une petite procédure stockée qui fera ce que tu fais pour tester la date.

    Du genre :

    create proc test_date(@date varchar(30))
    as
    declare @toto datetime
    select @toto=convert(datetime,@date)
    return 0

    ce qui fait que si ta @date est une vraie date, tu auras un retour 0 sinon elle se vautrera avec le code qui va bien (!= 0 ça c'est sûr)

    donc ensuite, pour chaque date :
    declare @retcode=exec test_date(@date_vl)
    if @retcode = 0
    machin
    else
    bidule

    Mais tu auras tjrs ton msg d'erreur affiché à l'écran
    Emmanuel T.

  10. #10
    Nouveau Candidat au Club
    Inscrit en
    Mai 2003
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Très bonne idée que tu propose !

    Malheureusement, j'obtiens une erreur à ce niveau :
    DECLARE @RETCODE = EXEC TEST_DONNEE (@DONNEE)

    Sniff

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Points : 1 216
    Points
    1 216
    Par défaut
    pardon, chui un peu fatigué :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exec @retcode=test_date(@date_vl)
    Emmanuel T.

  12. #12
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 222
    Points : 19 551
    Points
    19 551
    Billets dans le blog
    25
    Par défaut
    Vous avez un SET DATEFORMAT de quel type ?
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

Discussions similaires

  1. [XL-2003] Erreur lors de l'import de données ASCII
    Par Vincent32 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 15/11/2012, 17h34
  2. [AC-2000] gestion des erreurs lors de l'importation d'un CSV dans une table formaté
    Par zandeparis dans le forum VBA Access
    Réponses: 1
    Dernier message: 02/11/2009, 23h45
  3. Gestion des erreurs de conversion de type de données
    Par FMJ dans le forum Développement
    Réponses: 11
    Dernier message: 09/07/2009, 23h27
  4. erreur lors de l'import de données
    Par benoitXV dans le forum PostgreSQL
    Réponses: 10
    Dernier message: 06/11/2008, 16h13
  5. Réponses: 6
    Dernier message: 09/06/2006, 12h17

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