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 :

Replace dans un CLOB


Sujet :

PL/SQL Oracle

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 4
    Par défaut Replace dans un CLOB
    Bonjour à tous, étant débutant en PL / SQL, j'aurais besoin d'un petit coup de main.
    En fait le but de mon programme serait de rechercher toutes les occurrences "<td></td>" dans les colonnes d'une table et les remplacer par "<td>&nbsp;<td>".
    En cherchant sur le forum, j'ai trouvé un bout de code, adapté donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    DECLARE
    v_update VARCHAR2(4000);
    BEGIN
    For tab IN (SELECT contenu, id FROM TABLE_HTML)
    LOOP
    v_update := 'UPDATE TABLE_HTML SET NAME =
    REPLACE('''||tab.contenu||''',
    ''<td></td>'',''<td>'||chr(38)||'nbsp;</td>'') WHERE ID ='||tab.ID;
    DBMS_OUTPUT.PUT_LINE( v_update ) ;
    EXECUTE IMMEDIATE v_update;
    END LOOP;
    END;
    Ce code marche pour une table TABLE_HTML(ID NUMBER(19), CONTENU VARCHAR2(255))

    Mais en fait, le schéma de ma table est TABLE_HTML(ID NUMBER(19), CONTENU CLOB). Du coup ça ne passe pas
    Si quelqu'un pouvait m'aider ce serait vraiment sympa.
    Merci d'avance.

  2. #2
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Qu'est-ce qui ne passe pas ? quelle est la version de la base ? (que vous devriez indiquer systématiquement)

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 4
    Par défaut
    La version de la base est Oracle9i. (désolé de pas avoir précisé)
    Lorsque j'exécute j'obtiens l'erreur :

    ORA-20000: ORU-10028: line length overflow, limit of 255 chars per line
    ORA-06512: à "SYS.DBMS_OUTPUT", ligne 35
    ORA-06512: à "SYS.DBMS_OUTPUT", ligne 133
    ORA-06512: à ligne 7

    (la ligne 7 correspondant à la ligne : DBMS_OUTPUT.PUT_LINE( v_update ) ; )

    Lorsque je retire cette ligne j'obtiens l'erreur :
    ORA-00907: Parenthèse de droite absente
    ORA-06512: à ligne 7
    (la ligne 7 est : EXECUTE IMMEDIATE v_update; )

    Merci.

  4. #4
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    DBMS_OUTPUT ne permet pas d'afficher des lignes de plus de 255 caractères.
    Si vous voulez comprendre d'où vient le problème de syntaxe, je vous conseille de sortir votre string dans une colonne de table, afin de faire un copie/coller dans Toad ou Sql*Plus, sinon, vous travaillez en aveugle et risquez de perdre beaucoup de temps à comprendre.

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 4
    Par défaut
    Merci pour le conseil, je pense avoir compris mon erreur, lorsque je fais le :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    REPLACE('''||tab.contenu||''',
    ''<td></td>'',''<td>'||chr(38)||'nbsp;</td>'') WHERE ID ='||tab.ID;
    tab.contenu contient des caractères ', c'est pour cela qu'il y a le message d'erreur:
    ORA-00907: Parenthèse de droite absente

    Y aurait il un moyen simple de rajouter un caractère d'échappement avant chaque apostrophe dans mon cas. merci.

  6. #6
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Replace(tab.contenu, '''', '''''');

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 4
    Par défaut
    Merci pour ton aide, c'est effectivement ce que j'ai fait, et ça marche, mais il y a toujours un petit problème malheureusement, sur certain fichiers, j'obtiens l'erreur :

    ORA-06502: PL/SQL : erreur numérique ou erreur sur une valeur
    ORA-06512: à ligne 10

    Cela à l'air d'être dû au fait que :
    v_update VARCHAR2(4000);
    soit trop petit pour contenir tout le texte contenu par "tab.contenu", du coup j'ai testé : v_update CLOB;
    Mais j'obtiens alors l'erreur :

    ORA-06550: Ligne 11, colonne 19 :
    PLS-00382: expression du mauvais type
    ORA-06550: Ligne 11, colonne 1 :
    PL/SQL: Statement ignored

    En effet, on ne peut pas faire de EXECUTE IMMEDIATE sur un BLOB.
    Du coup, j'aurais aimé savoir comment je pourrais traiter ce probleme, existe-t-il une commande pour executer directement un BLOB ou dois-je parser le BLOB en varchar?
    Merci beaucoup pour ton aide.

  8. #8
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Dans un bloc PL/SQL, une variable varchar2 peut-être dimensionnée à 32768 max. Si votre CLOB contient plus que cela, il faudra utiliser les fonctions du package DBMS_LOB

Discussions similaires

  1. Utilisation de REPLACE() dans un programme PL/SQL
    Par Djene dans le forum PL/SQL
    Réponses: 8
    Dernier message: 10/12/2009, 11h30
  2. Réponses: 22
    Dernier message: 14/04/2006, 17h01
  3. replacement dans MySQL
    Par caro_tpl dans le forum Requêtes
    Réponses: 1
    Dernier message: 04/01/2006, 10h11
  4. Utilisation de replace dans champs text
    Par cdelamarre dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 01/12/2004, 17h26
  5. REPLACE dans un UPDATE
    Par outdial dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/09/2004, 11h00

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