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 :

Convertir un champ CLOB


Sujet :

Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2006
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 39
    Points : 16
    Points
    16
    Par défaut Convertir un champ CLOB
    Bonjour,

    j'ai besoin de changer la structure d'une table en modifiant un champs de type CLOB à un type VARCHAR2(4000).

    Est ce possible sachant que la table est pleine et surtout il ya des données stockées dans ce champs??
    je tiens avous informer que l'os du systeme est windows est le sgbd est oracle 10g et merci

  2. #2
    Membre éclairé Avatar de plabrevo
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 547
    Points : 670
    Points
    670
    Par défaut
    La reponse est non, la sanction est un ORA-22859, comme un test rapide le montre aisement.

    Error: ORA-22859
    Text: invalid modification of columns
    ---------------------------------------------------------------------------
    Cause: An attempt was made to modify an object, REF, VARRAY, nested table, or LOB column type.
    Action: Create a new column of the desired type and copy the current column data to the new type using the appropriate type constructor.

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2006
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 39
    Points : 16
    Points
    16
    Par défaut
    Je sais que la reponse est non et que la sanction est un ORA-22859 c'est pour cette raison la que je cherche une méthode pour faire convertir ce champ sans perdre les données il y a absolument une solution pour le faire??

  4. #4
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 88
    Points : 95
    Points
    95
    Par défaut
    Bonjour,
    je crois que le message oracle est clair pourtant.

    1. On crée une nouvelle colonne de type varchar2(4000)
    2. On remplit la nouvelle colonne en utilisant l'ancienne colonne (attention à la conversion)
    3. Si le résultat est OK, on détruit l'ancienne colonne.

    @+,
    NicK.

  5. #5
    Membre à l'essai
    Inscrit en
    Février 2006
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 39
    Points : 16
    Points
    16
    Par défaut
    mais pouvez vous m'expliquer comment remplir la nouvelle colonne en utilisant l'ancienne colonne sachant que dans oracle on ne voit pa les données de CLOB et bien sur il y a des contraintes et des declancheurs??
    Merci

  6. #6
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    1/ Tu désactives les contraintes/triggers sur ta table
    2/ Tu crées ta nouvelle colonne VARCHAR2
    3/ Tu fais un UPDATE en utilisant DBMS_LOB.substr pour ne récupérer que les 4000 premiers caractères de ton CLOB
    4/ Tu supprimes ton CLOB
    5/ Tu remets les contraintes/triggers.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  7. #7
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    pour le faire "online", regarde le package DBMS_REDEFINITION

  8. #8
    Membre à l'essai
    Inscrit en
    Février 2006
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 39
    Points : 16
    Points
    16
    Par défaut
    SVP j-ai pas bien saisie comment le faire si vous pouvez m'expliquer plus comment?? et merci

  9. #9
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    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
     
    ALTER TRIGGER TRG_BEFORE_UPDATE_CO DISABLE 
    /
     
    ALTER TABLE TCOMMENT
    ADD CLOB2CHAR VARCHAR2(4000)
    /
    UPDATE TCOMMENT 
    SET CLOB2CHAR = dbms_lob.SUBSTR(commentaire, 4000,1)
    /
    COMMIT
    /
    ALTER TABLE TCOMMENT DROP COLUMN COMMENTAIRE
    /
    ALTER TABLE TCOMMENT RENAME CLOB2CHAR TO COMMENTAIRE
    /
    ALTER TRIGGER TRG_BEFORE_UPDATE_CO ENABLE
    /
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  10. #10
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 88
    Points : 95
    Points
    95
    Par défaut
    Citation Envoyé par laurentschneider
    pour le faire "online", regarde le package DBMS_REDEFINITION
    Je ne le connais pas celui-ci... Il est apparu en 8, 9i ou 10g ?

    @+,
    NicK.

  11. #11
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Oracle 9i me semble-t-il
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  12. #12
    Membre à l'essai
    Inscrit en
    Février 2006
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 39
    Points : 16
    Points
    16
    Par défaut
    bonsoir McM,
    merci pour la solution mais est ce que cette methode permet d inserer toutes les données de l ancien champ et merci

  13. #13
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par nourdev
    bonsoir McM,
    merci pour la solution mais est ce que cette methode permet d inserer toutes les données de l ancien champ et merci
    Eh bien non, c'est évident.
    Dans un CLOB tu peux stocker 4 Go de texte
    Dans un VARCHAR2(4000) : 4000 caractères.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  14. #14
    Membre à l'essai
    Inscrit en
    Février 2006
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 39
    Points : 16
    Points
    16
    Par défaut
    mais non, dans mon cas les clob ne depasse pas les 4000 caracteres et ce que je veux moi est de recuperer les données de ce champ.
    est ce t'as une autre methode pour ne pas perdre ces données

  15. #15
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par nourdev
    mais non, dans mon cas les clob ne depasse pas les 4000 caracteres
    Dans ce cas pas de soucis.
    Tu sais, tu peux faire des tests.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT dbms_lob.SUBSTR(commentaire, 4000,0) FROM TCOMMENT;
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  16. #16
    Membre à l'essai
    Inscrit en
    Février 2006
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 39
    Points : 16
    Points
    16
    Par défaut
    bonjour,
    j'ai fait des test en utilisant le code: SELECT dbms_lob.SUBSTR(commentaire, 4000,0) FROM TCOMMENT; mais champ vide meme s'il ya des données??

  17. #17
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    SELECT dbms_lob.SUBSTR(commentaire, 4000,1) FROM TCOMMENT

  18. #18
    Membre à l'essai
    Inscrit en
    Février 2006
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 39
    Points : 16
    Points
    16
    Par défaut
    Bonjour,
    j'ai fait des test en utilisant le code: SELECT dbms_lob.SUBSTR(commentaire, 4000,1) FROM TCOMMENT. ca marche tres bien donc je veux essayer de convertir le CLOB en utilisant cette methode
    Merci

  19. #19
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par laurentschneider
    SELECT dbms_lob.SUBSTR(commentaire, 4000,1) FROM TCOMMENT
    Ah oui, merde.. font chier oracle à pas garder les mêmes parametres.
    on passe du SUBSTR(chaine, pos, taille) à DBMS_LOB.SUBSTR(chaine, taille, pos) et dans le premier cas pos = 0 équivalent à pos= 1 mais pas dans le second..
    My mistake, j'aurais du tester.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  20. #20
    Membre à l'essai
    Inscrit en
    Février 2006
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 39
    Points : 16
    Points
    16
    Par défaut
    Bonjour,
    Merci c'est bien resolu ca marche bien, mais j'ai une question lorsque je fais cette manupilation a la fin le champ ne garde pas la meme position Oracle le met a la derniere position, j'aimerai bien avoir la meme position est possible??

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

Discussions similaires

  1. Convertir un champ CLOB() en number
    Par dinette dans le forum Langage SQL
    Réponses: 5
    Dernier message: 07/07/2009, 14h51
  2. Convertir un champ DATETIME en DATE avec SQLSERVER
    Par __fabrice dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 10/11/2005, 11h26
  3. [Oracle] Insérer le texte d'un textarea dans un champ CLOB
    Par kum dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 26/10/2005, 17h29
  4. Comment convertir un champs en string ?
    Par kalisto95 dans le forum ASP
    Réponses: 2
    Dernier message: 22/09/2005, 12h15
  5. [SQL] Convertir un champ INT en CHAR dans un SELECT ?
    Par webtheque dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/03/2005, 14h45

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