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

PL/SQL Oracle Discussion :

[11g] Conversion de CLOB en NUMBER


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 115
    Points : 59
    Points
    59
    Par défaut [11g] Conversion de CLOB en NUMBER
    Bonjour,
    Je n'arrive pas à convertir une partie d'un champ de type CLOB en NUMBER.
    Peut-être pouvez-vous m'aider.

    Voici la description de mes tables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Create Table  MaTableInit (Tb1Ch1 VARCHAR2(9), Tb1Ch2 NUMBER, Tb1Ch3 CLOB);
    Create Table  MaTableFinale (Tb2Ch1 VARCHAR2(9), Tb2Ch2 NUMBER, Tb2Ch3 NUMBER);
    La table initiale contient des enregistrements dont le champ Tb1Ch3 doit être "normalisé" pour que son contenu soit ajouté dans la table finale.
    Par normalisation, j'entends extraction d'un certain nombre de caractère que Tb1Ch3 pour en faire un tuple dans la table finale. Il est possible de faire plusieurs tuples "finaux" à partir des données du Tb1Ch3...

    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
     
    DECLARE
     CURSOR c_moncurseur IS
        SELECT Tb1Ch1, Tb1Ch2, Tb1Ch3  FROM MaTableInit;
    BEGIN
      FOR moncurs IN c_moncurseur LOOP
        IF Tb1Ch2>0 THEN
          FOR j IN 1..Tb1Ch2 LOOP
            INSERT INTO MaTableFinale(Tb2Ch1, Tb2Ch2, Tb2Ch3)
            VALUES (Tb1Ch1, j, SUBSTR(SUBSTR(Tb1Ch3,(10*(j-1))+1,10),13,3));
          END LOOP;
        END IF;
      END LOOP;
      COMMIT;
    END;
    /
    J'obtiens l'erreur Oracle suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PL/SQL: ORA-00932: types de données incohérents ; attendu : NUMBER ; obtenu : CLOB
    Lorsque j'ajoute TO_NUMBER() autour de mes SUBSTR(), cela ne marche toujours pas...

    Auriez-vous une astuce pour que cela fonctionne ?
    Merci beaucoup
    EiramO

  2. #2
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Commencez par nous dire votre version d'Oracle SVP.

  3. #3
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 115
    Points : 59
    Points
    59
    Par défaut
    Pardon, je n'ai pas pensé à l'indiquer.
    Je suis sous Oracle 11gR2

  4. #4
    Membre habitué
    Inscrit en
    Septembre 2010
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 82
    Points : 140
    Points
    140
    Par défaut
    Je te conseillerai d'éviter d'utiliser une procédure/code PL/SQL pour faire ce que tu veux faire. Je pense que tu peux t'en sortir avec un simple INSERT...SELECT.

    J'ai rapidement fais un scénario pour tester que c'est faisable.

    1- Je crée une table avec un CLOB. Comme tu peux voir dans l'exemple, je génère une chaine de 100000 caractères. Ensuite, je la met a jour pour y insérer au début un certain nombre (dans ce cas-ci j'ai mis 212). J'ai éviter de le mettre au début.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TABLE my_clob_table
    (
      col_1 NUMBER(10), 
      col_2 CLOB
    );
     
    INSERT INTO my_clob_table 
     VALUES(1, dbms_random.string('a', 100000));
     
    UPDATE my_clob_table 
       SET col_2 = 'xx-212' || col_2
     WHERE col_1 = 1;
    Ensuite, il suffit de savoir de où extraire le nombre. Dans ce cas-ci, la requête suivante peut faire l'affaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT col_1, TO_NUMBER(dbms_lob.substr(col_2, 3, 4))
      FROM my_clob_table;
    Si tu me dis comment sont structurés tes CLOB et d'où tu dois tirer ton info (position...), je pourrais peut-être compléter cet exemple-ci

  5. #5
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 115
    Points : 59
    Points
    59
    Par défaut
    Bonjour,
    Merci de m'avoir répondu. J'ai fini par trouver la solution.
    En fait, j'avais une erreur de conversion en numérique parce que la chaine extraite pouvait contenir des espaces vides...
    En faisant un TO_NUMBER(TRIM(...)), le problème a été résolu...

    Encore merci et bonne journée,
    MarieO

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

Discussions similaires

  1. Conversion de varchar en number
    Par nathieb dans le forum PL/SQL
    Réponses: 7
    Dernier message: 24/10/2008, 11h03
  2. Conversion de Clob a String failed
    Par mona dans le forum JDBC
    Réponses: 1
    Dernier message: 16/10/2008, 22h24
  3. Conversion Document/Clob ?
    Par leo13 dans le forum Général Java
    Réponses: 5
    Dernier message: 04/05/2007, 14h31
  4. [Oracle 9] Conversion d'un format number en heure
    Par Rycku dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/06/2006, 11h48
  5. [DB2] conversion BLOB -> CLOB
    Par Fabien Celaia dans le forum DB2
    Réponses: 12
    Dernier message: 12/07/2004, 12h09

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