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

Shell et commandes POSIX Discussion :

Script shell : Ne renvoie jamais de CR=2 [SH]


Sujet :

Shell et commandes POSIX

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 144
    Points : 54
    Points
    54
    Par défaut Script shell : Ne renvoie jamais de CR=2
    Bonjour,

    J'ai un script shell que j'utilise pour charger une table Oracle, via SQL Loader.
    Ce script fonctionne à moitié. Lorsqu j'exécute le script et que je luis indique en entrée un nom de fichier inexistant, il me renverra un CR=3.(c'est OK).
    Lorsque j'exécute le script avec un fichier en entrée contenant aucune erreur de chargement, il me renvoie un CR=0.(c'est Ok).
    Par contre, si je lui met en entrée un fichier existant mais truffé d'erreurs, il me renverra invariablement un CR=0et là c'est KO, car je m'attends dans ce cas précis à avoir un CR=2.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    #!/bin/sh
    #====================================================================
    #NOM DU SCRIPT 			:  dvn_0cw1.sh
    #====================================================================
    # --------------------------------------------------------------------
    # OBJECT 
    #	lance le batch cw1
    #---------------------------------------------------------------------
    #  PARAMETRE 
    #		Aucun
    # 
    # EXIT :
    #	0 Execution reussie
    # 	1 Erreur java (voir la log)
    #	2 Erreur de chargement SQL*Loader (voir la log SQL*Loader)
    #	3 Erreur d'execution du shell
    # --------------------------------------------------------------------
    #====================================================================
     
    . $UNXSCRIPT/dvn_set_proc.sh
    . $UNXSCRIPT/dvn_set_env.sh
     
    #Fonction usage - affiche l'aide de la commande
    usage () {
      echo " "
      echo "Syntaxe : ./dvn_0cw1.sh <nom fichier log> <chemin fichier entree>"
      echo " "
      echo "Version : 1.0"
    }
     
    #--------------------------------
    #Verification des arguments
    #--------------------------------
    #verification des arguments
    if [ $# -eq 1 -a \( $1'_' = '-h_' -o $1'_' = '--help_' \) ]; then
    	usage
    	sortir $RET_SUCCES
    elif [ $# -eq 2 ]; then
    	FICHIER_LOG=$UNXLOG'/'$1
    	echo 'log :'$FICHIER_LOG
    else
    	echo "Argument ou nombre d'arguments invalide pour le batch $CODE_BATCH"
    	sortir $RET_ERR_SHELL
    fi
     
    #--------------------------------
    #Chargement des variables
    #--------------------------------
    CODE_BATCH='cw1'
     
    #--------------------------------
    #Corps du script
    #--------------------------------
     
    #Fichier de donnees d'entree
    FICHIER_DATA=$2
    if [ ! -r $FICHIER_DATA ]; then
    	echo "Fichier de donnees d'entree "$FICHIER_DATA" introuvable ou vous n'avez pas les droits de lecture"
    	sortir $RET_ERR_SHELL
    fi
     
    DATE_DEBUT=`perl -e "print time;"`
    echo "------ Lancement batch $CODE_BATCH a `date +'%R'` -------" > $FICHIER_LOG
    echo " " >> $FICHIER_LOG
    echo "Import des donnees ..." >> $FICHIER_LOG
     
    #Lancement de SQL Loader
    import_fichier_plat $CODE_BATCH $FICHIER_DATA 0 >> $FICHIER_LOG
     
    #Verification des erreurs sql loader
    FICHIER_BAD=$LOADER_LOG_PATH'/dvn_lo0'$CODE_BATCH'.bad'
    if [ -f $FICHIER_BAD ]; then #Erreur sur certaines donnees
    	NB_REJET=`cat $FICHIER_BAD | wc -l | tr -d ' '`
    elif [ $CODE_RETOUR_IMPORT -eq $RET_SUCCES ]; then #Pas d'erreur
    	NB_REJET=0
    else #Erreur fatale
    	NB_REJET=-1
    fi
    echo "Nombre d'enregistrements en erreur : "$NB_REJET  >> $FICHIER_LOG
     
    echo "Import des donnees termine" >> $FICHIER_LOG
    echo " " >> $FICHIER_LOG
    #echo "Lancement du batch java ..." >> $FICHIER_LOG
     
    RETOUR_BATCH=$?
    DATE_FIN=`perl -e "print time;"`
    TEMPS_PASSE=`expr $DATE_FIN - $DATE_DEBUT`
    MINUTES=`expr $TEMPS_PASSE / 60`
    SECONDES=`expr $TEMPS_PASSE % 60`
    #echo "------ Batch java termine en $MINUTES m et $SECONDES s -------" >> $FICHIER_LOG
    sortir $RETOUR_BATCH
    Pourtant il va regarder dans le fichier bad le nombre de rejêts.

    Je ne comprends pas ce qui se passe.

    Merci pour votre aide.

    Pascal.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 144
    Points : 54
    Points
    54
    Par défaut
    Je vous joint le fichier bad et la log de chargement et la log du batch.

    Merci.

    Pascal.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 144
    Points : 54
    Points
    54
    Par défaut
    Des difficultés à joindre les fichiers.

    Leur contenu ci-dessous :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    ------ Lancement batch cw1 a 15:40 -------
     
    Import des donnees ...
    Suppression de l'ancien fichier bad : '/usersdev/cronos/vie_courante/log/loader/dvn_lo0cw1.bad'
    Preparation du fichier de controle: '/usersdev/cronos/vie_courante/tmp/dvn_0cw1_chargement_controle.ctl'
     
    Import des donnees :
    sqlldr userid=vie_courante/vie_courante data=/usersdev/cronos/vie_courante/data/campagne/CarStoreWebStore/FICHIER_CW_AP_FAUX.txt direct=y errors=10 control=/usersdev/cronos/vie_courante/tmp/dvn_0cw1_chargement_controle.ctl log=/usersdev/cronos/vie_courante/log/loader/dvn_lo0cw1.log bad=/usersdev/cronos/vie_courante/log/loader/dvn_lo0cw1.bad skip=0
    --SH--SQL-LOADER---------------------------------------------------
     
    SQL*Loader: Release 10.2.0.3.0 - Production on Lun. Avr. 15 15:40:58 2013
     
    Copyright (c) 1982, 2005, Oracle.  All rights reserved.
     
     
    Chargement terminé - calcul enregistrement(s) logique(s) 3.
    --SH--SQL-LOADER---------------------------------------------------
    Nombre d'enregistrements en erreur : 3
    Import des donnees termine

    dvn_lo0cw1.bad

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sgjdflmgjfkl!gjfg
    sdfklgklsdfmjgfgg
    klgjkljgkjggggggg

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    SQL*Loader: Release 10.2.0.3.0 - Production on Lun. Avr. 15 15:40:58 2013
     
    Copyright (c) 1982, 2005, Oracle.  All rights reserved.
     
    Fichier de contrôle :   /usersdev/cronos/vie_courante/tmp/dvn_0cw1_chargement_controle.ctl
    Jeu de caractères UTF8 indiqué pour toutes les entrées.
    Utilisant la sémantique de longueur de caractère.
     
    Fichier de données :      /usersdev/cronos/vie_courante/data/campagne/CarStoreWebStore/FICHIER_CW_AP_FAUX.txt
      Fichier BAD :     /usersdev/cronos/vie_courante/log/loader/dvn_lo0cw1.bad
      Fichier DISCARD :  aucune spécification
     
     (Allouer tous les rebuts)
     
    Nombre à charger : ALL
    Nombre à sauter: 0
    Erreurs permises: 10
    Continuation :    aucune spécification
    Chemin utilisé:      Direct
     
    Table DVNQTCW, chargé à partir de chaque enregistrement physique.
    Option d'insertion en vigueur pour cette table : REPLACE
     
       Nom de colonne               Position   Long.  Séparat. Encadrem. Type de données
    ------------------------------ ---------- ----- ---- ---- ---------------------
    CW_NUM_CAF                          FIRST    24           CHARACTER            
        chaîne SQL pour la colonne : "TRIM (:CW_NUM_CAF)"
    CW_NUM_VIN                           NEXT    51           CHARACTER            
        chaîne SQL pour la colonne : "TRIM (:CW_NUM_VIN)"
    CW_COD_FAMILLE                       NEXT    12           CHARACTER            
        chaîne SQL pour la colonne : "TRIM (:CW_COD_FAMILLE)"
    CW_COD_SILHOUETTE                    NEXT     6           CHARACTER            
        chaîne SQL pour la colonne : "TRIM (:CW_COD_SILHOUETTE)"
    CW_COD_FINITION                      NEXT     3           CHARACTER            
        chaîne SQL pour la colonne : "TRIM (:CW_COD_FINITION)"
    CW_COD_MOTEUR                        NEXT     6           CHARACTER            
        chaîne SQL pour la colonne : "TRIM (:CW_COD_MOTEUR)"
    CW_COD_BOITEV                        NEXT     3           CHARACTER            
        chaîne SQL pour la colonne : "TRIM (:CW_COD_BOITEV)"
    CW_COD_BASEC                         NEXT     6           CHARACTER            
        chaîne SQL pour la colonne : "TRIM (:CW_COD_BASEC)"
    CW_COD_CLIENTC                       NEXT     6           CHARACTER            
        chaîne SQL pour la colonne : "TRIM (:CW_COD_CLIENTC)"
    CW_COD_ANNEEMOD                      NEXT     3           CHARACTER            
        chaîne SQL pour la colonne : "TRIM (:CW_COD_ANNEEMOD)"
    CW_COD_MODIFAA                       NEXT     3           CHARACTER            
        chaîne SQL pour la colonne : "TRIM (:CW_COD_MODIFAA)"
    CW_COD_HAB_EXTT                      NEXT     6           CHARACTER            
        chaîne SQL pour la colonne : "TRIM (:CW_COD_HAB_EXTT)"
    CW_COD_HAB_EXTC                      NEXT     6           CHARACTER            
        chaîne SQL pour la colonne : "TRIM (:CW_COD_HAB_EXTC)"
    CW_COD_HAB_INTT                      NEXT     6           CHARACTER            
        chaîne SQL pour la colonne : "TRIM (:CW_COD_HAB_INTT)"
    CW_COD_HAB_INTC                      NEXT     6           CHARACTER            
        chaîne SQL pour la colonne : "TRIM (:CW_COD_HAB_INTC)"
    CW_COD_CPER                          NEXT   240           CHARACTER            
        chaîne SQL pour la colonne : "TRIM (:CW_COD_CPER)"
    CW_DAT_MAD                           NEXT    24           CHARACTER            
        chaîne SQL pour la colonne : "TO_DATE (:CW_DAT_MAD,'YYYYMMDD')"
    CW_SEM_LIV                           NEXT    18           CHARACTER            
        chaîne SQL pour la colonne : "TRIM (:CW_SEM_LIV)"
    CW_DAT_PROD                          NEXT    24           CHARACTER            
        chaîne SQL pour la colonne : "TO_DATE (:CW_DAT_PROD,'YYYYMMDD')"
    CW_DAT_CPRV                          NEXT    24           CHARACTER            
        chaîne SQL pour la colonne : "TO_DATE (:CW_DAT_CPRV,'YYYYMMDD')"
     
    Enregistrement 1 : Rejeté - Erreur sur table DVNQTCW.
    ORA-00604: une erreur s'est produite au niveau SQL récursif 1
    ORA-01400: impossible d'insérer NULL dans ("VIE_COURANTE"."DVNQTCW"."CW_COD_FAMILLE")
     
    Enregistrement 2 : Rejeté - Erreur sur table DVNQTCW.
    ORA-00604: une erreur s'est produite au niveau SQL récursif 1
    ORA-01400: impossible d'insérer NULL dans ("VIE_COURANTE"."DVNQTCW"."CW_COD_FAMILLE")
     
    Enregistrement 3 : Rejeté - Erreur sur table DVNQTCW.
    ORA-00604: une erreur s'est produite au niveau SQL récursif 1
    ORA-01400: impossible d'insérer NULL dans ("VIE_COURANTE"."DVNQTCW"."CW_COD_FAMILLE")
     
     
    Table DVNQTCW :
      Chargement réussi de 0 Lignes.
      3 Lignes chargement impossible dû à des erreurs de données.
      0 Lignes chargement impossible car échec de toutes les clauses WHEN.
      0 Lignes chargement impossible car tous les champs étaient non renseignés.
     
    Taille du tableau de liens non utilisée dans le chemin direct.
    Lignes de tableau de colonnes :    5000
    Octets de tampon de flux de données :  256000
    Octets de tampon de lecture : 1048576
     
    Nombre total d'enregistrements logiques ignorés :          0
    Nombre total d'enregistrements logiques lus :             3
    Nombre total d'enregistrements logiques rejetés :         3
    Nombre total d'enregistrements logiques mis au rebut :        0
    Nombre total de tampons de flux de données chargés par le thread principal de SQL*Loader :        5
    Nombre total de tampons de flux de données chargés par le thread de chargement de SQL*Loader :        0
     
    Le début de l'exécution a été effectué sur Lun. Avr.  15 15:40:58 2013
    La fin de l'exécution a été effectuée sur Lun. Avr.  15 15:40:58 2013
     
    Temps écoulé (ELAPSED) :     00:00:00.12
    Temps processeur (CPU) :    00:00:00.03

    Merci.

    Pascal.

  4. #4
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 287
    Points : 12 744
    Points
    12 744
    Par défaut
    Bonjour,

    Dans le script, on voit bien les sorties en cas d'erreur sur un fichier inexistant, par exemple, mais on ne voit pas de sortie en cas de présence du fichier bad.

    Et la variable RETOUR_BATCH définie ligne 85, a très peu de chance d'avoir autre chose qu'un code 0, puisqu'elle prend le retour d'une commande 'echo' qui échoue vraiment quasiment jamais.
    Cordialement.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 144
    Points : 54
    Points
    54
    Par défaut
    Bonjour.

    Merci pour votre analyse.

    Que dois-je modifier dans ce script pour que l'on voit une sortie en cas de présence du fichier bad ?

    Dois-je supprimer la variable RETOUR_BATCH qui ne sert visiblement qu'à renvoyer un CR = 0 ?

    Merci.

    Pascal.

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Bonjour,

    Le script calcule bien le nombre de rejets NB_REJET, mais il n'en fait rien d'autre que de l'inscrire dans le fichier de log!

    Se peut-il que le fichier bad existe et soit vide?

    Si la réponse est non, alors pour que l'on voie (subjonctif!) une sortie en cas de fichier bad, je dirais, à vue de nez, qu'il faut modifier les lignes 70 à 78, par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #Verification des erreurs sql loader
    FICHIER_BAD=$LOADER_LOG_PATH'/dvn_lo0'$CODE_BATCH'.bad'
    if [ -f $FICHIER_BAD ]; then #Erreur sur certaines donnees
    	NB_REJET=`cat $FICHIER_BAD | wc -l | tr -d ' '`
    	RETOUR_BATCH=$RET_ERR_SQL
    elif [ $CODE_RETOUR_IMPORT -eq $RET_SUCCES ]; then #Pas d'erreur
    	NB_REJET=0
    	RETOUR_BATCH=$RET_SUCCES
    else #Erreur fatale
    	NB_REJET=-1
    	RETOUR_BATCH=$RET_ERR_FATAL
    fi
    et supprimer la ligne (originellement n°85):
    Les noms des constantes RET_SUCCES RET_ERR_SQL RET_ERR_FATAL doivent évidemment être adaptées en fonction de ce que tu veux réellement retourner.
    Elles sont probablement décrites dans les fichiers inclus: $UNXSCRIPT/dvn_set_proc.sh $UNXSCRIPT/dvn_set_env.sh

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 144
    Points : 54
    Points
    54
    Par défaut
    Bonjour et Merci pour vos réponses.

    En tout début de traitement, l'ancien fichier bad est supprimé.
    Il est créé, uniquement si il y a des erreurs de chargement.

    S'il existe, il ne sera donc jamais vide.

    Pour information :

    Le contenu de dvn_set_proc.sh :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    #!/bin/sh
    #====================================================================
    #NOM DU SCRIPT 			:  dvn_set_proc.sh
    #====================================================================
    # --------------------------------------------------------------------------------
    # OBJECT 
    # 	definie les fonctions utiles pour les shells de lancement des sql loader et sql plus
    #--------------------------------------------------------------------------------
    #  PARAMETRE 
    #		Aucun
    # --------------------------------------------------------------------------------
    #----------------------------------------------------------------
    # MOFIFICATION          :
    # DATE                  :
    # VERSION               :
    #====================================================================
     
     
    sortir () {
    	echo "Code retour" $1
    	exit $1
    }
     
     
    import_jar()
    {
     # tant qu'il y a des parametres
    	while [ $# -ne 0 ]
    	do
    		CLASSPATH="$1:$CLASSPATH"
    		shift
    	done
    }
    ##--------------------------------------------------
    # LANCE sqlldr avec les bons parametres
    # parametres de la fonction:
    #   - code du batch
    #   - le chemin du fichier plat
    ##----------
    # Exemple:
    #import_fichier_plat "cd1" /home/dvn/recept/dialog/dvn_0cd1.dat
    import_fichier_plat()
    {
    	CODE_RETOUR_IMPORT='0'
    	export CODE_RETOUR_IMPORT
        CHEMIN_FICHIER_DATA="$2"
     
        FICHIER_CONTROLE_TEMPLATE="$UNXLOADER/dvn_0"$1"_chargement_controle.tpl"
        FICHIER_CONTROLE="$UNXTMP/dvn_0"$1"_chargement_controle.ctl"
     
        if [ ! -r $FICHIER_CONTROLE_TEMPLATE ]
        then
    		echo "Le fichier de template '$FICHIER_CONTROLE_TEMPLATE' est introuvable."
    			CODE_RETOUR_IMPORT=$RET_ERR_SQLLDR
        	return $RET_ERR_SQLLDR
    	elif [ ! -s $FICHIER_CONTROLE_TEMPLATE ]; then
    		echo "Le fichier de template '$FICHIER_CONTROLE_TEMPLATE' est vide."
    			CODE_RETOUR_IMPORT=$RET_ERR_SQLLDR
        	return $RET_ERR_SQLLDR		
        fi
     
    	FICHIER_PLAT=$CHEMIN_FICHIER_DATA
     
        CONTROL_LOG_FILE="$LOADER_LOG_PATH/dvn_lo0$1.log"
        BAD_FILE="$LOADER_LOG_PATH/dvn_lo0$1.bad"
     
        if [ ! -r $FICHIER_PLAT ]
        then
    	echo "Le fichier plat '$FICHIER_PLAT' est introuvable."
    		CODE_RETOUR_IMPORT=$RET_ERR_SQLLDR
        	return $RET_ERR_SQLLDR
        fi
     
        echo "Suppression de l'ancien fichier bad : '$BAD_FILE'"
        rm -f $BAD_FILE
     
        echo "Preparation du fichier de controle: '$FICHIER_CONTROLE'"
        cat $FICHIER_CONTROLE_TEMPLATE | sed s:"__FICHIER_PLAT__":"$FICHIER_PLAT":g > $FICHIER_CONTROLE
     
        echo ""
        echo "Import des donnees :"
        COMMAND_LINE="sqlldr userid=$DVN_USER_BASE/$DVN_PWD_BASE data=$FICHIER_PLAT direct=y errors=$SQLLDR_MAX_ERROR control=$FICHIER_CONTROLE log=$CONTROL_LOG_FILE bad=$BAD_FILE"
        if [ "$3" != "" ]
        then
          COMMAND_LINE="$COMMAND_LINE skip=$3"
        fi
        echo "$COMMAND_LINE"
        echo "--SH--SQL-LOADER---------------------------------------------------"
        RESULT_MESSAGE=`$COMMAND_LINE`
        RESULT=$?
        echo "$RESULT_MESSAGE"
        echo "--SH--SQL-LOADER---------------------------------------------------"
        if [ "$RESULT" -ne "0" ]
        then
          ## Ne pas continuer le traitement sur les lignes importees si code erreur=1
    		CODE_RETOUR_IMPORT=$RET_ERR_SQLLDR
          return $RET_ERR_SQLLDR
        fi
     
        ERROR=`echo "$RESULT_MESSAGE" | grep -i "error|SQL\*Loader-*[1-9]"`
        if [ "$ERROR" != "" ]
        then
          echo "Erreur lors de l'import."
    		CODE_RETOUR_IMPORT=$RET_ERR_SQLLDR
          return $RET_ERR_SQLLDR
        fi
     
        NUMBER_OF_FILES=`nombre_de_fichiers $BAD_FILE`
    	if [ $NUMBER_OF_FILES -eq '1' ]
    	then
    		echo "Erreur de l'import des donnees. Voir $BAD_FILE"
    		CODE_RETOUR_IMPORT=$RET_ERR_SQLLDR
    		return $RET_ERR_SQLLDR
    	fi
     
        return $RET_SUCCES
    }
     
    ##--------------------------------------------------
    ## Lance un fichier SQL execute avec SQL Plus
    # parametres de la fonction:
    #   - user base
    #   - password base
    #   - le chemin vers le fichier sql
    #   - les arguments du fichiers sql (nombre indefini)
    ##----------
    # Exemple:
    # lancer_fichier_sql DVNDEV2 o15df48d creationBase.sql DVNQDDA1 DVNQDIX1
    #
    lancer_fichier_sql()
    {
    	DVN_USER_BASE=$1
        DVN_PWD_BASE=$2
        FICHIER_SQL=$3
    	shift;shift;shift
    	ARGUMENTS=$*
     
        COMMANDE="sqlplus -s $DVN_USER_BASE/$DVN_PWD_BASE @$FICHIER_SQL $ARGUMENTS"
        echo "$COMMANDE"
        echo "--DEBUT--SQL-PLUS-------------------------------------------------"
        $COMMANDE
        RESULT=$?
        echo "$RESULT_MESSAGE"
        echo "--FIN--SQL-PLUS---------------------------------------------------"
        #echo "Code retour de SQL*PLUS: $RESULT"
        if [ $RESULT -ne 0 ]
        then 
          echo "Le fichier SQL '$FICHIER_SQL' est introuvable."
          return $RET_ERR_SQLLDR
        fi
     
        tester_message_erreur_procedure "$RESULT_MESSAGE" 
        if [ $? -ne 0 ]
        then
          return $RET_ERR_SQLLDR
        fi
     
        return $RETOUR_SUCCES
    }
     
    ##--------------------------------------------------
    ## TEST si la commande sqlplus a retourne une erreur
    ## 
    tester_message_erreur_procedure()
    {
        RESULT_MESSAGE=$1
        ERROR=`echo $RESULT_MESSAGE | grep "ERROR at line"`
        if [ "$ERROR" != "" ]
        then
          echo "Erreur de l'appel a la procedure. Fichier SQL errone ou base modifiee."
          return 1
        fi
     
        ERROR=`echo $RESULT_MESSAGE | grep "\[FATAL\]"`
        if [ "$ERROR" != "" ]
        then
          echo "Erreur dans l'execution de la procedure (erreur recuperee)"
          return 1
        fi
     
        ERROR=`echo $RESULT_MESSAGE | grep "\[ERREUR\]"`
        if [ "$ERROR" != "" ]
        then
          echo "Erreur dans l'execution de la procedure (erreur recuperee)"
          return 1
        fi
     
        return 0
    }
     
    ##--------------------------------------------------
    # comptage du nombre de fichiers
    # Exemple:
    #NB_FILES=`nombre_de_fichiers "../*.txt"`
    nombre_de_fichiers()
    {
        NB_FICHIERS=`ls $* 2>/dev/null | wc -l`
        echo $NB_FICHIERS
    }
    Le contenu de dvn_set_env.sh :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    #!/bin/sh
    #====================================================================
    #NOM DU SCRIPT 			:  set_env.sh
    #====================================================================
    #---------------------------------------------------------------------------------
    # --------------------------------------------------------------------------------
    # OBJECT 
    #	positionne les variables d'environement
    #--------------------------------------------------------------------------------
    #  PARAMETRE 
    #		Aucun
    # 
    # --------------------------------------------------------------------------------
    #----------------------------------------------------------------
    # MOFIFICATION          :
    # DATE                  :
    # VERSION               :
    #====================================================================
     
    #Autres repertoires
    CONFIG_PATH="$UNXAPPLI/data/config-batch-externally"
    LOADER_LOG_PATH="$UNXLOG/loader"
     
    ## Codes retour
    RET_SUCCES=0
    RET_ERR_JAVA=1
    RET_ERR_SQLLDR=2
    RET_ERR_SHELL=3 #fichier introuvable
     
    #Authentification
    DVN_USER='MDEDVN02'
    DVN_USER_PWD='8us8zbjz'
     
    #Base de donnees
    DVN_USER_BASE='vie_courante'
    DVN_PWD_BASE='vie_courante'
    DVN_ALIAS_BASE='DVN_ALIAS'
     
    #SQL Loader
    SQLLDR_MAX_ERROR='10'
     
    #Fichiers
    DATE_JOUR=`date +'%G'%m'%d'%H'%M'`
     
    #Configs java 
    ORACLE_DRIVER_PATH='/soft/ora1020/jdbc/lib/ojdbc14.jar' #chemin vers le driver oracle
    JAVA_BIN_PATH='/soft/jdk1.5.0_12/bin/'
    PATH=$PATH:$JAVA_BIN_PATH
    PATH=$PATH:$UNXJAVALIB
    CLASSPATH="$CLASSPATH:$ORACLE_DRIVER_PATH"
    DVN_PACKAGE='com.inetpsa.dvn.batch.lanceurs'
    JAVA_XMS='512'
    JAVA_XMX='512'
     
    export PATH
     
    #Introscope
    DVN_INTROSCOPE=
     
    #Import des jar pour ajout dans le classpath
    LISTE_JAR=`ls $UNXJAVALIB/*.jar`" "`ls $UNXJAVA/*.jar`
    import_jar $LISTE_JAR

    Donc il faudrait que j'utilise ces variables ?

    RET_SUCCES=0
    RET_ERR_SQLLDR=2

    Je n'ai pas trouvé la correspondance avec RET_ERR_FATAL.


    Merci.
    Pascal.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 144
    Points : 54
    Points
    54
    Par défaut NB_REJET négatif ?
    Bonjour,

    Ok pour la modification du script et utilisaton de ces variables :

    $RET_ERR_SQL => $RET_ERR_SQLLDR
    $RET_SUCCES => $RET_SUCCES

    Par contre, je ne vois pas trop à quoi correspond ce test else :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    else #Erreur fatale
    	NB_REJET=-1
    	RETOUR_BATCH=$RET_ERR_FATAL
    fi
    Que signifie NB_REJET = -1 ?

    Un nombre de rejêts ne peut pas être négatif ? (égal à zéro ou supérieur à zéro)

    Si vous pouvez m'éclairer sur ce dernier point que j'ai du mal à comprendre ?

    Merci encore.

    Pascal.

  9. #9
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par scalpa63 Voir le message
    Par contre, je ne vois pas trop à quoi correspond ce test else :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    else #Erreur fatale
    	NB_REJET=-1
    	RETOUR_BATCH=$RET_ERR_FATAL
    fi
    Que signifie NB_REJET = -1 ?

    Un nombre de rejêts ne peut pas être négatif ? (égal à zéro ou supérieur à zéro)
    J'ai un peu de mal à répondre car je ne suis pas dans la tête de celui qui a programmé ce script!

    À la lecture de ce script, ce que je vois et intuite, c'est que, dans ce 'if':
    • le 'then' correspond au cas où le fichier de rejets est présent,
      auquel cas on peut compter le nombre de rejets

    • le 'elif' correspond au cas où le fichier de rejets est absent et l'import s'est bien passé,
      auquel cas le nombre de rejets est 0

    • le 'else' correspond au cas où l'import s'est mal passé mais n'a pas généré de fichier de rejets,
      auquel cas ça n'a pas de sens de compter le nombre de rejets, donc on le met à -1, pour quand même afficher le message "Nombre d'enregistrements en erreur" à la ligne suivante et indiquer par un nombre négatif qu'on n'a pas pu les compter;
      puis on se prépare à retourner une valeur indiquant qu'il y a eu une erreur fatale.
      Et c'est à toi de choisir ce que tu veux que ton script retourne dans ce cas-là!

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 144
    Points : 54
    Points
    54
    Par défaut
    Bonjour.

    Ok.

    Merci.

    Pascal.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Power Shell script password n'expire jamais
    Par alex_m94 dans le forum Windows
    Réponses: 1
    Dernier message: 02/04/2014, 09h48
  2. [JSP] script shell
    Par goolix dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 06/08/2004, 09h08
  3. Exécution d'un script shell
    Par Manu0086 dans le forum Linux
    Réponses: 8
    Dernier message: 15/06/2004, 16h31
  4. Explication script shell
    Par crasho007 dans le forum Linux
    Réponses: 2
    Dernier message: 14/06/2004, 13h54
  5. Cron + terminal + script shell
    Par nicolas.pissard dans le forum Linux
    Réponses: 3
    Dernier message: 17/03/2004, 09h24

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