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

Oracle Discussion :

Overflow avec dbms_lob.loadclobfromfile


Sujet :

Oracle

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur
    Inscrit en
    Juin 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2009
    Messages : 171
    Par défaut Overflow avec dbms_lob.loadclobfromfile
    Bonjour à tous,

    J'utilise la méthode dbms_lob.loadclobfromfile pour uploader des fichiers XML dans ma base de données. Jusqu'ici, tout allait bien, mais depuis peu le fichier semble trop volumineux et me ressort l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ORA-01426: numeric overflow
    ORA-06512: at "MONSCHEMA.INSDB", line 98
    ORA-06512: at line 1
    Comment confirmer cela ? Est-il possible de faire quelque chose ou faut-il chercher un nouveau moyen de faire ?

    Voici l'appel de la fonction dans ma procédure stockée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    dbms_lob.loadclobfromfile(
          L$Blob,       -- CLOB de destination
          L$Bfile,      -- Pointeur de fichier en entrée
          LN$Len,       -- Nombre d'octets à lire
          LN$src_off,   -- Position source de départ
          LN$dst_off,
          LN$Bfile_Csid,
          LN$Lang,
          LN$Warn
        );
    Merci d'avance pour toute remarque !

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Difficile (pour ne pas dire impossible) à debugger ça avec seulement les informations founis. Commencer par nous montrer l'instruction se trouvant à la ligne 98; c'est le loadclobfromfile ou autre ?

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur
    Inscrit en
    Juin 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2009
    Messages : 171
    Par défaut
    Voici ma procédure stockée :

    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
    create or replace
    PROCEDURE INSDB
    (
      PC$Filepath IN VARCHAR2
    ) 
    IS
    LN$Curseur NUMBER := 1;
    LN$CurrentPos NUMBER := 1;
    LN$LastPos    NUMBER := 1;
     
    LN$Id  NUMBER := 0;
    LN$BCode  VARCHAR2(255);
    LN$Date  VARCHAR2(255);
    LN$Source VARCHAR2(255);
    LN$IsGoodText VARCHAR2(255);
    LN$IsGood  NUMBER := 0;
    LN$Bfile_Csid VARCHAR2(255) := NLS_CHARSET_ID('UTF8');
    LN$Lang  NUMBER := DBMS_LOB.DEFAULT_LANG_CTX;
    LN$Warn NUMBER := 0;
     
    L$Blob CLOB;
    L$Bfile BFILE ;
    LN$Len NUMBER := dbms_lob.lobmaxsize;
    LN$src_off PLS_INTEGER := 1 ;
    LN$dst_off PLS_INTEGER := 1 ;
     
    BEGIN
     
      IF PC$Filepath IS NOT NULL THEN
     
        FOR LN$Curseur IN 1..4
        LOOP
     
          LN$CurrentPos := INSTR(PC$Filepath, '_', LN$LastPos) - LN$LastPos;
     
          CASE LN$Curseur
            WHEN 1 THEN LN$BCode     := SUBSTR(PC$Filepath, LN$LastPos, LN$CurrentPos) ;
            WHEN 2 THEN LN$Date       := SUBSTR(PC$Filepath, LN$LastPos, LN$CurrentPos) ;
            WHEN 3 THEN LN$Source     := SUBSTR(PC$Filepath, LN$LastPos, LN$CurrentPos) ;
            WHEN 4 THEN LN$IsGoodText := SUBSTR(PC$Filepath, LN$LastPos, LN$CurrentPos) ;
          ELSE
            EXIT;
          END CASE;
     
          LN$LastPos := LN$LastPos + LN$CurrentPos + 1;
     
        END LOOP;
     
        CASE UPPER(LN$IsGoodText)
          WHEN 'D' THEN LN$IsGood := 0;
          WHEN 'G' THEN LN$IsGood := 1;
        END CASE;
     
        INSERT INTO MONSCHEMA.uf (I, B, ID, IG, S, D, IP) VALUES (NULL, LN$BCode, LN$Date, LN$IsGood, LN$Source, empty_clob(), 0);
     
        SELECT upseq.currval INTO LN$Id FROM dual;
     
        SELECT datas INTO L$Blob FROM MONSCHEMA.T1 WHERE id = LN$Id FOR  UPDATE;
     
        L$Bfile := BFILENAME( 'DDIR', PC$Filepath );
     
        dbms_lob.fileopen(L$Bfile, dbms_lob.file_readonly);
     
        dbms_lob.loadclobfromfile(
          L$Blob,       -- CLOB de destination
          L$Bfile,      -- Pointeur de fichier en entrée
          LN$Len,       -- Nombre d'octets à lire
          LN$src_off,   -- Position source de départ
          LN$dst_off,
          LN$Bfile_Csid,
          LN$Lang,
          LN$Warn
        );
     
        dbms_lob.fileclose(L$Bfile);
     
        COMMIT;
     
      END IF;
     
      EXCEPTION WHEN OTHERS THEN 
      ROLLBACK;
      RAISE;
     
    END;

    La ligne retournée comme étant en erreur est celle contenant : EXCEPTION WHEN OTHERS THEN

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Votre bloc d'exception en l'état ne sert à rien si ce n'est à perdre la vraie ligne d'erreur.

    Supprimez-le et re-testez !

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur
    Inscrit en
    Juin 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2009
    Messages : 171
    Par défaut
    Effectivement, merci pour l'info !

    Du coup, après ré-exécution la ligne en erreur est la 63, elle correspond bien à la fonction dbms_lob.loadclobfromfile.

  6. #6
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Ca veut dire que vous appelez mal la procédure. Je regarderais

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur
    Inscrit en
    Juin 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2009
    Messages : 171
    Par défaut
    Jusqu'ici tout fonctionnait parfaitement bien.

    Cependant le volume de données que nous traitons a augmenté récemment (+20% à +30%) et les fichiers XML commencent à être particulièrement volumineux, environ 2.5Go.

  8. #8
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Mettez dbms_lob.getlength(v_bfile) à la place de LN$Len.

  9. #9
    Membre confirmé
    Homme Profil pro
    Développeur
    Inscrit en
    Juin 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2009
    Messages : 171
    Par défaut
    Merci pour l'info !

    J'ai tenté de mettre dbms_lob.getlength(L$Bfile) à la place de LN$Len mais le résultat reste le même : numeric overflow.

  10. #10
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    LobMaxSize est OK!
    Affichez la taille (dbms_lob.getlength(v_bfile)) juste avant d'appeler loadclobfromfile ainsi que LN$src_off et LN$dst_off.
    Re mettez le bloc d'exception et affichez LN$src_off et LN$dst_off quand il y en exception.

  11. #11
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    D'après la doc, vous aviez raison d'utiliser DBMSLOB.LOBMAXSIZE pour charger le fichier en entier, mais je ne sais pas si vous pouvez le référencer tel que vous l'avez écrit. Replacez directement la formule au niveau de la fonction.

    Par contre je ne vois pas d'initialisation du LOB.

    Que donne ce bout de code :
    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
        DBMS_LOB.CREATETEMPORARY(L$Blob, TRUE);
        L$Bfile := BFILENAME( 'DDIR', PC$Filepath );
     
        dbms_lob.fileopen(L$Bfile, dbms_lob.file_readonly);
     
        dbms_lob.loadclobfromfile(
          L$Blob,              -- CLOB de destination
          L$Bfile,             -- Pointeur de fichier en entrée
          dbms_lob.lobmaxsize, -- Nombre d'octets à lire
          LN$src_off,          -- Position source de départ
          LN$dst_off,
          LN$Bfile_Csid,
          LN$Lang,
          LN$Warn
        );
     
        dbms_lob.fileclose(L$Bfile);
        DBMS_LOB.FREETEMPORARY(L$Blob);

  12. #12
    Membre confirmé
    Homme Profil pro
    Développeur
    Inscrit en
    Juin 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2009
    Messages : 171
    Par défaut
    Merci pour votre aide !

    Pour ce qui est des logs :

    Avant la procédure :
    dbms_lob.getlength(v_bfile) = 2 416 816 468
    LN$src_off = 1
    LN$dst_off = 1

    Idem lorsque l'exception apparait.



    Pour ce qui est du bout de code, je l'ai testé à la place de ce que j'avais et le résultat reste le même pour le moment, numeric overflow.

  13. #13
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Au passage, quelle est votre version d'Oracle ?

  14. #14
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Initialisez LN$Len avec une valeur inférieure à 2 000 000 et ré exécutez en passant la variable avec cette valeur à la procédure. Est-ce que ça passe ?

  15. #15
    Membre confirmé
    Homme Profil pro
    Développeur
    Inscrit en
    Juin 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2009
    Messages : 171
    Par défaut
    Je suis en version 11.2.0.2.0.

    J'ai tenté d'initialiser la variable LN$Len à 1500000 et le script est passé super rapidement... Que dois-je en déduire ? Que je dépasse la limite autorisé ?
    Pourtant il me semble avoir vu que jusqu'à 4Go ca devrait passer...

  16. #16
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Pourriez-vous aussi remplacer les déclarations des variables en PLS_Integer (LN$src_off et LN$dst_off) par Integer ou Number(38) et ré exécuter votre procédure d'origine (sans le bloc exception bien sûr) ?

  17. #17
    Membre confirmé
    Homme Profil pro
    Développeur
    Inscrit en
    Juin 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2009
    Messages : 171
    Par défaut
    J'ai remplacé par du NUMBER, le fichier est passé... Merci beaucoup !
    Par contre je ne comprend vraiment pas pourquoi ! Est-ce possible d'avoir une explication ? Je tente de tout lancé ce soir et je confirme demain que tout est ok ! Merci !!

  18. #18
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Si vous regardez dans le package sys.standard:

    pls_integer est binary_integer
    binary integer est integer range '-2147483647'..2147483647

    Et comme la longeur du fichier est cette fois ci 2 416 816 468 > 2 147 483 647...

    Par contre integer est number(38,0) et dans la procédure en question les arguments sont bien en integer!

  19. #19
    Membre confirmé
    Homme Profil pro
    Développeur
    Inscrit en
    Juin 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2009
    Messages : 171
    Par défaut
    Parfait, merci beaucoup !
    Elle était bien cachée celle la...

    Je le mets en résolu, tout semble ok !

    Encore merci !

  20. #20
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Bravo mnitu !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Message "BCD Overflow" avec ADO sous Delphi6
    Par Gugli dans le forum Bases de données
    Réponses: 1
    Dernier message: 21/01/2008, 18h57
  2. " Stack overFlow " avec IE
    Par lion13 dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 21/11/2007, 21h49
  3. problème overflow avec asp
    Par franfr57 dans le forum ASP
    Réponses: 2
    Dernier message: 03/07/2007, 23h50
  4. problème d'overflow avec variable type double
    Par ben83 dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 15/02/2007, 09h55
  5. Overflow avec tableau statique
    Par oxor3 dans le forum C++
    Réponses: 2
    Dernier message: 23/12/2005, 06h42

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