Précédent   Forum des professionnels en informatique > Bases de données > Sybase
Sybase Forum sur la base de données Sybase. Avant de poster -> F.A.Q Sybase, Tutoriels Sybase
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/07/2007, 14h09   #1
Invité de passage
 
Inscription : mai 2003
Messages : 6
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6
Points : 0
Points : 0
Envoyer un message via ICQ à danaobrest
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.
danaobrest est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2007, 22h42   #2
Rédacteur/Modérateur
 
Inscription : janvier 2006
Messages : 1 301
Détails du profil
Informations personnelles :
Âge : 52

Informations forums :
Inscription : janvier 2006
Messages : 1 301
Points : 1 505
Points : 1 505
Envoyer un message via AIM à mpeppler
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
mpeppler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2007, 16h17   #3
Invité de passage
 
Inscription : mai 2003
Messages : 6
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6
Points : 0
Points : 0
Envoyer un message via ICQ à danaobrest
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"
danaobrest est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2007, 16h34   #4
Invité de passage
 
Inscription : mai 2003
Messages : 6
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6
Points : 0
Points : 0
Envoyer un message via ICQ à danaobrest
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é.
danaobrest est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2007, 16h35   #5
Rédacteur/Modérateur
 
Inscription : janvier 2006
Messages : 1 301
Détails du profil
Informations personnelles :
Âge : 52

Informations forums :
Inscription : janvier 2006
Messages : 1 301
Points : 1 505
Points : 1 505
Envoyer un message via AIM à mpeppler
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 :
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
mpeppler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2007, 17h39   #6
Invité de passage
 
Inscription : mai 2003
Messages : 6
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6
Points : 0
Points : 0
Envoyer un message via ICQ à danaobrest
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 !
danaobrest est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2007, 20h59   #7
Membre Expert
 
Inscription : juin 2007
Messages : 1 056
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 1 056
Points : 1 078
Points : 1 078
si si elle existe mais pourquoi ne pas utiliser :

Code :
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.
kagemaru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2007, 10h22   #8
Invité de passage
 
Inscription : mai 2003
Messages : 6
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6
Points : 0
Points : 0
Envoyer un message via ICQ à danaobrest
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 !
danaobrest est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2007, 14h08   #9
Membre Expert
 
Inscription : juin 2007
Messages : 1 056
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 1 056
Points : 1 078
Points : 1 078
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.
kagemaru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2007, 14h36   #10
Invité de passage
 
Inscription : mai 2003
Messages : 6
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6
Points : 0
Points : 0
Envoyer un message via ICQ à danaobrest
Très bonne idée que tu propose !

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

Sniff
danaobrest est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2007, 19h23   #11
Membre Expert
 
Inscription : juin 2007
Messages : 1 056
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 1 056
Points : 1 078
Points : 1 078
pardon, chui un peu fatigué :

Code :
exec @retcode=test_date(@date_vl)
__________________
Emmanuel T.
kagemaru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2007, 16h40   #12
Rédacteur/Modérateur
 
Avatar de fadace
 
Homme Fabien Celaia
Administrateur de base de données
Inscription : octobre 2002
Messages : 3 779
Détails du profil
Informations personnelles :
Nom : Homme Fabien Celaia
Âge : 41
Localisation : Suisse

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

Informations forums :
Inscription : octobre 2002
Messages : 3 779
Points : 8 124
Points : 8 124
Envoyer un message via ICQ à fadace Envoyer un message via Skype™ à fadace
Vous avez un SET DATEFORMAT de quel type ?
__________________
Sr DBA Oracle / Sybase / MS-SQL / DB2 / Informix / Postgresql
Administrateur SAP
Mes articles

Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !
fadace est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h51.


 
 
 
 
Partenaires

Hébergement Web