Bonjour,

Je suis en Oracle 12.

Mon souci c'est que j'ai une anomalie lors de lecture et chargement d'un fichier texte de longueur fixe dans une base de données Oracle en utilisant le package UTL_FILE.
Si la structure du fichier est bonne, toutes les lignes sont chargées sauf la dernière pour laquelle j'ai toujours un caractère de moins et donc rejetée sachant que dans le fichier en entrée toutes les lignes sont de memes longueur et c'est un constat général (J'ai utilisé plusieurs exemples de fichier mais toujours longueur de la derniere ligne = longueur attendu - 1).
Actuellement pour contourner le probleme et forcer le chargement complet du fichier, je rentre manuellement et rajoute un caractere à la fin de la derniere ligne (un espace) pour chaque fichier.

Auriez vous une idée d'où vient le probleme? Auriez vous sinon une solution de contournement automatique?

Merci
En bas mon code de lecture et chargement

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
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
PROCEDURE CHARGEMENT_TXT_FORMULES (P_ID_CHARGEMENT IN number, Repertoire In Varchar2, Fichier In Varchar2,  UTILISATEUR IN VARCHAR2, P_NBRE_LIGNES OUT NUMBER,  P_NBRE_AVERT OUT NUMBER, P_NBRE_ERREUR OUT NUMBER, P_NBRE_REJETS OUT NUMBER, p_nmes OUT number, p_lmes OUT varchar2) Is  
 CURSOR vCurseurRepStructure IS
      SELECT
        nomTable,
        colonne,
        position,
        longueur
      FROM
        FOBA.P_STRUCTUREFICHIER
      WHERE
        nomTable='FORMULES_BANCAIRES'
      ORDER BY
        colonne;
      --
      abondon Exception;
      /* déclaration des variables dont lesquelles on va lire le curseur */
      vNomTable   FOBA.P_STRUCTUREFICHIER.nomTable%TYPE;
      vColonne      FOBA.P_STRUCTUREFICHIER.colonne%TYPE;
      vPosition       FOBA.P_STRUCTUREFICHIER.position%TYPE;
      vLongueur     FOBA.P_STRUCTUREFICHIER.longueur%TYPE;
 
      /* déclaration d'un type table et de deux variables table */
      TYPE typeTable IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
      tPosition     typeTable;
      tLongueur     typeTable;
      i             BINARY_INTEGER := 0;
      l integer; 
      id                utl_file.file_type;
      longueur constant number := 329;
 
    vLigne          Varchar2(1000);
    NombreLignes    INTEGER:=1;
    cc integer :=0;
  --
  v_temp    VARCHAR2(32500);
  formule foba.formules_b%rowtype;
  titre   foba.formules_b_titres%rowtype;
  v_date number;
  V_ID_FORMULE number;
  verreur varchar2(5000);
--   i number;
   f_insert number := 1;
   v_nbre_erreur number := 0; -- calculer le total des rejets suite aux controles 
   v_nbre_avert number := 0; -- calculer le total des warnings suite aux controles 
   c1_libelle             foba.p_controles.libelle%type;
   c1_niveau_erreur foba.p_controles.niveau_erreur%type;
   c1_statut             foba.p_controles.statut%type;
   c2_libelle             foba.p_controles.libelle%type;
   c2_niveau_erreur foba.p_controles.niveau_erreur%type;
   c2_statut             foba.p_controles.statut%type;
   c4_libelle             foba.p_controles.libelle%type;
   c4_niveau_erreur foba.p_controles.niveau_erreur%type;
   c4_statut             foba.p_controles.statut%type;
   c5_libelle             foba.p_controles.libelle%type;
   c5_niveau_erreur foba.p_controles.niveau_erreur%type;
   c5_statut             foba.p_controles.statut%type;
   f_exist                number := 0;
   chaine                foba.p_indicateur_lignes%rowtype; -- sert pour controler l'extraction
   lerreur varchar2(5000);
    --
    j number := 0;
    v_entiere  NUMBER;
    v_decimale  NUMBER;
    --
    --v_trace varchar2(3500); -- Variable pour debuger
Begin
  P_NBRE_LIGNES := 0;
    BEGIN
            OPEN vCurseurRepStructure;
            LOOP
              FETCH vCurseurRepStructure INTO vNomTable, vColonne, vPosition, vLongueur;
              EXIT WHEN vCurseurRepStructure%NOTFOUND;
              i := i + 1;
              tPosition(i) := vPosition;
              tLongueur(i) := vLongueur;
            END LOOP ;
            CLOSE vCurseurRepStructure;
  END;
--v_trace := v_trace||'Apres curseur structure;';
    id:=utl_file.fopen(Repertoire,Fichier,'r');
--v_trace := v_trace||'Avant open utl_file;';
  -- type record (1 item = 1 noeud de la liste v_nl) 
  --
  -- On prepare les counts des indicateurs controles
  --
 
  lerreur := 'SRUCTURE INCORRECTE DU FICHIER:';
  loop
    Begin
    --v_trace := v_trace||'debut loop;';
    utl_file.get_line(id,vLigne);
    --v_trace := v_trace||'apres get line;';
    cc := cc+1;
    l:= length(vligne);
    --
    if l != longueur then
    --v_trace := v_trace||'dans l != longueur;';
       f_insert := 0;
       lerreur := lerreur||'Ligne: '||cc ||'. Longueur de ligne incorrecte, '||l||' au lieu de '||longueur||' caractères.';  
       raise abondon;
    else
--v_trace := v_trace||'dans l = longueur;';
    --
    vligne:= substr(vligne,1,longueur);
    P_NBRE_LIGNES := P_NBRE_LIGNES + 1;
    f_insert := 1; -- initialiser par defaut au mode insertion
    lerreur := 'SRUCTURE INCORRECTE DU FICHIER:';
    formule.code_ligne := 'LIGNE '||cc;
    chaine.code_ligne := formule.code_ligne;
    formule.date_create := sysdate;
    chaine.date_create := formule.date_create;
        --                                                                                                     SENS
    chaine.sens:= TRIM(SUBSTR(vLigne, tPosition(1), tLongueur(1)));
    If chaine.sens is not null then
    If foba.isnumeric(chaine.sens) then
    If length(chaine.sens) <= 1 then
      formule.sens := chaine.sens;
    Else
       f_insert := 0;
       lerreur := lerreur||'(SENS, LONGUEUR MAX DE 1 DEPASSEE)';  
    End If;
    Else
       f_insert := 0;
       lerreur := lerreur||'(SENS, DOIT ETRE NUMBER)'; 
    End If;
    else
    formule.sens := chaine.sens;
    End If;
    --                                                                                                    CATEGORIE
    chaine.categorie := TRIM(SUBSTR(vLigne, tPosition(2), tLongueur(2)));
    If chaine.categorie is not null then
    If foba.isnumeric(chaine.categorie) then
    If length(chaine.categorie) <= 1 then
      formule.categorie := chaine.categorie;
    Else
       f_insert := 0;
       lerreur := lerreur||'(CATEGORIE, LONGUEUR MAX DE 1 DEPASSEE)';  
    End If;
    Else
       f_insert := 0;
       lerreur := lerreur||'(CATEGORIE, DOIT ETRE NUMBER)'; 
    End If;
    else
    formule.categorie := chaine.categorie;
    End If;
    --                                                                                                    CODE_BANQUE
    chaine.code_banque := TRIM(SUBSTR(vLigne, tPosition(3), tLongueur(3)));
    If chaine.code_banque is not null then
    If length(chaine.code_banque) <= 3 then
      formule.code_banque := chaine.code_banque;
    Else
       f_insert := 0;
       lerreur := lerreur||'(CODE_BANQUE, LONGUEUR MAX DE 3 DEPASSEE)';  
    End If;
    End If;
    --                                                                                                    CODE_GUICHET
    chaine.code_guichet := TRIM(SUBSTR(vLigne, tPosition(4), tLongueur(4)));
    If chaine.code_guichet is not null then
    If length(chaine.code_guichet) <= 4 then
      formule.code_guichet := chaine.code_guichet;
    Else
       f_insert := 0;
       lerreur := lerreur||'(CODE_GUICHET, LONGUEUR MAX DE 4 DEPASSEE)';  
    End If;
    formule.code_guichet := chaine.code_guichet;
    End If;
    --                                                                                                    CODE OPERATION
    chaine.code_operation :=TRIM(SUBSTR(vLigne, tPosition(5), tLongueur(5)));
    If chaine.categorie is not null then
    If foba.isnumeric(chaine.categorie) then
    If length(chaine.categorie) <= 1 then
      formule.categorie := chaine.categorie;
    Else
       f_insert := 0;
       lerreur := lerreur||'(CATEGORIE, LONGUEUR MAX DE 1 DEPASSEE)';  
    End If;
    Else
       f_insert := 0;
       lerreur := lerreur||'(CATEGORIE, DOIT ETRE NUMBER)'; 
    End If;
     formule.categorie := chaine.categorie;
    End If;
    --                                                                                                    CODE_PAYS
    chaine.CODE_PAYS := TRIM(SUBSTR(vLigne, tPosition(6), tLongueur(6)));
    If chaine.CODE_PAYS is not null then
    If length(chaine.CODE_PAYS) <= 2 then
      formule.CODE_PAYS := chaine.CODE_PAYS;
    Else
       f_insert := 0;
       lerreur := lerreur||'(CODE_PAYS, LONGUEUR MAX DE 2 DEPASSEE)';  
    End If;
    else
    formule.CODE_PAYS := chaine.CODE_PAYS;
    End If;
    --                                                                                                    CATEGORIE_NTITRE
    chaine.CATEGORIE_NTITRE := TRIM(SUBSTR(vLigne, tPosition(7), tLongueur(7)));
    If chaine.CATEGORIE_NTITRE is not null then
    If length(chaine.CATEGORIE_NTITRE) <= 15 then
      formule.CATEGORIE_NTITRE := chaine.CATEGORIE_NTITRE;
    Else
       f_insert := 0;
       lerreur := lerreur||'(CATEGORIE_NTITRE, LONGUEUR MAX DE 15 DEPASSEE)';  
    End If;
    else
    formule.CATEGORIE_NTITRE := chaine.CATEGORIE_NTITRE;
    End If;
    --                                                                                                    DATE_DOM_TITRE 
    chaine.date_dom_titre := TRIM(SUBSTR (vLigne, tPosition (8), tLongueur (8)));
    If chaine.date_dom_titre is not null then
    If foba.isnumeric(chaine.date_dom_titre) then
    If length(chaine.date_dom_titre) <= 8 then
      Begin
         formule.date_dom_titre := to_char(to_date(chaine.date_dom_titre, 'DD/MM/YYYY'));
      Exception When Others then 
         f_insert := 0;
       lerreur := lerreur||'(DATE_DOM_TITRE, DATE INCORRECTE)';
      End;
    Else
       f_insert := 0;
       lerreur := lerreur||'(DATE_DOM_TITRE, LONGUEUR MAX DE 8 DEPASSEE)';  
    End If;
    Else
       f_insert := 0;
       lerreur := lerreur||'(DATE_DOM_TITRE, DOIT ETRE NUMBER)'; 
    End If;
    else
    formule.date_dom_titre := chaine.date_dom_titre;
    End If;
    --                                                                                                    REF_CIRCULAIRE
    chaine.ref_circulaire := TRIM(SUBSTR(vLigne, tPosition(9), tLongueur(9)));
    If chaine.ref_circulaire is not null then
    If length(chaine.ref_circulaire) <= 35 then
      formule.ref_circulaire := chaine.ref_circulaire;
    Else
       f_insert := 0;
       lerreur := lerreur||'(REF_CIRCULAIRE, LONGUEUR MAX DE 35 DEPASSEE)';  
    End If;
    else
    formule.ref_circulaire := chaine.ref_circulaire;
    End If;
    --                                                                                                    NUM_AUTORISATION
    chaine.num_autorisation := TRIM(SUBSTR(vLigne, tPosition(10), tLongueur(10)));
    If chaine.num_autorisation is not null then
    If length(chaine.num_autorisation) <= 20 then
      formule.num_autorisation := chaine.num_autorisation;
    Else
       f_insert := 0;
       lerreur := lerreur||'(NUM_AUTORISATION, LONGUEUR MAX DE 20 DEPASSEE)';  
    End If;
    else
    formule.num_autorisation := chaine.num_autorisation;
    End If;
    --                                                                                                    DATE_AUTORISATION
    chaine.date_autorisation := TRIM(SUBSTR (vLigne, tPosition (11), tLongueur (11)));
    If chaine.date_autorisation is not null then
    If foba.isnumeric(chaine.date_autorisation) then
    If length(chaine.date_autorisation) <= 8 then
      Begin
         formule.date_autorisation := to_char(to_date(chaine.date_autorisation, 'DD/MM/YYYY'));
      Exception When Others then 
         f_insert := 0;
       lerreur := lerreur||'(DATE_AUTORISATION, DATE INCORRECTE)';
      End;
    Else
       f_insert := 0;
       lerreur := lerreur||'(DATE_AUTORISATION, LONGUEUR MAX DE 8 DEPASSEE)';  
    End If;
    Else
       f_insert := 0;
       lerreur := lerreur||'(DATE_AUTORISATION, DOIT ETRE NUMBER)'; 
    End If;
    else
    formule.date_autorisation := chaine.date_autorisation;
    End If;
    --                                                                                                     DONNEUR ORDRE
    chaine.DONNEUR_ORDRE := TRIM(SUBSTR(vLigne, tPosition(12), tLongueur(12)));
    If chaine.DONNEUR_ORDRE is not null then
    If length(chaine.DONNEUR_ORDRE) <= 70 then
      formule.DONNEUR_ORDRE := chaine.DONNEUR_ORDRE;
    Else
       f_insert := 0;
       lerreur := lerreur||'(DONNEUR_ORDRE, LONGUEUR MAX DE 70 DEPASSEE)';  
    End If;
    else
    formule.DONNEUR_ORDRE := chaine.DONNEUR_ORDRE;
    End If;
    --                                                                                                      CENTRE
    chaine.centre := TRIM(SUBSTR(vLigne, tPosition(13), tLongueur(13)));
    If chaine.centre  is not null then
    If length(chaine.centre) <= 3 then
      formule.centre := chaine.centre;
    Else
       f_insert := 0;
       lerreur := lerreur||'(CENTRE, LONGUEUR MAX DE 3 DEPASSEE)';  
    End If;
    else
    formule.centre := chaine.centre;
    End If;
    --                                                                                                     RC
    chaine.rc := TRIM(SUBSTR(vLigne, tPosition(14), tLongueur(14)));
    If chaine.rc is not null then
    If length(chaine.rc) <= 6 then
      formule.rc := chaine.rc;
    Else
       f_insert := 0;
       lerreur := lerreur||'(RC, LONGUEUR MAX DE 6 DEPASSEE)';  
    End If;
    else
    formule.rc := chaine.rc;
    End If;
    --                                                                                                     RAISON SOCIALE
    chaine.RAISON_SOCIALE := TRIM(SUBSTR(vLigne, tPosition(15), tLongueur(15)));
    If chaine.RAISON_SOCIALE is not null then
    If length(chaine.RAISON_SOCIALE) <= 70 then
      formule.RAISON_SOCIALE := chaine.RAISON_SOCIALE;
    Else
       f_insert := 0;
       lerreur := lerreur||'(RS, LONGUEUR MAX DE 70 DEPASSEE)';  
    End If;
    else
    formule.RAISON_SOCIALE := chaine.RAISON_SOCIALE;
    End If;
    --                                                                                                     ADRESSE
    chaine.adresse :=  TRIM(SUBSTR(vLigne, tPosition(16), tLongueur(16)));
    If chaine.adresse is not null then
    If length(chaine.adresse) <= 70 then
      formule.adresse := chaine.adresse;
    Else
       f_insert := 0;
       lerreur := lerreur||'(ADRESSE, LONGUEUR MAX DE 70 DEPASSEE)';  
    End If;
    else
    formule.adresse := chaine.adresse;
    End If;
    --                                                                                                     VILLE
    chaine.ville :=  TRIM(SUBSTR(vLigne, tPosition(17), tLongueur(17)));
    If chaine.ville is not null then
    If length(chaine.ville) <= 25 then
      formule.ville := chaine.ville;
    Else
       f_insert := 0;
       lerreur := lerreur||'(VILLE, LONGUEUR MAX DE 25 DEPASSEE)';  
    End If;
    else
    formule.ville := chaine.ville;
    End If;
    --                                                                                                     CODE DEVISE
    chaine.code_devise := TRIM(SUBSTR(vLigne, tPosition(18), tLongueur(18)));
    If  chaine.code_devise is not null then
    If length(chaine.code_devise) <= 3 then
      formule.code_devise := chaine.code_devise;
    Else
       f_insert := 0;
       lerreur := lerreur||'(CODE_DEVISE, LONGUEUR MAX DE 3 DEPASSEE)';  
    End If;
    else
    formule.code_devise := chaine.code_devise;
    End If;
    --                                                                                                     MONTANT DEVISE
    chaine.montant_devise := TRIM(SUBSTR(vLigne, tPosition(19), tLongueur(19)));
    If chaine.montant_devise is not null then
    If foba.isnumeric(chaine.montant_devise) then
    If length(chaine.montant_devise) <= 14 then
      If instr(chaine.montant_devise, ',') > 0 then
         select substr(chaine.montant_devise,1, instr(chaine.montant_devise, ',')-1), substr(chaine.montant_devise, instr(chaine.montant_devise, ',')+1) 
         into   v_entiere, v_decimale from dual;
      elsif instr(chaine.montant_devise, '.') > 0 then
         select substr(chaine.montant_devise,1, instr(chaine.montant_devise, '.')-1), substr(chaine.montant_devise, instr(chaine.montant_devise, '.')+1) 
         into   v_entiere, v_decimale from dual;
      else 
           v_entiere := chaine.montant_devise;
           v_decimale := null;
      end if;
      if (length(v_entiere) > 10 or length(nvl(v_decimale, '1')) > 3) then
       f_insert := 0;
       lerreur := lerreur||'(MNT_DEVISE, FORMAT NUMERIQUE(13,3) NON RESPECTE)';  
      else
      formule.montant_devise := chaine.montant_devise;
      end if;
    Else
       f_insert := 0;
       lerreur := lerreur||'(MNT_DEVISE, LONGUEUR MAX DE 14 DEPASSEE)';  
    End If;
    Else
       f_insert := 0;
       lerreur := lerreur||'(MNT_DEVISE, DOIT ETRE NUMBER)'; 
    End If;
    else
    formule.montant_devise := chaine.montant_devise;
    End If;
    --                                                                                                         COURS
    chaine.cours :=TRIM(SUBSTR(vLigne, tPosition(20), tLongueur(20)));
    If chaine.cours is not null then
    If foba.isnumeric(chaine.cours) then
    If length(chaine.cours) <= 9 then
      formule.cours := chaine.cours;
    Else
       f_insert := 0;
       lerreur := lerreur||'(COURS, LONGUEUR MAX DE 9 DEPASSEE)';  
    End If;
    Else
       f_insert := 0;
       lerreur := lerreur||'(COURS, DOIT ETRE NUMBER)'; 
    End If;
    else
    formule.cours := chaine.cours;
    End If;
    --                                                                                                         MONTANT DHS
    chaine.montant_dhs :=TRIM(SUBSTR(vLigne, tPosition(21), tLongueur(21)));
    If chaine.montant_dhs is not null then
    If foba.isnumeric(chaine.montant_dhs) then
    If length(chaine.montant_dhs) <= 14 then
         If instr(chaine.montant_dhs, ',') > 0 then
         select substr(chaine.montant_dhs,1, instr(chaine.montant_dhs, ',')-1), substr(chaine.montant_dhs, instr(chaine.montant_dhs, ',')+1) 
         into   v_entiere, v_decimale from dual;
      elsif instr(chaine.montant_dhs, '.') > 0 then
         select substr(chaine.montant_dhs,1, instr(chaine.montant_dhs, '.')-1), substr(chaine.montant_dhs, instr(chaine.montant_dhs, '.')+1) 
         into   v_entiere, v_decimale from dual;
      else 
           v_entiere := chaine.montant_dhs;
           v_decimale := null;
      end if;
      --
      if (length(v_entiere) > 10 or length(nvl(v_decimale, '1')) > 3) then
       f_insert := 0;
       lerreur := lerreur||'(MT_DHS, FORMAT NUMERIQUE(13,3) NON RESPECTE)';  
      else
      formule.montant_dhs := chaine.montant_dhs;
      end if; 
    Else
       f_insert := 0;
       lerreur := lerreur||'(MT_DHS, LONGUEUR MAX DE 14 DEPASSEE)';  
    End If;
    Else
       f_insert := 0;
       lerreur := lerreur||'(MT_DHS, DOIT ETRE NUMBER)'; 
    End If;
    else
    formule.montant_dhs := chaine.montant_dhs;
    End If;
    --                                                                                                          DATE EXECUTION
    chaine.date_execution := TRIM(SUBSTR (vLigne, tPosition (22), tLongueur (22))); 
    If chaine.date_execution is not null then
    If foba.isnumeric(chaine.date_execution) then
    If length(chaine.date_execution) <= 8 then
      Begin
         formule.date_execution := to_char(to_date(chaine.date_execution, 'DD/MM/YYYY'));
      Exception When Others then 
         f_insert := 0;
       lerreur := lerreur||'(DATE_EXECUTION, DATE INCORRECTE)';
      End;
    Else
       f_insert := 0;
       lerreur := lerreur||'(DATE_EXECUTION, LONGUEUR MAX DE 8 DEPASSEE)';  
    End If;
    Else
       f_insert := 0;
       lerreur := lerreur||'(DATE_EXECUTION, DOIT ETRE NUMBER)'; 
    End If;
    else
    formule.date_execution := chaine.date_execution;
    End If;
    --                                                                                                            CODE BIC
    chaine.code_bic := TRIM(SUBSTR(vLigne, tPosition(23), tLongueur(23)));
    If chaine.code_bic is not null then
    If length(chaine.code_bic) <= 30 then
      formule.code_bic := chaine.code_bic;
    Else
       f_insert := 0;
       lerreur := lerreur||'(CODE_BIC, LONGUEUR MAX DE 30 DEPASSEE)';  
    End If;
    else
    formule.code_bic := chaine.code_bic;
    End If;
    --                                                                                                             NUM_FORMULE
    chaine.num_formule := TRIM(SUBSTR(vLigne, tPosition(24), tLongueur(24)));
    If chaine.num_formule is not null then
    If foba.isnumeric(chaine.num_formule) then
    If length(chaine.num_formule) <= 6 then
      formule.num_formule := chaine.num_formule;
    Else
       f_insert := 0;
       lerreur := lerreur||'(NUM_FORMULE, LONGUEUR MAX DE 6 DEPASSEE)';  
    End If;
    Else
       f_insert := 0;
       lerreur := lerreur||'(NUM_FORMULE, DOIT ETRE NUMBER)'; 
    End If;
    else
    formule.num_formule := chaine.num_formule;
    End If;
    --                                                                                                              NUM DOSSIER
    chaine.num_dossier := TRIM(SUBSTR(vLigne, tPosition(25), tLongueur(25)));
    If chaine.num_dossier is not null then
    If length(chaine.num_dossier) <= 30 then
      formule.num_dossier := chaine.num_dossier;
    Else
       f_insert := 0;
       lerreur := lerreur||'(NUM_DOSSIER, LONGUEUR MAX DE 30 DEPASSEE)';  
    End If;
    else
    formule.num_dossier := chaine.num_dossier;
    End If;
    --  
    formule.id_formule := FOBA.FOBA_OC_SQ_ID_FBBRUTES.nextval ;
    chaine.id_formule := formule.id_formule;
    --
    --              FIN DE LECTURE DE FICHIER FORMULES
    --
    -- Ce traitement ne sera execute que si f_insert reste = 1 apres l'examen de structure
    If f_insert = 1 Then null;
    --TRAITEMENT
    Else
     v_nbre_erreur := v_nbre_erreur + 1;
     Update FOBA.P_INDICATEURS set nombre = nombre + 1 where type_indicateur = 'C' and id_indicateur = 3 and id_chargement = p_id_chargement;
     --
     INSERT INTO FOBA.P_INDICATEUR_LIGNES (ID_CHARGEMENT, ID_FORMULE, CODE_LIGNE, CODE_BANQUE, CODE_LOCALITE, CODE_GUICHET, 
        CODE_BIC, RAISON_SOCIALE,  QUALITE_DO, CATEGORIE_NTITRE, NUM_IDENTIFICATION , CENTRE, RC, 
        date_dom_titre, ref_circulaire, date_autorisation,
        CODE_PAYS, VILLE, ADRESSE,    DONNEUR_ORDRE, PAYS_PARTENAIRE,    SENS, CATEGORIE, 
        CODE_OPERATION, PAYS_FONDS,  CODE_DEVISE, MONTANT_DEVISE, COURS, MONTANT_DHS, 
        DATE_EXECUTION, NUM_AUTORISATION, NUM_FORMULE , NUM_DOSSIER , INFOS_OPERATION, ID_USER_CREATE, DATE_CREATE, NOM_FICHIER,ID_INDICATEUR,TYPE_INDICATEUR,LIBELLE,NIVEAU_ERREUR  )
      VALUES ( P_ID_CHARGEMENT, formule.ID_FORMULE ,  chaine.code_ligne,  chaine.code_banque,chaine.code_localite,chaine.code_guichet,
        chaine.code_bic, chaine.raison_sociale,  chaine.qualite_do , chaine.CATEGORIE_NTITRE, chaine.num_identification , chaine.centre , chaine.rc , 
        chaine.date_dom_titre, chaine.ref_circulaire, chaine.date_autorisation,
        chaine.CODE_PAYS, chaine.ville, chaine.adresse, chaine.DONNEUR_ORDRE,  chaine.PAYS_PARTENAIRE,  chaine.sens, chaine.categorie,
        chaine.code_operation, chaine.PAYS_FONDS, chaine.code_devise, chaine.montant_devise,  chaine.cours,  chaine.montant_dhs , 
        chaine.date_execution,  chaine.num_autorisation, chaine.num_formule,  chaine.num_dossier, chaine.infos_operation,  Utilisateur  , chaine.date_create, Fichier,3,'C', lerreur, 'E');
    End If;
    -- Insertion formules_b
    --
    If f_insert = 1 Then
    INSERT INTO foba.FORMULES_B (ID_CHARGEMENT, ID_FORMULE, CODE_LIGNE, CODE_BANQUE, CODE_LOCALITE, CODE_GUICHET, 
           CODE_BIC, RAISON_SOCIALE,  QUALITE_DO, CATEGORIE_NTITRE, NUM_IDENTIFICATION , CENTRE, RC, 
           date_dom_titre, ref_circulaire, date_autorisation,
           CODE_PAYS, VILLE, ADRESSE,    DONNEUR_ORDRE, PAYS_PARTENAIRE,    SENS, CATEGORIE, 
            CODE_OPERATION, PAYS_FONDS,  CODE_DEVISE, MONTANT_DEVISE, COURS, MONTANT_DHS, 
            DATE_EXECUTION, NUM_AUTORISATION, NUM_FORMULE , NUM_DOSSIER , INFOS_OPERATION, ID_USER_CREATE, DATE_CREATE, NOM_FICHIER,
            INFOS_SUPP1, INFOS_SUPP2, INFOS_SUPP3, INFOS_SUPP4,INFOS_SUPP5  )    
           VALUES ( P_ID_CHARGEMENT, formule.ID_FORMULE ,  formule.code_ligne,  formule.code_banque,formule.code_localite,formule.code_guichet,
            formule.code_bic, formule.raison_sociale,  formule.qualite_do , formule.CATEGORIE_NTITRE, formule.num_identification , formule.centre , formule.rc ,
            formule.date_dom_titre,  formule.ref_circulaire, formule.date_autorisation,
             formule.CODE_PAYS, formule.ville, formule.adresse, formule.DONNEUR_ORDRE,  formule.PAYS_PARTENAIRE,  formule.sens, formule.categorie,
             formule.code_operation, formule.PAYS_FONDS, formule.code_devise, formule.montant_devise,  formule.cours,  formule.montant_dhs , 
             formule.date_execution,  formule.num_autorisation, formule.num_formule,  formule.num_dossier, formule.infos_operation,  Utilisateur  , formule.date_create, Fichier,
             formule.infos_supp1,  formule.infos_supp2, formule.infos_supp3,  formule.infos_supp4, formule.infos_supp5  );
 
        commit;
       End If;
     end if;
     --end if;
     exception          
          when no_data_found then    
          UTL_FILE.fCLOSE(id);
          exit;
        end;
        --V_NUMLIGNE := V_numLigne +1;
        --end loop;
  END LOOP;
  --
  --
  --
  -- Inserrer en tables Intermediaires
  --
  Insert into foba.formules_t select * from foba.FORMULES_B where id_chargement = p_id_chargement;
  --Insert into foba.formules_t_titres select * from foba.FORMULES_B_titres where id_chargement = p_id_chargement;
  --
  FOBA.CHARGEMENT.INDICATEUR_CHARGEMENT (1,null, P_ID_CHARGEMENT, P_NBRE_AVERT, P_NBRE_ERREUR, P_NBRE_REJETS, P_NMES, P_LMES);
--
--
--
P_NBRE_ERREUR := P_NBRE_ERREUR + V_NBRE_ERREUR;   -- On y rajoute les erreurs suite aux controles ci haut
P_NBRE_AVERT := P_NBRE_AVERT + V_NBRE_AVERT;   -- On y rajoute les warnings suite aux controles ci haut
Exception 
  when abondon  then 
    P_NMES:=50;
    P_LMES :=  lerreur;
    --P_LMES:=verreur||'_'||v_trace||'_'||repertoire;
 when others then 
    P_NMES:=sqlcode;
    verreur :=  Sqlerrm;
    --P_LMES:=verreur||'_'||v_trace||'_'||repertoire;
    P_LMES:=verreur;
END;