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 :

curseur en paramètre


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Par défaut curseur en paramètre
    bonjour,
    est'il possible de passer en paramètre à une fonction pl sql un curseur , et qu'il soit deja plein (je crois avoir vu quelque part une solution pour en passer un qui mais qui s'execute à chaque appel de la fonction)
    merci pour toutes vos contributions

  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
    Il est possible de passer un curseur en paramètre d'une procédure ou fonction PL/SQL. Voir l'exemple suivant dans le PL/SQL User's Guide and Reference.

    Un curseur n'est pas vide ou plein: ce n'est qu'une sorte de pointeur sur le résultat d'une requête; le curseur est positionné sur la prochaine ligne qui n'a pas encore été retournée par un FETCH.

    PS:merci de préciser votre version d'Oracle.

  3. #3
    Membre éprouvé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Par défaut
    ->9i
    le probleme avec ta solution (ref cursor, moi j'utilise sys_ref_cursor) c'est qu'a chaque appel de la fonction il y'a ré-execution de la requete sur laquelle pointe le curseur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (OPEN generic_cv FOR SELECT * FROM employees;)
    dans ton exemple. mieux vaut laisser les données la ou elles sont dans ce cas (dans la table) et faire une jointure avec...
    j'éspere avoir été clair quant à l'exlication de mon problème

  4. #4
    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
    Je propose seulement un exemple et non une solution à un problème qu'il faudrait préciser davantage. Que voulez-vous précisémment faire ?

  5. #5
    Membre éprouvé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Par défaut
    merci d'avoir repondu aussi vite
    voila disons pour simplifier que j'ai deux tables tres volumineuses
    au lieu de faire une jointure entre ces deux tables pour pouvoir recuperer des données je prefère charger la deuxieme table dans un curseur, le passer en parametre à une fonction qui "simulera" la jointure anciennement faite avec les deux tables.

    ->la solution que tu propose permet effectivement de passer une reference d'un curseur en parametre à une fonction, mais voila il se trouve qu'a chaque fois qu'il y'a appel à la fonction il y'a aussi re-éxecution de la requete qui alimente le curseur CE QUI RALENTI ENORMEMENT l'execution.
    voici un bout de code pour etre plus preci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select champs1,
    champs2,
    sum(champs3*ma_fonction(sysdate,champs4,cursor(select champs5 from table2)))
    from ...
    group by...
    à chaque ligne du select j'ai un appel de ma_fonction et donc re-execution du cursor(select champs5 from table2)
    alors que moi je veux executer cursor(select champs5 from table2) une seule fois pour toute et travailler dessus

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Par défaut
    "Simuler" une jointure à la main ? Mais Oracle est justement FAIT pour traiter au mieux ce genre de choses !

    Faire une jointure "à la main" n'est en aucun cas une option.

    Les options sont :

    - Ecrire la requête différemment
    - Etudier l'impact de différents index possibles sur la requêtes grâce à des outils comme EXPLAIN PLAN, AUTOTRACE et TKPROF

    Pour plus d'infos vous devriez lire le Performance Guide. Si vous nous donnez plus d'infos sur vos tables, votre requête exacte et son plan d'exécution, alors nous pourrons aussi vous faire quelques suggestions, comme créer certains index plutôt que d'autres .

    Cordialement,

    rbaraer

  7. #7
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par jadey
    moi je veux executer cursor(select champs5 from table2) une seule fois pour toute et travailler dessus
    Au pire, tu crées une collection et tu l'utilises dans ta fonction.
    Mais pour l'initialisation de ta collection, faut le faire avant la requete.

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/06/2009, 17h56
  2. Passer un curseur en paramètre d'une procédure
    Par tommy_f dans le forum Forms
    Réponses: 4
    Dernier message: 13/05/2008, 16h54
  3. Réponses: 2
    Dernier message: 26/12/2007, 12h04
  4. Passer un curseur en paramètre d'une fonction?
    Par Lafoudre dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/04/2007, 15h00
  5. [PL/SQL] Curseur avec Paramètre
    Par blids dans le forum Oracle
    Réponses: 5
    Dernier message: 10/10/2004, 20h07

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