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] Problème de IF dans une procédure


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Inscrit en
    Février 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Février 2007
    Messages : 26
    Par défaut [PL/SQL] Problème de IF dans une procédure
    Bonjour à tous,

    Je débute en PL/SQl et j'ai un problème dans une procédure.
    Dans cette procédure, je dois tester si une valeur est comprise entre 2 entiers. J'ai essayer de faire ce test avec plusieurs syntaxes différentes mais j'ai toujours la même erreur. Quand j'essaye de compiler ma procédure, j'ai ce message qui s'affiche :

    "NOT FOUND
    The requested URL/apex/www_flow.show was not found on this server"

    Voici comment j'ai écris mes if :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if note>0 and note<20 then ...
    if note>0 and <20 then ...
    if (note>0 and note<20) then ...
    if note between 0 and 20 then ...
    Avec toute ces syntaxe, j'obtient toujours l'erreur d'au-dessus. De plus, je sais que l'erreur vient des if car si j'enleve par exemple note<20, la procédure est bien compilée.
    Pour faire mes procédure, j'utilise Oracle Database 10g Express Edition.

    J'aimerais savoir si mon erreur est une erreur de syntaxe ou alors si sa vient de Oracle parce que là je sèche. D'avance merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    C'est une manie en ce moment ?
    Merci de faire au moins "l'effort" de consulter un des tutoriels du site pour savoir utiliser la syntaxe "if ... then.. end if;" tout de même.

  3. #3
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Il peut même chercher CASE

  4. #4
    Membre averti
    Inscrit en
    Février 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Février 2007
    Messages : 26
    Par défaut
    Je connais la syntaxe du IF. En fait, mon problème ne vient pas du test dans le IF mais c'est que dans ma procédure, j'ai un plusieurs IF avec d'autres IF à l'interieur. Je ne comprend pas mon erreur j'ai trouvé des exemples de IF imbriqués sur Internet et ma syntaxe semble correcte. Voici mon code :

    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
     
    CREATE OR REPLACE PROCEDURE MAJNoteInd(numInd IN INDIVIDU.numIndividu%type,numeroFilm IN FILM.numFilm%type, note IN TEMPIND.temprealisateur%type, typeInd INTEGER, loginUtil IN CLIENT.login%type) IS
    BEGIN
    DECLARE
    tmpAct FLOAT;
    tmpRea FLOAT;
    BEGIN
    tmpAct:=0;
    tmpRea:=0;
    SELECT tempActeur INTO tmpAct FROM TEMPIND WHERE NumIndividu=numInd;
    SELECT tempRealisateur INTO tmpRea FROM TEMPIND WHERE NumIndividu=numInd;
    IF typeInd=2 THEN 
     
    	IF tmpAct IS NULL THEN 
     
    		UPDATE TempInd SET temprealisateur=(temprealisateur+note)/2, tempIndividu=(tempActeur + (temprealisateur+note)/2)/2, nbNoteRea=nbNoteRea+1 WHERE NumIndividu=numInd  ;
    		INSERT INTO TempIndFilm VALUES (numeroFilm, numInd , typeInd, note, loginUtil, TO_CHAR(SYSDATE, 'DD/MM/YYYY')); 
    	ELSE 
    		UPDATE TempInd SET temprealisateur=(temprealisateur+note)/2, tempIndividu=(temprealisateur+note)/2, nbNoteRea=nbNoteRea+1 WHERE NumIndividu=numInd  ;
    		INSERT INTO TempIndFilm VALUES (numeroFilm, numInd , typeInd, note, loginUtil, TO_CHAR(SYSDATE, 'DD/MM/YYYY')); 
    	END IF;	
    END IF; 
     
    IF typeInd=1  THEN
     
    	IF tmpRea IS NULL THEN 
    		UPDATE TempInd SET tempacteur=(tempacteur+note)/2, tempIndividu=(tempRealisateur + (tempacteur+note)/2)/2, nbNoteAct=nbNoteAct+1 WHERE NumIndividu=numInd ;
    		INSERT INTO TempIndFilm VALUES (numeroFilm, numInd , typeInd, note, loginUtil, TO_CHAR(SYSDATE, 'DD/MM/YYYY'));
    	ELSE 
    		UPDATE TempInd SET tempacteur=(tempacteur+note)/2, tempIndividu=(tempacteur+note)/2, nbNoteAct=nbNoteAct+1 WHERE NumIndividu=numInd  ;
    		INSERT INTO TempIndFilm VALUES (numeroFilm, numInd , typeInd, note, loginUtil, TO_CHAR(SYSDATE, 'DD/MM/YYYY'));
    	END IF;
    END IF;
    END;
    END MAJNoteInd;
    /

  5. #5
    Invité
    Invité(e)
    Par défaut
    L'imbrication des if et autres begin sont possibles, c'est sûr.
    Mais je ne vois pas le problème dans ta procédure ?!
    C'est quoi ton message d'erreur ?

  6. #6
    Membre averti
    Inscrit en
    Février 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Février 2007
    Messages : 26
    Par défaut
    Dans oracle, quand je lance la compilation de la procédure avec le bouton Run, une fenetre s'ouvre avec un bouton "submit". Quand je clique sur le bouton submit, j'ai le message suivant qui apparaît :

    "Not found
    The requested URL /apex/wwv_flow.show was not found on this server"

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Rydley Voir le message
    Dans oracle, quand je lance la compilation de la procédure avec le bouton Run, une fenetre s'ouvre avec un bouton "submit".
    Avec ma boule de cristal, dois-je comprendre que tu travailles à partir d'Oracle SQL Developper ???

    Si c'est ça, as-tu déjà compilé (sans erreur) ta procédure ?

    Est-ce que tes requêtes ramène une seule valeur, au plus ?

    Est-ce que tu es bien connecté avec ta base ?

    Est-ce que tu rempli correctement les valeurs lorsque la fenêtre "RUN PL/SQL" s'ouvre ?

  8. #8
    Membre averti
    Inscrit en
    Février 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Février 2007
    Messages : 26
    Par défaut
    J'ai essayé de supprimer manuelement la procédure que j'avais créé avant et maintenant ça marche, il n'y a plus d'erreur à la compilation mais ma procédure ne marche pas comme prévu. Par exemple, si typeind=1, ma procédure ne fait pas le "else". Quand ma table tempInd est vide, l'ajout se fait corréctement puisque tempRea est nul mais si j'ai temp mais si tempRea n'est pas nul, l'ajout ne se fait pas dans ma table tempind. Pourtant, l'ajout est pris en compte puisque l'insertion dans la table TempIndFilm se fait correctement. Est-ce que s'il n'y a pas de valeur dans une colonne de la table, le test de la valeur NULL est bon?

    Au fait, le code que j'ai mis avant n'est pas tout a fait correct

    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
     
    CREATE OR REPLACE PROCEDURE MAJNoteInd(numInd IN INDIVIDU.numIndividu%type,numeroFilm IN FILM.numFilm%type, note IN TEMPIND.temprealisateur%type, typeInd INTEGER, loginUtil IN CLIENT.login%type) IS
    BEGIN
    DECLARE
    tmpAct FLOAT;
    tmpRea FLOAT;
    BEGIN
    tmpAct:=0;
    tmpRea:=0;
    SELECT tempActeur INTO tmpAct FROM TEMPIND WHERE NumIndividu=numInd;
    SELECT tempRealisateur INTO tmpRea FROM TEMPIND WHERE NumIndividu=numInd;
    IF typeInd=2 THEN 
     
            IF tmpAct IS NULL THEN 
     
                    UPDATE TempInd SET temprealisateur=(temprealisateur+note)/2, tempIndividu=(temprealisateur+note)/2, nbNoteRea=nbNoteRea+1 WHERE NumIndividu=numInd  ;
                    INSERT INTO TempIndFilm VALUES (numeroFilm, numInd , typeInd, note, loginUtil, TO_CHAR(SYSDATE, 'DD/MM/YYYY')); 
            ELSE 
                    UPDATE TempInd SET temprealisateur=(temprealisateur+note)/2, tempIndividu=(tempacteur +(temprealisateur+note)/2)/2, nbNoteRea=nbNoteRea+1 WHERE NumIndividu=numInd  ;
                    INSERT INTO TempIndFilm VALUES (numeroFilm, numInd , typeInd, note, loginUtil, TO_CHAR(SYSDATE, 'DD/MM/YYYY')); 
            END IF; 
    END IF; 
     
    IF typeInd=1  THEN
     
            IF tmpRea IS NULL THEN 
                    UPDATE TempInd SET tempacteur=(tempacteur+note)/2, tempIndividu=(tempacteur+note)/2, nbNoteAct=nbNoteAct+1 WHERE NumIndividu=numInd ;
                    INSERT INTO TempIndFilm VALUES (numeroFilm, numInd , typeInd, note, loginUtil, TO_CHAR(SYSDATE, 'DD/MM/YYYY'));
            ELSE 
                    UPDATE TempInd SET tempacteur=(tempacteur+note)/2, tempIndividu=(tempRealisateur+(tempacteur+note)/2)/2, nbNoteAct=nbNoteAct+1 WHERE NumIndividu=numInd  ;
                    INSERT INTO TempIndFilm VALUES (numeroFilm, numInd , typeInd, note, loginUtil, TO_CHAR(SYSDATE, 'DD/MM/YYYY'));
            END IF;
    END IF;
    END;
    END MAJNoteInd;
    /

  9. #9
    Membre averti
    Inscrit en
    Février 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Février 2007
    Messages : 26
    Par défaut
    C'est bon j'ai reussi à faire marcher ma procédure comme je le voulais. Merci beaucoup pour l'aide que tu m'as apporté.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Où était le blocage ?

  11. #11
    Membre averti
    Inscrit en
    Février 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Février 2007
    Messages : 26
    Par défaut
    En fait j'avais créé une procédure plus ancienne qui avait le même nom. Je l'ai supprimer "à la mains" et sa a marché. Ce que je ne comprend pas, c'est que dans la déclaration de ma procédure, j'ai bien mis "create or replace".

    Sinon, j'ai un autre problème avec une autre procédure. Celle-ci compile sans erreur mais c'est dans l'éxecution que sa plante. Dans cette procédure, j'ai comme dans la précédente deux SELECT qui peuvent me renvoyer des valeurs nulles. Quand j'apelle ma fonction en JDBC et que les champs sont nuls, une éxeption est levée: elle m'indique:
    "capture d'une exception java.sql.SQLException: ORA-01403: aucune donnée trouvée" avec la numéro de la ligne de ma procédure qui correspond à mon SELECT. Ce que je ne comprend pas, c'est que pour l'autre fonction sa marche sans problème même si la valeur demandée dans le SELECT n'est pas dans la table. Voici le code de ma nouvelle procédure:

    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
     
    CREATE OR REPLACE PROCEDURE MAJNoteFILM(numeroFilm IN FILM.numFilm%type, note IN TEMPIND.temprealisateur%type, typeInd INTEGER) IS 
    BEGIN 
    DECLARE 
    CURSOR monC IS SELECT numFilm FROM TEMPFILM;
    presant INTEGER;
    tmpActs FLOAT;
    tmpRea FLOAT;
    BEGIN
    presant:=-1;
    tmpActs:=0;
    tmpRea:=0;
    SELECT tempActeurs INTO tmpActs FROM TEMPFILM WHERE NumFilm=numeroFilm;
    SELECT tempRealisateur INTO tmpRea FROM TEMPFILM WHERE NumFilm=numeroFilm;
    FOR elt IN monC 
    LOOP
    IF elt.numFilm=numeroFilm THEN presant:=1; 
    END IF;
    END LOOP;
     
    IF presant=1 THEN 
    	IF typeInd=2 THEN 
    	UPDATE TEMPFILM SET tempRealisateur=(tempRealisateur+note)/2, tempFilm=(tempActeurs+((tempRealisateur+note)/2))/2 WHERE numFilm=numeroFilm; 
    	ELSE 
    	UPDATE TEMPFILM SET tempActeurs=(tempActeurs+note)/2, tempFilm=(tempRealisateur+((tempActeurs+note)/2))/2 WHERE numFilm=numeroFilm;
    	END IF;
    ELSE 
    	IF typeInd=2 THEN 
    	INSERT INTO TEMPFILM VALUES (numeroFilm, null, note, note);
    	ELSE 
    	INSERT INTO TEMPFILM VALUES (numeroFilm, note, null, note);
    END IF;
    END IF;
    END;
    END MAJNoteFilm;
    /

  12. #12
    Membre averti
    Inscrit en
    Février 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Février 2007
    Messages : 26
    Par défaut
    Ah j'ai réussi à résoudre mon deuxième problème. J'ai déplacé les SELECT et les ai mis apres presant=1. Quand presant est égal à un, c'est qu'il y a des données dans la table. Les select retournent donc bien une valeur.

  13. #13
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    sauf qu'il n'y a pas de gestion d'exception donc ça sert à rien

    Si tu n'as pas de donner la procédure s'arrête avec un NO_DATA_FOUND

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/08/2007, 11h02
  2. [PL SQL] Problème avec 'case' dans une fonction
    Par divail dans le forum Oracle
    Réponses: 14
    Dernier message: 13/03/2006, 15h50
  3. [SQL-Server] Sous requete dans une procédure stockée
    Par Worldofdada dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 09/02/2006, 11h18
  4. Réponses: 4
    Dernier message: 16/12/2005, 16h25
  5. Problème Alter view dans une procédure stockée
    Par adjava dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 20/07/2005, 17h45

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