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 :

Modifier float en number à la volée


Sujet :

PL/SQL Oracle

  1. #1
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut Modifier float en number à la volée
    Bonjour,
    J'essaye de parcourir mes tables pour transformer mes float en number.
    Pouvez-vous m'aider à réaliser cette manœuvre ?

    J'ai tenté ceci, mais je crois que je me perd en conjoncture :
    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
     
    DECLARE 
      CURSOR c1 IS
        SELECT table_name FROM user_tables WHERE table_name NOT LIKE '%MDRT%' ;
    BEGIN
       OPEN c1; 
       LOOP
          CURSOR c2 IS
          select COLUMN_NAME, DATA_TYPE   from user_tab_columns  where table_name = c1.table_name;
     
          BEGIN
          OPEN c2; 
            LOOP
     
            -- si datas.data_type = float alors modifier en number(38,2) 
     
            END LOOP;
        CLOSE c2;
        END;
     
       END LOOP;
       CLOSE c1;
    END;
    Merci de votre aide.

  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
    Est-ce que vos tables sont vides ?
    Si oui
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    BEGIN
      for c2 in (select table_name, 
                        COLUMN_NAME, 
                        DATA_TYPE   
                   from user_tab_columns  
                  where table_name NOT LIKE '%MDRT%' 
                    and DATA_TYPE = 'FLOAT') 
      LOOP
           execute immediate 'alter table '||c2.table_name||' modify '||c2.column_name||' number(15,2)';
      END LOOP;
    END;
    Mais bon c'est du code juste pour ça et non pas à intégrer dans une vrai application.

  3. #3
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Non nos tables ne sont pas vides.
    Nous devons migrer des applications GIS et notre ETL, ainsi que ArcGis gère pas bien le float, mais bien le number.

    Est-ce que votre code pose souci avec des tables pleines ?

    Merci de votre aide.

  4. #4
    Membre actif
    Inscrit en
    Avril 2011
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 135
    Points : 221
    Points
    221
    Par défaut
    Bonsoir,

    Il n'est pas possible de changer le type d'une colonne qui présente des données.
    Vous pouvez changer le type d'une colonne si la table est vide ou si toutes les valeurs sont nulles dans cette colonne.

  5. #5
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 074
    Points
    8 074
    Par défaut
    Citation Envoyé par goldray Voir le message
    Il n'est pas possible de changer le type d'une colonne qui présente des données.
    Cette règle est loin d'être absolue, et certains cas favorables permettent la conversion sans exiger que la colonne soit vide.
    C'est le cas par exemple pour étendre une colonne VARCHAR2, pour passer d'un type DATE à TIMESTAMP, ou bien encore, pour passer d'une FLOAT à un NUMBER.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create table demo(a float);
    insert into demo values(12.34);
    commit;
     
    alter table demo modify a number;
    Edit
    Là où c'est vicieux, c'est que si on veut convertir le même FLOAT en numérique à virgule fixe (NUMBER(15,2)) , et non plus en virgule flottante (NUMBER tout court), là il faut bien vider la colonne préalablement.
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  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
    Donc le mieux pour changer le type est :
    1/ Créer une nouvelle colonne X NUMBER(15,2)
    2/ Passer un update X= COL_FLOAT
    3/ Dropper COL_FLOAT
    4/ Renommer X en COL_FLOAT

    Vérifier avant que les colonnes ne soient pas indexées ou qu'il y ait des contraintes
    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
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Donc
    Je viens de tester ceci avec vos réflexion et ça à l'air d'être bon

    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
     
    BEGIN
      for c2 in (select table_name, 
                        COLUMN_NAME, 
                        DATA_TYPE   
                   from user_tab_columns  
                  where table_name ='TGIS_PMQ_BORNES_GPS_HM__XY'
                    and DATA_TYPE = 'FLOAT') 
      LOOP
           execute immediate 'ALTER TABLE '||c2.table_name||' ADD (bonus	NUMBER(15,2) )';
           execute immediate 'UPDATE '||c2.table_name||' SET bonus = '||c2.column_name;
           execute immediate 'ALTER TABLE '||c2.table_name||' DROP COLUMN '||c2.column_name ;
           execute immediate 'ALTER TABLE '||c2.table_name||' RENAME COLUMN bonus TO '||c2.column_name;       
      END LOOP;
    END;

  8. #8
    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
    Pour l'update, rajoute la condition pour ne faire des updates que sur les données renseignées, sinon tu vas updater toutes les lignes pour rien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     execute immediate 'UPDATE '||c2.table_name||' SET bonus = '||c2.column_name ||' where '|| c2.column_name || ' IS NOT NULL';
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

Discussions similaires

  1. Réponses: 1
    Dernier message: 02/11/2015, 18h44
  2. modifier un propertiesPlaceHolder a la volée..
    Par progamer54 dans le forum Spring
    Réponses: 5
    Dernier message: 22/01/2008, 17h13
  3. GridBagLayout: modifier les tailles a la volee
    Par MathiasM dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 18/01/2008, 10h18
  4. [SVG] Modifier une image à la volée
    Par 18Marie dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 28/07/2006, 09h32
  5. Modifier un event à la volée
    Par MasterMic dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 11/07/2005, 13h30

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