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 :

Appelle d'un procédure dans une autre


Sujet :

PL/SQL Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 192
    Points : 79
    Points
    79
    Par défaut Appelle d'un procédure dans une autre
    Bonjour

    je suis débutant en procédure stockée, et j'aurais besoin d'un petit coup de main.
    Voila ce que je voudrais faire dans une procédure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM ma_table WHERE id IN getMaTableIdByType(1) AND 
        NOT IN getMaTableIdByType(4)
    ou getMaTableIdByType est une procédure stockée.
    Je ne sais pas trop ce que devrait retourner getMaTableIdByType.
    Peut être que je devrais faire autrement, mais je ne vois pas comment.
    Une idée ?

    Merci de vos conseils

  2. #2
    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
    Bonjour,
    est ce que getMaTableIdByType() est une fonction ou une procédure?

    il vaut mieux donner le code source

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 192
    Points : 79
    Points
    79
    Par défaut
    Bonjour guizaniseifislam

    getMaTableIdByType est une fonction. Pour l'instant elle a cette tête la
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    TYPE tcur IS REF CURSOR;
    FUNCTION getAricleIdList(type IN NUMBER) return tcur
      IS
        cur tcur;
      BEGIN
        OPEN cur FOR
          SELECT ar_id FROM article WHERE AT_ID=type ;
        return cur;
      END getAricleIdList;
    Bien évidement ceci ne convient pas
    Et il faudrait que ca convienne

    Merci

  4. #4
    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.

    Votre fonction renvoie un curseur alors que NOT IN attend une liste de valeurs. Cela ne peut fonctionner.
    D'autre part, vous ne fermez pas le curseur, ce qui n'est pas bien.

    Votre requête est-elle dans un package dans lequel sont également définies vos fonctions?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 192
    Points : 79
    Points
    79
    Par défaut
    Toutes les fonctions sont dan le même package. Ma requête est exécuté dans une des fonctions.
    Je sais bien que la fonction getAricleIdList ne renvoie pas le type de valeur attendu par NOT IN.
    Je ne sais pas quelle type doit renvoyer getAricleIdList.
    Est ce que vous pouvez m'aider ?
    Mercie

  6. #6
    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
    Pourquoi ne pas essayer de boucler, au sein de ta fonction, sur le curseur et concaténer les valeurs de la colonne ar_id dans une chaine et ta fonction retourne une chaine au lieu de "tcur":

    par exemple elle retourne: ('1', '12', 'ART125', ...)

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 192
    Points : 79
    Points
    79
    Par défaut
    c'est ce que je voulais faire, mais mon supérieur ne veut pas. Il dit que question de performance ce n'est pas bien.... Est ce que vous avez une autre idée ?

  8. #8
    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
    travaille alors avec EXISTS et NOT EXISTS
    au lieu de
    SELECT * FROM ma_table WHERE id IN getMaTableIdByType(1) AND
    NOT IN getMaTableIdByType(4)
    fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT * FROM ma_table m
    WHERE EXISTS (SELECT 1 FROM article a WHERE m.id = a.ar_id and 
    AT_ID = 1) AND 
    NOT EXISTS (SELECT 1 FROM article a WHERE m.id = a.ar_id and 
    AT_ID = 4)

  9. #9
    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
    Effectivement, si la fonction se limite à une requête, inutile de passer par elle.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 192
    Points : 79
    Points
    79
    Par défaut
    merci pour vos réponses, je suis d'accord avec vous. mais on fait plus ce que veut le chef que ce qu'on pense juste
    Je vais le laisser trouver la solution

    Encore merci

  11. #11
    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
    S'il veut absolument une fonction et pas de liste de valeurs, il va s'embêter pour pas grandchose...

    Mais bon, c'est le chef.

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

Discussions similaires

  1. [Turbo Pascal] Appel d'une procédure dans une autre
    Par triana dans le forum Turbo Pascal
    Réponses: 7
    Dernier message: 08/04/2012, 02h33
  2. Appel d'une procédure dans une autre procédure
    Par logo98 dans le forum Langage
    Réponses: 7
    Dernier message: 20/05/2009, 14h50
  3. Procédure dans une autre
    Par chris_013 dans le forum PL/SQL
    Réponses: 1
    Dernier message: 17/12/2008, 15h40
  4. Comment appeler une procédure dans une autre unité ?
    Par michel71 dans le forum Langage
    Réponses: 1
    Dernier message: 19/09/2007, 17h27
  5. Réponses: 2
    Dernier message: 22/12/2006, 12h35

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