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

SQL Oracle Discussion :

[PL/SQL][10g] Probleme sur la clause WHERE


Sujet :

SQL Oracle

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2
    Points : 2
    Points
    2
    Par défaut [PL/SQL][10g] Probleme sur la clause WHERE
    Bonjour,
    Je debute en PL/SQL et je me suis basée sur les Tutoriaux de Developpez.com pour ma procedure (tuto très bien faits d'ailleurs, milles mercis aux auteurs !)

    Je travaille sous Oracle 10g et j'utilise PL/SQL Developper 7 pour la mise en place de mes procédures.

    Mon probleme est le suivant :

    Dans la clause WHERE de ma procédure, le champ V de la table TB_LF n'est pas toujours renseigné. Je voudrais donc qu'il ne soit testé dans la clause que s'il existe, sinon il ne faudrait pas en tenir compte (en rouge dans la procedure jointe plus bas). Mon SQL ne fonctionne pas ...
    Je pensais peut etre qu'en passant par des IF ca serait possible, mais je n'ai pas l'impression que ca soit possible d'en mettre dans le WHERE.

    Si vous aviez des idées ou des pistes que je puisse explorer, je vous en serais reconnaissante. Je ne connais pas trop les possibilités du PL/SQL en fait ...


    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
    create or replace 
    procedure BO_UP 
    is 
            UPCLE TB_UP.CLE%TYPE; 
            UPL   TB_LL.L%TYPE; 
            UPV   TB_LL.V%TYPE; 
            UPD   TB_LL.D%TYPE; 
            UPF   TB_LL.F%TYPE; 
            UPC   TB_LL.C%TYPE; 
            Cursor C_UP 
            is 
            SELECT  TB_UP.CLE, 
                    TB_LL.L, 
                    TB_LL.V, 
                    TB_LL.D, 
                    TB_LL.F, 
                    TB_LL.C 
            FROM    TB_UP, 
                    TB_LCUP, 
                    TB_LC, 
                    TB_LL 
            WHERE   (TB_UP.CLE         = TB_LCUP.CLE_TB_UP) 
                AND (TB_LCUP.CLE_TB_LC = TB_LC.CLE) 
                AND (TB_LC.LL          = TB_LL.CLE); 
    begin 
            /* récupération des UP */ 
            Open C_UP; 
            Loop -- boucle sur les UP       
            begin 
                    Fetch C_UP into UPCLE, 
                    UPL, 
                    UPV, 
                    UPD, 
                    UPF, 
                    UPC;        -- lecture d'une ligne       
            UPDATE ARMDBA.BO_LF -- mise à jour de la table BO_LF       
                    SET IDUP  = UPCLE 
            WHERE   (BO_LF.L  = UPL) 
                AND ((BO_LF.V = UPV) AND (BO_LF.V is not null)) 
                AND ((BO_LF.D BETWEEN UPD AND UPF)) 
                AND (BO_LF.O = UPC); 
            Exit 
    when C_UP%NOTFOUND; 
    EXCEPTION 
            /* gestion des exceptions */ 
    When OTHERS then 
            dbms_output.put_line( 'Code    erreur : ' || to_char( SQLCODE )) ; 
            dbms_output.put_line( 'libellé erreur : ' || to_char( SQLERRM )) ; 
    end; 
    End Loop; 
    Close C_UP; 
    end BO_UP;

  2. #2
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
            WHERE   (BO_LF.L  = UPL) 
                AND decode(BO_LF.V,null,1,decode(BO_LF.V, UPV, 1,0)) = 1
                AND ((BO_LF.D BETWEEN UPD AND UPF)) 
                AND (BO_LF.O = UPC);
    C'est sûrement faisable plus proprement avec des CASE mais j'ai peur de me planter dans la syntaxe.

  3. #3
    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
    AND (BO_LF.V = UPV OR BO_LF.V is null)
    et si UPV est NOT NULL tout le temps
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND NVL(BO_LF.V, UPV) = UPV

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 32
    Points : 37
    Points
    37
    Par défaut
    Bonjour;

    La condition ajoutée dans la clause WHERE est correcte, je pense que le problème réside au niveau de la structuration de la procédure, ci-dessous les modifications apportées en bleu:
    create or replace
    procedure BO_UP
    is
    UPCLE TB_UP.CLE%TYPE;
    UPL TB_LL.L%TYPE;
    UPV TB_LL.V%TYPE;
    UPD TB_LL.D%TYPE;
    UPF TB_LL.F%TYPE;
    UPC TB_LL.C%TYPE;
    Cursor C_UP
    is
    SELECT TB_UP.CLE,
    TB_LL.L,
    TB_LL.V,
    TB_LL.D,
    TB_LL.F,
    TB_LL.C
    FROM TB_UP,
    TB_LCUP,
    TB_LC,
    TB_LL
    WHERE (TB_UP.CLE = TB_LCUP.CLE_TB_UP)
    AND (TB_LCUP.CLE_TB_LC = TB_LC.CLE)
    AND (TB_LC.LL = TB_LL.CLE);
    begin
    /* récupération des UP */
    Open C_UP;
    Loop -- boucle sur les UP

    Fetch C_UP into UPCLE,
    UPL,
    UPV,
    UPD,
    UPF,
    UPC; -- lecture d'une ligne
    Exit when C_UP%NOTFOUND;
    begin
    UPDATE ARMDBA.BO_LF -- mise à jour de la table BO_LF
    SET IDUP = UPCLE
    WHERE (BO_LF.L = UPL)
    AND ((BO_LF.V = UPV) AND (BO_LF.V is not null))
    AND ((BO_LF.D BETWEEN UPD AND UPF))
    AND (BO_LF.O = UPC);
    EXCEPTION
    /* gestion des exceptions */
    When OTHERS then
    dbms_output.put_line( 'Code erreur : ' || to_char( SQLCODE )) ;
    dbms_output.put_line( 'libellé erreur : ' || to_char( SQLERRM )) ;
    end;
    End Loop;
    Close C_UP;
    end BO_UP;

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Merci pour vos réponses, je vais tester tout ca et je reviens vous dire ce que ca donne !

    J'ai utilisé la ligne suivante et ca marche nickel + les remarques sur l'exit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    decode(BO_LF.V,null,1,decode(BO_LF.V, UPV, 1,0)) = 1
    Ca parait tellement evident maintenant que j'ai presque honte de moi , mais y parait qu'a force d'avoir la tete dans le code, on cherche loin ce qui peut etre d'une evidence déconcertante !

    Merci à tous !


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requete SQL, les DateTime et les clauses WHERE
    Par Woufeigh dans le forum Développement
    Réponses: 6
    Dernier message: 05/09/2012, 11h00
  2. Probleme avec la clause WHERE
    Par funkyjul dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 30/03/2008, 14h21
  3. je bloque sur une clause where
    Par bruno bdf dans le forum Langage SQL
    Réponses: 3
    Dernier message: 21/07/2006, 09h55
  4. Probleme de requete, clause where et nombre a virgule..
    Par forest82 dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/12/2005, 19h19
  5. question sur la clause "where"
    Par a-chan dans le forum Langage SQL
    Réponses: 3
    Dernier message: 07/07/2005, 11h59

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