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 :

Problème procédure PL/SQL


Sujet :

PL/SQL Oracle

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 3
    Points : 5
    Points
    5
    Par défaut Problème procédure PL/SQL
    Bonjour,

    Ma procédure ne fonctionne pas mais je ne sais pas pourquoi. Je pense que le problème vient de la syntaxe...

    Voilà ma 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
    create or replace PROCEDURE DividendCalcul IS
    DECLARE
    	fDiv FLOAT;
    	sLabel VARCHAR2(32);
     
    	CURSOR data_cur IS SELECT r1.Label, r1.DIVIDEND_VALUE-r2.DIVIDEND_VALUE FROM (SELECT HISTO_INDEX.DIVIDEND_VALUE, INDEX_TABLE.LABEL, INDEX_TABLE.INDEX_ID FROM HISTO_INDEX, INDEX_TABLE WHERE HISTO_INDEX.INDEX_ID=INDEX_TABLE.INDEX_ID AND HISTO_INDEX.DATE_ID=(SELECT MAX(DATE_ID) FROM HISTO_INDEX) AND INDEX_TABLE.TYPE='Index' ORDER BY INDEX_TABLE.INDEX_ID) r1, (SELECT HISTO_INDEX.DIVIDEND_VALUE, INDEX_TABLE.LABEL, INDEX_TABLE.INDEX_ID FROM HISTO_INDEX, INDEX_TABLE WHERE HISTO_INDEX.INDEX_ID=INDEX_TABLE.INDEX_ID AND DATE_ID=(SELECT MAX(DATE_ID) FROM HISTO_INDEX WHERE HISTO_INDEX.DATE_ID NOT IN (SELECT MAX(DATE_ID) FROM HISTO_INDEX)) AND INDEX_TABLE.TYPE='Index' ORDER BY INDEX_TABLE.INDEX_ID) r2 WHERE r1.INDEX_ID=r2.INDEX_ID;
    BEGIN
    	OPEN data_cur;
    	FETCH data_cur INTO sLabel, fDiv;
     
    	UPDATE DIFF_TABLE SET DIFF_VALUE=fDiv WHERE LABEL=sLabel;
     
    	EXIT WHEN data_cur%NOTFOUND;
     
    	CLOSE data_cur;
    END;

  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
    Sur un poste similaire au votre Tom Kyte donne un réponse de ce type:
    «*Ma voiture ne démarrerais pas. Maintenant on est quitte, nous avons partagé le même niveau de détails concernant nos problèmes*»

    Autrement dit ce quoi précisément votre problème: erreur à la création, erreur à l'exécution, pas d'erreur mais le résultat n'est pas celui attendu (vous attendez quoi), ou encore ... ?

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Bon je suis assez d'accord avec mnitu...
    Ceci dit je pense qu'effectivement c'est un pb de syntaxe, préfère les boucles for au open plus simple à coder.
    Donc peut être qq choses comme ça :
    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
     
    CREATE OR REPLACE PROCEDURE DividendCalcul IS
    	CURSOR data_cur IS SELECT r1.label, r1.DIVIDEND_VALUE-r2.DIVIDEND_VALUE as fdiv
            FROM (SELECT HISTO_INDEX.DIVIDEND_VALUE, INDEX_TABLE.LABEL, INDEX_TABLE.INDEX_ID
                 FROM HISTO_INDEX, INDEX_TABLE
                 WHERE HISTO_INDEX.INDEX_ID=INDEX_TABLE.INDEX_ID
                 AND HISTO_INDEX.DATE_ID=(SELECT MAX(DATE_ID) FROM HISTO_INDEX)
                 AND INDEX_TABLE.TYPE='Index') r1,
                 (SELECT HISTO_INDEX.DIVIDEND_VALUE, INDEX_TABLE.LABEL, INDEX_TABLE.INDEX_ID
                 FROM HISTO_INDEX, INDEX_TABLE
                 WHERE HISTO_INDEX.INDEX_ID=INDEX_TABLE.INDEX_ID
                 AND DATE_ID=(SELECT MAX(DATE_ID) FROM HISTO_INDEX WHERE HISTO_INDEX.DATE_ID NOT IN (SELECT MAX(DATE_ID) FROM HISTO_INDEX))
                 AND INDEX_TABLE.TYPE='Index') r2
                 WHERE r1.INDEX_ID=r2.INDEX_ID;
    BEGIN
    	for c in data_cur loop
    	UPDATE DIFF_TABLE SET DIFF_VALUE=c.fdiv WHERE LABEL=c.label;
    	end loop;
    END;
    PS1: j'ai viré les order by inutiles dans une sous-requête jointe
    PS2: potentiellement si ta requête renvoie bcp de lignes tente une syntaxe ensembliste plutôt qu'un curseur
    PS3: Et le commit ?

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 119
    Points : 114
    Points
    114
    Par défaut
    Veuillez préciser l'erreur d'abord

  5. #5
    Membre à l'essai
    Inscrit en
    Octobre 2008
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 30
    Points : 17
    Points
    17
    Par défaut
    Sans précision sur l'erreur, pas évident...

    Pour ma part, je mettrais le EXIT juste après le FETCH et non après le UPDATE.
    Sinon c'est vrai que les boucles FOR sont d'une syntaxe plus "simple".

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Au fait pas de DECLARE après create procedure ...
    Je viens d'éditer mon post pour corriger

  7. #7
    Membre confirmé

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Points : 503
    Points
    503
    Par défaut
    Bonjour.

    Le "EXIT WHEN NOT%FOUND" doit être placé juste après le FETCH.

Discussions similaires

  1. [WD16] probléme procédure stockée SQL Server
    Par fweds dans le forum WinDev
    Réponses: 7
    Dernier message: 30/03/2012, 10h11
  2. Problème d’alias dans la procédure PL/SQL
    Par Fiona08 dans le forum PL/SQL
    Réponses: 6
    Dernier message: 14/12/2010, 00h52
  3. Réponses: 3
    Dernier message: 06/09/2009, 18h22
  4. Problème LIKE Procédure stocké SQL Server 2000
    Par Pilhole dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 18/02/2008, 09h24
  5. Problème Paramètres procédure pl/sql
    Par tofke dans le forum PL/SQL
    Réponses: 4
    Dernier message: 12/07/2007, 15h41

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