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 :

Procédure PL/SQL qui ne s'exécute pas


Sujet :

PL/SQL Oracle

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Lycéen
    Inscrit en
    Juin 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2021
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Procédure PL/SQL qui ne s'exécute pas
    Bonsoir à tous,

    J'ai besoin d'aide pour une procédure qui doit écrire dans une table à partir de 2 autres tables.
    J'ai les tables suivantes :

    LIQUID
    LIQU M_TOTAL C_QUIT
    L1 30 Q1
    L2 20 Q1
    L3 50 Q1
    L4 60 Q2
    L5 90 Q2
    L6 50 Q3

    MOY_LIQ
    C_QUIT MOYEN MONTANT
    Q1 A 40
    Q1 B 60
    Q2 A 50
    Q2 B 100
    Q3 A 50


    Et ma procédure doit me donner le résultat ci_dessous en faisant une répartition par c_quit selon les montants et le moyen utilisé
    RESULTAT
    LIQU MOYEN MONTANT
    L1 A 30
    L2 A 10
    L2 B 10
    L3 B 50
    L4 A 50
    L4 B 10
    L5 B 90
    L6 A 50

    Je met en pièce jointe ma procédure qui ne fonctionne pas. J'ai bien compris la logique mais je ne sais comment bien la matérialiser en plsql. Je débute, donc ce n'est pas évident pour moi.

    Merci d'avance pour votre aide.

    Mopilu
    Fichiers attachés Fichiers attachés

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Bonjour,

    Tu peux certainement faire ce résultat à partir d'une seule requête. Peux-tu expliquer comment tu obtiens le résultat?

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Lycéen
    Inscrit en
    Juin 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2021
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Alors, je dois répartir les montants de chaque opération L1 à L6 par quittance, selon les moyens utilisés.

    Par exemple nous avons la quittance Q1 d'un montant de 100 répartie de la façon suivante :
    40 en A
    60 en B
    et que sur cette quittance nous avons 3 opérations
    L1 d'un montant de 30
    L2 d'un montant de 20
    L3 d'un montant de 50

    Le programme devra générer les écritures suivantes :
    L1 de 30 en A
    L2 de 10 en A
    L2 de 10 en B
    L3 de 50 en B

    J'espère que cela est assez clair.

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Ok je pense avoir compris, du coup je me suis peut-être avancer trop vite. Pas forcément facile à faire en pur SQL (requête récursive typiquement ici).
    Donc oui une procédure pl/sql devrait le faire. Je vais regarder quand j'ai le temps.

  5. #5
    Nouveau Candidat au Club
    Femme Profil pro
    Lycéen
    Inscrit en
    Juin 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2021
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    J'ai amélioré ma procédure, elle enregistre mais ne parcours pas comme il faut. En recherchant, j'ai vu qu'on peut utiliser outer et inner avec exit pour des boucles imbriquées. J'ai essayé mais ca ne fonctionne pas.

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
     create or replace PROCEDURE     "INSERT_TEST" IS
     
    cursor doce is
        select * 
        from liquid ;
     
    enreg liquid%rowtype;
    reste_liq number :=0;
    reste_moy number :=0;
    --
    Begin
     
        For doc in doce
        Loop
            begin
                <<outer >>
              for liq in (select liqu,m_total from liquid where c_quit= doc.c_quit) 
                loop
     
                reste_liq := liq.m_total;
     
                       DBMS_OUTPUT.PUT_LINE('reste_liq init est de '|| reste_liq || ' pour la liquidation ' || liq.liqu);
     
                  for det in (select distinct moyen, montant from moy_liq where c_quit = doc.c_quit ) 
                    loop
     
                    reste_moy := det.montant;
     
                        DBMS_OUTPUT.PUT_LINE('reste_moy init est de '|| reste_moy|| ' pour le moyen ' || det.moyen);
                    if (reste_liq <= reste_moy) then
     
                        insert into resultat(liqu,moyen,montant)
                        values(liq.liqu,det.moyen,reste_liq);
                        reste_liq := reste_liq - liq.m_total;
                        reste_moy := reste_moy - liq.m_total;
                        DBMS_OUTPUT.PUT_LINE('reste_moy après insert est de '|| reste_moy);
     
    				-- sortir er passer à l'opération suivante(liq)
     
                    elsif (reste_liq >   reste_moy) then
     
                         insert into resultat(liqu,moyen,montant)
                        values(liq.liqu,det.moyen,reste_moy);
                        reste_moy := reste_moy - det.montant;
                        reste_liq := reste_liq - det.montant;
                       DBMS_OUTPUT.PUT_LINE('reste_liq après insert est de '|| reste_liq);
     
    					-- sortir et passer au moyen suivant (det)
     
                      end if;  
                   DBMS_OUTPUT.PUT_LINE('Avant exit inner '); 
                 exit  when reste_liq >=0 ;
                  DBMS_OUTPUT.PUT_LINE('Après exit inner ');
    						end loop;
              DBMS_OUTPUT.PUT_LINE('Avant exit outer '); 
                 exit  when reste_moy >=0 ;
                  DBMS_OUTPUT.PUT_LINE('Après exit outer ');
                    end loop;
                --  end loop;  
            end;
        ---
        end loop;
        commit;
    End;

Discussions similaires

  1. [MySQL] Requete sql qui ne s'exécute pas quand elle est importé en php
    Par bastien81 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 02/05/2019, 17h01
  2. Réponses: 8
    Dernier message: 21/02/2008, 08h34
  3. [SQL] Requête UPDATE qui ne s'exécute pas avec PHP
    Par xplose dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 16/08/2007, 09h42
  4. ms sql server 2000 : ".exe" qui ne s'exécute pas
    Par nyko_kliko dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 08/08/2006, 16h15
  5. [MySQL] requete sql qui ne s'exécute pas
    Par anto48_4 dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 16/03/2006, 09h12

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