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

Oracle Discussion :

Problemes de resultats d'une procédure stockées


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 197
    Par défaut Problemes de resultats d'une procédure stockées
    Bonjour,

    Sous Oracle, j'ai cette procedure stockée :

    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
    create or replace procedure eleves_infos(id IN INT)
    AS
      cursor eleves_infos is 
        SELECT eleve_nom,eleve_prenom
        FROM BG_eleves
        WHERE eleve_id = id;
     
       infos_nom varchar(20);
       infos_prenom varchar(20);
    BEGIN
      open eleves_infos;
      fetch eleves_infos into infos_nom,infos_prenom;
    END;
    /
    show errors;
    Elle se crée parfaitement mais quand je l'appele avec call, elle me renvoie rien alors qu'elle devrait.

    J'ai un doute sur le OPEN et le FETCH. Il faut rajouter qqu chose ?

    MERCI de votre aide

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    C'est normal, une procédure n'est pas une fonction: une procédure ne retourne rien . Pour avoir des exemples de fonctions retournant des curseurs, voir par exemple http://www.developpez.net/forums/sho...d.php?t=139679

  3. #3
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 197
    Par défaut
    OKI je vois, en fait, faut creer une fonction...

    en fait, ma procedure est la suivante, celle que j'ai posté s'etait un exemple simple.

    la vrai procédure (en fait fonction) est celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    create or replace procedure heures_p_reste(eleve_id IN INT)
    AS
      cursor heures_p_reste is 
        SELECT SUM(BG_FORFAIT.FORFAIT_NBRE_HR_COND),MIN(BG_FORFAIT.FORFAIT_NBRE_HR_COND)
        FROM BG_FORFAIT,BG_POSSEDE
        WHERE BG_FORFAIT.FORFAIT_ID=BG_POSSEDE.FORFAIT_ID
        AND BG_POSSEDE.ELEVE_ID=eleve_id;
     
       h_sum integer;
       h_min integer;
    BEGIN
      open heures_p_reste;
      fetch
    Il faut donc, que je crée une fonction pour utiliser h_sum et h_min dans mon application... C'est bien ca ?

  4. #4
    Membre expérimenté
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2005
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 250
    Par défaut
    Elle se crée parfaitement mais quand je l'appele avec call, elle me renvoie rien alors qu'elle devrait.
    Pour l'instant ta procédure fait 2 chose:
    - créer un curseur
    - affecter certaines champs de la première ligne du curseur dans des variables (et encore la deuxième version ne le fait pas)
    Elle ne risque pas de te rendre quelque chose puisque tu ne lui demandes rien d'autre.

    J'ai un doute sur le OPEN et le FETCH. Il faut rajouter qqu chose ?
    En général un curseur se parcoure en boucle avec un FOR et/ou un LOOP de façon à ne pas traiter que la première ligne.

    D'une façon générale une procédure est là pour effectuer un traitement (UPDATE , DELETE ou INSERT), alors qu'une fonction doit retourner (instruction RETURN) quelque chose (une variable).

    La vraie question est: Que veux tu faire?

    Si tu veux récupérer le résultat d'un SELECT (celui de ton curseur) une procédure est à priori inutile, utilise juste le SELECT du SQL.

  5. #5
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 197
    Par défaut
    En fait, je cherche a effectuer les requetes necessitant des ressources improtantes par le serveur : SUM, Requetes imbriquées... On m'a dit de faire des procédures stockées. Apprement, derriere cela, il y a de nombreux concepts, les vues...

    Alors je sais pas ce que vous pouvez me conseiller de faire ?

  6. #6
    Membre expérimenté
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2005
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 250
    Par défaut
    Une règle qui vient de chez Oracle...
    "Si tu peux le faire en SQL fait le en SQL,
    si ca ne suffit pas utilise le PL/SQL,
    si ca ne suffit toujours pas (là ca devient plus rare), utilise le C ou Java en procédures stockées"


    Pourquoi utiliser une procédure stockée:
    pour effectuer un traitement un peu complexe et répété régulièrement si possible (sinon on fait juste un bloc PL/SQL qu'on lance une seule fois)

    Pourquoi utiliser une vue:
    pour ne pas avoir à réécrire toujours le même SELECT.
    (et éventuellement si tu veux optimiser ton accès aux données tu fais une vue matérialisée)

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 43
    Par défaut
    Citation Envoyé par pifor
    C'est normal, une procédure n'est pas une fonction: une procédure ne retourne rien . Pour avoir des exemples de fonctions retournant des curseurs, voir par exemple http://www.developpez.net/forums/sho...d.php?t=139679

    Une procédure stockée peut retourner tous les paramètres OUT ou INOUT qui lui sont passés ! Non ?

  8. #8
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Effectivement, une procédure peut avoir un ou plusieurs de ses argument in IN OUT ou OUT. Il ne s'agit pas vraiment d'un retour dans la mesure ou ces arguments sont transmis dès l'appel.

  9. #9
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 197
    Par défaut
    Donc pour le problème qui met posé, si je specifie les valeurs de retour de mes MAX et de mes MIN, je peux parfaitement mettre mes requetes dans ce genre de procédure ?
    Je vais faire ça je crois. Car je vois pas d'autres solutions à part ca.

Discussions similaires

  1. probleme avec le resultat d'une procédure stockée
    Par pbatty1 dans le forum SQL Procédural
    Réponses: 7
    Dernier message: 24/01/2012, 14h23
  2. [AC-2007] resultat d'une procédure stockée sur oracle
    Par Vyl.Coyot dans le forum VBA Access
    Réponses: 1
    Dernier message: 22/05/2010, 13h37
  3. Réponses: 2
    Dernier message: 20/03/2009, 09h43
  4. Probleme de caractères avec une procédure stockée
    Par spaukensen dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 27/03/2008, 10h55
  5. Réponses: 9
    Dernier message: 15/10/2007, 10h20

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