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 :

Boucle en SQL


Sujet :

PL/SQL Oracle

  1. #1
    Membre averti
    Inscrit en
    Mars 2011
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 39
    Par défaut Boucle en SQL
    Bonjour,

    J'ai un problème dans la création d'une nouvel colonne dans une table existante
    ja m'explique voici le commande SQL pour la creation de ma table :

    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
     
    CREATE TABLE  "ME_BRUTE_DEFLECTO" 
       (	 
    	"NUMR" NUMBER, 
    	"INDICE" VARCHAR2(1), 
    	"SEG" NUMBER, 
    	"SOUS" NUMBER, 
    	"RUB" NUMBER, 
    	"NBCOUPLES" NUMBER, 
    	"VAL_RIVE_1" NUMBER, 
    	"VAL_AXE_1" NUMBER, 
    	"VAL_RIVE_2" NUMBER, 
    	"VAL_AXE_2" NUMBER, 
    	"VAL_RIVE_3" NUMBER, 
    	"VAL_AXE_3" NUMBER, 
    	"VAL_RIVE_4" NUMBER, 
    	"VAL_AXE_4" NUMBER, 
    	"VAL_RIVE_5" NUMBER, 
    	"VAL_AXE_5" NUMBER, 
    	"VAL_RIVE_6" NUMBER, 
    	"VAL_AXE_6" NUMBER, 
    	"VAL_RIVE_7" NUMBER, 
    	"VAL_AXE_7" NUMBER, 
    	"VAL_RIVE_8" NUMBER, 
    	"VAL_AXE_8" NUMBER, 
    	"VAL_RIVE_9" NUMBER, 
    	"VAL_AXE_9" NUMBER,
    Et cela continue jusqu’à :
    "VAL_RIVE_150" NUMBER,
    "VAL_AXE_150" NUMBER,

    Mon but est de créer dans cet table une nouvel colonne avec la somme des valeurs en RIVE et en AXE.

    Seulement pour le moment toutes mes tentatives ont échoués je pense que quelqu'un à déjà rencontre ce problème.

    Merci d'avance.

  2. #2
    Membre confirmé
    Homme Profil pro
    Data Ingenieur
    Inscrit en
    Mai 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Data Ingenieur
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2006
    Messages : 133
    Par défaut
    Bonjour,

    il faudrait que tu ajoutes le message d'erreur stp.

    Mais de ce que je vois tu dois dépasser le nombre maximun de colonne dans une table.

  3. #3
    Membre averti
    Inscrit en
    Mars 2011
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 39
    Par défaut
    Citation Envoyé par attila771 Voir le message
    Bonjour,
    le nombre maximun de colonne dans une table.
    Le nombre max de colonne ? lol non je pense que de ce côté-là aucun problème j'ai d'autres tables avec Val_AXE_250 et cela ne poses aucun problèmes.

    Le problème n'est pas la table mais simplement comment faire la somme de toutes ces colonnes dans une nouvelle colonne via une boucle.

  4. #4
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    Peux-tu nous montrer ton script d'insertion des données ?

  5. #5
    Inactif  

    Homme Profil pro
    Freelance EURL / Business Intelligence ETL
    Inscrit en
    Avril 2005
    Messages
    5 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance EURL / Business Intelligence ETL
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2005
    Messages : 5 878
    Billets dans le blog
    3
    Par défaut
    Au-delà de la technique, tu as besoin de faire un script PL/SQL pour alimenter ces champs ?

    Pourquoi ne pas faire un UPDATE de cette table avec la SUM des champs sur un SQL à part que tu invoques ? Le script PL/SQL sera plus simple si tu devais travailler itérativement ligne à ligne, mais là tu travailles sur toute la table.
    - So.... what exactly is preventing us from doing this?
    - Geometry.
    - Just ignore it !!
    ****
    "The longer he lived, the more he realized that nothing was simple and little was true" A clash of Kings, George R. R. Martin.
    ***
    Quand arrivera l'apocalypse, il restera deux types d'entreprise : les pompes funèbres et les cabinets d'audit. - zecreator, 21/05/2019

  6. #6
    Membre averti
    Inscrit en
    Mars 2011
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 39
    Par défaut
    Alors j'ais pas vraiment de script d'insertion.

    En gros ma procédure c'est que lorsque je reçois des mesures brut je crée la table avec le bon nombre de colonnes. je transforme le fichier que je reçois de manier a en faire un csv exploitable et j'utilise Sql*Loader (SQLLRD) pour charger le contenue de mon csv dans ma table et cela marche plutôt bien.

    un UPDATE de cette table avec la SUM des champs sur un SQL.

    Le problème est que j’aimerai faire une boucle pour ne pas avoir a écrire le nom de chaque champ dans mon sum je pense que c'est possible mais personnellement je nais pas réussi.

  7. #7
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    Bon alors pour une boucle il vaut mieux partir vers du PL/SQL.

    Tu peux créer une boucle avec FOR.

    Peut-être qu'un trigger serait plus adapté dans ton cas.

  8. #8
    Membre averti
    Inscrit en
    Mars 2011
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 39
    Par défaut
    Citation Envoyé par lola06 Voir le message
    Bon alors pour une boucle il vaut mieux partir vers du PL/SQL.

    Tu peux créer une boucle avec FOR.

    Peut-être qu'un trigger serait plus adapté dans ton cas.
    Merci mais justement mes tentatives pour crée une boucle en sql ne marche pas et je comprend pas comment utiliser cette boucle pour crée une nouvel colonne c'est pour ça que je demande sur ce forum.....

  9. #9
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    Tu dois créer ta colonne en même temps que la création de ta table.

    Ta boucle te servira à insérer les données dedans.
    Pourrais-tu nous montrer ce que tu as fait ?

  10. #10
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Ca va être compliqué d'écrire un update qui boucle sur les colonnes en fonction de leur nom pour en faire la somme.
    De toute façon se sera plus rapide un update simple avec toutes les colonnes.
    Utilise excel si tu ne veux pas te taper les noms de champs à la mano

  11. #11
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Utilise USER_TAB_COLUMNS pour récupérer la liste des colonnes nécessaires à la somme.

    Construit une chaine de caractère qui correspond à l'UPDATE.

    Puis utilise EXECUTE IMMEDIATE pour exécuter l'update.

  12. #12
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2011
    Messages : 47
    Par défaut
    Bonjour,

    Comme je comprends le problème, une solution comme l'indique skuatamad, la solution idéale est d'exploiter la table USER_TAB_COLUMNS.

    Si le besoin n'est que pour la table présentée, un code de ce style devrait suffire :

    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
        L_VC_SUM    VARCHAR2(4000);
    BEGIN
        L_VC_SUM    := 'UPDATE  ME_BRUTE_FEDLECTO
                        SET     RIVE_SUM = ';
        FOR I IN 1..150 LOOP
            L_VC_SUM := L_VC_SUM || 'VAL_RIVE_' || I || ' + ';
        END LOOP;
        L_VC_SUM := SUBSTR(L_VC_SUM, 1, LENGTH(L_VC_SUM) - 1) || ',
                    SET     AXE_SUM = ';
        FOR I IN 1..150 LOOP
            L_VC_SUM := L_VC_SUM || 'VAL_AXE_' || I || ' + ';
        END LOOP;
        L_VC_SUM := SUBSTR(L_VC_SUM, 1, LENGTH(L_VC_SUM) -1);
        EXECUTE IMMEDIATE L_VC_SUM;
    END;
    Je n'ai pas testé le code de mon côté, mais c'est l'idée qui compte.

    Bonne journée.

  13. #13
    Membre averti
    Inscrit en
    Mars 2011
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 39
    Par défaut
    Citation Envoyé par Juda_ Voir le message
    Bonjour,

    Comme je comprends le problème, une solution comme l'indique skuatamad, la solution idéale est d'exploiter la table USER_TAB_COLUMNS.

    Si le besoin n'est que pour la table présentée, un code de ce style devrait suffire :

    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
        L_VC_SUM    VARCHAR2(4000);
    BEGIN
        L_VC_SUM    := 'UPDATE  ME_BRUTE_FEDLECTO
                        SET     RIVE_SUM = ';
        FOR I IN 1..150 LOOP
            L_VC_SUM := L_VC_SUM || 'VAL_RIVE_' || I || ' + ';
        END LOOP;
        L_VC_SUM := SUBSTR(L_VC_SUM, 1, LENGTH(L_VC_SUM) - 1) || ',
                    SET     AXE_SUM = ';
        FOR I IN 1..150 LOOP
            L_VC_SUM := L_VC_SUM || 'VAL_AXE_' || I || ' + ';
        END LOOP;
        L_VC_SUM := SUBSTR(L_VC_SUM, 1, LENGTH(L_VC_SUM) -1);
        EXECUTE IMMEDIATE L_VC_SUM;
    END;
    Je n'ai pas testé le code de mon côté, mais c'est l'idée qui compte.

    Bonne journée.
    C'est exactement ce que je cherche je vais modifier pour que cela cole mais c'est parfait.

    Tu pensse que c'est facilement adadtable pour faire partie d'un trigger histoire d'etre vraiment propre ?

    Merci

  14. #14
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2011
    Messages : 47
    Par défaut
    C'est évidement adaptable en trigger. Mais je ne sais pas si on peut dire que cette solution est "vraiment propre".
    Je n'ai pas une grande expérience des bases de données et je ne connais pas non plus ton contexte donc je ne peux pas en dire plus. Je n'ai jamais vu d'utilisation de TABLE similaires à la tienne.

    Si tu cherches à faire un TRIGGER il suffit de faire quelque chose de ce style :

    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
    DECLARE
        L_VC_SUM    VARCHAR2(4000);
    BEGIN
        L_VC_SUM    := 'CREATE OR REPLACE TRIGGER  T_U_ME_BRUTE_FEDLECTO BEFORE UPDATE ON ME_BRUTE_FEDLECTO FOR EACH ROW
                        BEGIN
                            :NEW.RIVE_SUM = ';
        FOR I IN 1..150 LOOP
            L_VC_SUM := L_VC_SUM || ':NEW.VAL_RIVE_' || I || ' + ';
        END LOOP;
        L_VC_SUM := SUBSTR(L_VC_SUM, 1, LENGTH(L_VC_SUM) - 1) || ';
                    :NEW.AXE_SUM = ';
        FOR I IN 1..150 LOOP
            L_VC_SUM := L_VC_SUM || ':NEW.VAL_AXE_' || I || ' + ';
        END LOOP;
        L_VC_SUM := SUBSTR(L_VC_SUM, 1, LENGTH(L_VC_SUM) -1) || ';
                    END T_U_ME_BRUTE_FEDLECTO;';
        EXECUTE IMMEDIATE L_VC_SUM;
    END;
    Encore une fois je n'ai pas testé le code, mais l'idée est là.

    Dans la création du TRIGGER de mise à jour, je n'ai pas mis de filtre sur les colonnes mises à jour pour faciliter la lecture et je ne pense pas que ce soit nécessaire si 150/160 colonnes sont concernées.

    Bonne journée.

Discussions similaires

  1. ecriture dans un fichier ,boucle for + SQL
    Par lizardman dans le forum Langage
    Réponses: 3
    Dernier message: 18/05/2008, 17h39
  2. Comment faire un Sleep dans une boucle PL/SQL
    Par foster06 dans le forum PL/SQL
    Réponses: 3
    Dernier message: 01/02/2008, 18h59
  3. boucle insert sql
    Par bernard26000 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/12/2007, 11h29
  4. Réponses: 4
    Dernier message: 28/04/2007, 22h42
  5. [MS SQL Server] comment faire des boucles en SQL ?
    Par Yorel dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/11/2006, 09h41

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