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 :

WHERE et Fonction


Sujet :

PL/SQL Oracle

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 40
    Points : 28
    Points
    28
    Par défaut WHERE et Fonction
    Bonjour a tous, si vous pouviez m'aider, j'ai une fonction qui me permet de déterminer la somme totale payée selon un identifiant.

    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
    CREATE OR REPLACE FUNCTION money_spent (customer_id NUMBER)
    RETURN  NUMBER
    IS
    somme NUMBER;
    BEGIN
    SELECT SUM(PRICE)
    INTO somme
    FROM T_RESERVATION
    WHERE buyer_id = customer_id;
    RETURN somme;
     
    EXCEPTION
    WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('Error : The customer does not exist');
    RETURN NULL;
     
    END;
    D'autre part j'essaye de récupérer dans une collection tous les noms de famille des personnes dont la somme totale est inférieure à 100, j'ai donc fait ce 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
    SET SERVEROUTPUT ON
     
     
    DECLARE
    TYPE customer_tab IS TABLE OF t_customer.last_name%TYPE INDEX BY PLS_INTEGER;
    tab_cus customer_tab;
    loop_count NUMBER (3) := 81;
    test NUMBER (4) :=0;
     
     
    BEGIN
    FOR i IN 1..loop_count LOOP
    test := test + 1;
    SELECT last_name
    INTO tab_cus(i)
    FROM T_CUSTOMER
    WHERE customer_id = test or money_spent(test) < 100;
    END LOOP;
     
    FOR i IN 1..loop_count
    LOOP
    DBMS_OUTPUT.PUT_LINE(tab_cus(i));
    END LOOP;
     
    END;
    Le fait de balancer ma fonction comme ca tel quel dans le where pose pb, mais je vois pas du tout comment faire. Merci pour votre aide

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 280
    Points : 11 736
    Points
    11 736
    Par défaut
    Je ne comprends pas trop où tu veux en venir avec toutes ces verrues programmatiques...

    Si tu veux les familles ayant dépensé moins de 100, il suffit d'utiliser un HAVING :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT C.last_name
    FROM T_CUSTOMER C
      INNER JOIN T_RESERVATION R ON R.buyer_id = C.customer_id 
    GROUP BY C.last_name
    WHERE SUM(R.price) < 100;
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    C'est un exercice qui veut ca, je suis obligé de passer par ses différentes étapes

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 280
    Points : 11 736
    Points
    11 736
    Par défaut
    Citation Envoyé par Spitfire378 Voir le message
    C'est un exercice qui veut ca, je suis obligé de passer par ses différentes étapes
    Alors je vais supposer que c'est un exercice de sensibilisation à la puissance du modèle ensembliste : le prof vous fait faire 50 lignes de merdouilles procédurales pour vous montrer ensuite comment il suffit d'une requête de cinq lignes, pour obtenir le même résultat (et avec des performances incomparables)

    bon, pour être constructif... quel est le code de création de tes tables ? quels sont les problèmes que tu rencontres ?
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  5. #5
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Points : 1 197
    Points
    1 197
    Par défaut
    Hi Antoun,

    je pense que le having au lieu du where
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT   c.last_name
        FROM t_customer c INNER JOIN t_reservation r ON r.buyer_id = c.customer_id
    GROUP BY c.last_name
      HAVING SUM (r.price) < 100;

  6. #6
    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
    Citation Envoyé par Spitfire378 Voir le message
    Le fait de balancer ma fonction comme ca tel quel dans le where pose pb
    Des précisions sur le pb? Un code/message d'erreur?

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/02/2011, 09h18
  2. Clause Where en fonction de la valeur d'un champs
    Par gb-ch dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 01/01/2007, 15h45
  3. Vue avec clause Where en fonction du USER
    Par lunab54 dans le forum Oracle
    Réponses: 8
    Dernier message: 29/08/2006, 18h39
  4. fonction booleenne dans une clause where ?
    Par user_h dans le forum Oracle
    Réponses: 1
    Dernier message: 20/10/2005, 15h05
  5. Fonction MAX dans une condition WHERE
    Par borgfabr dans le forum Langage SQL
    Réponses: 4
    Dernier message: 12/10/2004, 16h06

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