[Sybase ASE 12 - BCP] Options du bcp

Options du bcp [Sybase ASE 12 - BCP] - SQL/NoSQL - Programmation

Marsh Posté le 06-09-2004 à 17:14:02    

Bonjour,
 
Je souhaite charger les données d'un fichier dans une table. Mais il faut que j'intégre uniquement les données valides (les lignes valides du fichier) dans la table et mettre les données erronées dans un autre fichier.
J'utilise cette commande dans un batch :

bcp mutubatch..tmp_testbcp in fichier_tmp_testbcp.txt -U sa -P  -c -t";" -e erreur.txt -m 2

 
Et le problème est que toutes les lignes sont intégrées dans la table même celles qui ne correspondent pas à la structure de la table, elles sont tronquées. Mon fichier de données à 5 lignes dont trois erronées donc normalement je devrais avoir 2 lignes intégrées et 3 redirigées dans le fichier erreur.txt. Or j'obtiens pas ça. Comment faire ?
 
Merci,
ls
 
Annexes
 
Script shell :
#!/bin/csh
 
# Batch  : TestBcp.csh    
# Realise par : S.Lechable    
# But  :        
 
echo "Début du script - "$0
date
echo "Paramètre : "$1
 
#################################
# Paramètres  #
#################################
 
set EXTENSION=`date +"%Y%m%d"`
set fic_trace=/home/sybase/admin/batch/test/trace/"TESTBCP.TRACE."$EXTENSION
 
####################################################################
#                                 Sql                              #
####################################################################
 
doit << EOFile
 
select '# Début trace Sql ' , getdate()
go
 
use mutubatch
go
 
/**********************************************************************/
select '# Si les tables temporaires existent, elles sont supprimées.' , getdate()
go
 
if exists (select * from sysobjects where name='tmp_testbcp')
 drop table tmp_testbcp
go
 
/**********************************************************************/
select '# Création des tables temporaires.' , getdate()
go
 
create table tmp_testbcp  
(
chp1 char(2) null,
chp2 char(2) null,
chp3 char(2) null,
chp4 char(2) null,
chp5 char(2) null,
chp6 char(2) null,
chp7 char(2) null,
chp8 char(2) null
)
go
 
EOFile
 
# BCP - Insertion des données dans les tables temporaires  
 
echo "Insertion des données des fichiers dans les tables temporaires"
 
bcp mutubatch..tmp_testbcp in fichier_tmp_testbcp.txt -U sa -P  -c -t";" -e erreur.txt -m 2
 
echo "Fin du script - "$0
date
 
Fichier fichier_tmp_testbcp.txt :
 
ll;lo;lp;re;kr;pe;bv;op
ll;lo;lp;re;kr;pe;bv;op
ll;lo;rlp;re;kr;pe;bv;op
ll;lo;lp;re;krr;pe;bv;op
4ll;lo;lp;re;kr;pe;bv;op
 
Résultat du script :
 
Début du script - TestBcp.csh
Mon Sep  6 14:56:20 MEST 2004
Paramètre :  
                                               
 ------------------ --------------------------  
 # Début trace Sql         Sep  6 2004  2:56PM  
 
(1 row affected)
                                                                                         
 ------------------------------------------------------------ --------------------------  
 # Si les tables temporaires existent, elles sont supprimées.        Sep  6 2004  2:56PM  
 
(1 row affected)
                                                               
 ---------------------------------- --------------------------  
 # Création des tables temporaires.        Sep  6 2004  2:56PM  
 
(1 row affected)
Insertion des données des fichiers dans les tables temporaires
 
Starting copy...
CSLIB Message:  - L0/O0/S0/N36/1/0:
cs_convert: cslib user api layer: common library error: The result is truncated because the conversion/operation resulted in overflow.
CSLIB Message:  - L0/O0/S0/N36/1/0:
cs_convert: cslib user api layer: common library error: The result is truncated because the conversion/operation resulted in overflow.
CSLIB Message:  - L0/O0/S0/N36/1/0:
cs_convert: cslib user api layer: common library error: The result is truncated because the conversion/operation resulted in overflow.
 
5 rows copied.
Clock Time (ms.): total = 1000  Avg = 200 (5.00 rows per sec.)
Fin du script - TestBcp.csh
Mon Sep  6 14:56:21 MEST 2004


Message édité par ls_one le 06-09-2004 à 17:16:34
Reply

Marsh Posté le 06-09-2004 à 17:14:02   

Reply

Marsh Posté le 07-09-2004 à 09:12:18    

salut
A ce que je sache, le bcp ne renvoie pas les lignes erronées telles quelles du moins sous windows ; ds ta commande, tu vas juste récupérer les messages d'erreurs issus du bcp dans un fichier nommé erreur.txt...
bcp sert à intégrer un fic dans une base, mais il ne remplace pas un programme ou une moulinette d'insertion...
 
apparté
toi aussi t'es dans l'informatique mutualiste ? mutubatch, ça trompe pas !!!  :D


---------------
di. / www.diredaredare.org - Ailes de la ville
Reply

Marsh Posté le 07-09-2004 à 09:41:46    

instantdharma a écrit :

salut
A ce que je sache, le bcp ne renvoie pas les lignes erronées telles quelles du moins sous windows ; ds ta commande, tu vas juste récupérer les messages d'erreurs issus du bcp dans un fichier nommé erreur.txt...
bcp sert à intégrer un fic dans une base, mais il ne remplace pas un programme ou une moulinette d'insertion...
 
apparté
toi aussi t'es dans l'informatique mutualiste ? mutubatch, ça trompe pas !!!  :D


Je travaille sous solaris et en fait je récupère rien dans erreur.txt, je ne comprends pas pourquoi !

Reply

Marsh Posté le 07-09-2004 à 10:40:30    

ls_one a écrit :

Je travaille sous solaris et en fait je récupère rien dans erreur.txt, je ne comprends pas pourquoi !


 
Vous utilisez quelle version de sybase et de la cslib?
 
edit: je n'avais pas vu que c'était dans le titre. D'après les sybooks de la 12.5, cela devrait partir en erreur. Vous avez essayé de faire le bcp avec un fichier de format?


Message édité par docmaboul le 07-09-2004 à 11:56:00
Reply

Marsh Posté le 07-09-2004 à 11:36:24    

DocMaboul est ds le vrai ; il te faut vérifier la version du bcp (qui doit correspondre à celle de ton client Sybase) & vérifier la syntaxe ds la doc...
d'ailleurs, (avec ma version de bcp) c'est -o <fichier> pour les erreurs, pas -e.
Mais je le redis : le bcp est fait pour charger / décharger les données, pas pour faire du contrôle ou de la vérification lors du chargement. Il vaut mieux charger les données ds une table qui accepte le fichier d'entrée puis faire une proc pour traiter la table d'entrée et gérer les erreurs diverses et variées.
Mais bon, c'est ce que j'en dis...


---------------
di. / www.diredaredare.org - Ailes de la ville
Reply

Marsh Posté le 07-09-2004 à 11:57:44    

instantdharma a écrit :

Mais je le redis : le bcp est fait pour charger / décharger les données, pas pour faire du contrôle ou de la vérification lors du chargement. Il vaut mieux charger les données ds une table qui accepte le fichier d'entrée puis faire une proc pour traiter la table d'entrée et gérer les erreurs diverses et variées.
Mais bon, c'est ce que j'en dis...


 
Oui et d'autant plus que le bcp est fait pour charger massivement des données et que pour faire ça bien, c'est-à-dire vite, il fait sauter quasiment tous les contrôles :D

Reply

Marsh Posté le 07-09-2004 à 12:22:41    

instantdharma a écrit :

DocMaboul est ds le vrai ; il te faut vérifier la version du bcp (qui doit correspondre à celle de ton client Sybase) & vérifier la syntaxe ds la doc...
d'ailleurs, (avec ma version de bcp) c'est -o <fichier> pour les erreurs, pas -e.
Mais je le redis : le bcp est fait pour charger / décharger les données, pas pour faire du contrôle ou de la vérification lors du chargement. Il vaut mieux charger les données ds une table qui accepte le fichier d'entrée puis faire une proc pour traiter la table d'entrée et gérer les erreurs diverses et variées.
Mais bon, c'est ce que j'en dis...


 
Je viens d'avoir le hot line Sybase et effectivement le bcp est fait pour charger / décharger les données, pas pour faire du contrôle ou de la vérification lors du chargement.
L'option -o redirige les erreurs type warning comme CSLIB par exemple...
L'option -e redirige les erreurs fatales, comme arret du serveur ....
Le mieux est que je développe un prog qui analyse la structure du fichier avant le bcp et qui effectue le tri entre les lignes valides et les lignes erronées.....
Merci pour vos réponses !

Reply

Marsh Posté le 18-03-2005 à 09:58:06    

Pour ma part, j'ai trouve une des raisons (surement plusieurs, j'imagine) qui me donnait exactement la meme erreur.
Mon client m'envoie des dates au format classique jj/mm/aaaa. Or Sybase integre les donnees au format mm/jj/aaaa. Donc, en gros, une bonne partie de mes dates etaient erronnees.
 
Sybase, si tu n'existais pas.. ca serait tellement plus simple ^^
 
PS: dsl de repondre a un post qui date de +ieurs mois


Message édité par gadafla le 18-03-2005 à 10:00:11
Reply

Marsh Posté le 11-08-2005 à 18:30:09    

gadafla a écrit :

Pour ma part, j'ai trouve une des raisons (surement plusieurs, j'imagine) qui me donnait exactement la meme erreur.
Mon client m'envoie des dates au format classique jj/mm/aaaa. Or Sybase integre les donnees au format mm/jj/aaaa. Donc, en gros, une bonne partie de mes dates etaient erronnees.
 
Sybase, si tu n'existais pas.. ca serait tellement plus simple ^^
 
PS: dsl de repondre a un post qui date de +ieurs mois


 
Sybase ASE est bien souple que Oracle, pour avoir pratiqué les deux je préfère largement sybase.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed