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 Fonction avec NULL


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 145
    Points : 61
    Points
    61
    Par défaut Problème Fonction avec NULL
    Bonjour,

    J'ai un petit soucis avec une de mes fonctions.

    Elle affiche une adresse en lui donnant un nom, prénom et une date de naissance. Tout vas bien si on donne les 3 données, cependant si je met la date de naissance à NULL, ça ne fonctionne plus.

    Quelqu'un peut m'expliquer pourquoi et comment résoudre ce soucis ?

    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
    26
    27
    28
    29
     
    CREATE OR REPLACE FUNCTION adress_locat
    ( v_nom IN Personne.nom%TYPE,
      v_prenom IN Personne.prenom%TYPE,
      v_datenaiss IN Personne.datenaiss%TYPE)
     
    RETURN VARCHAR2 
    IS
      v_rue Logement.rue%TYPE;
    BEGIN
        SELECT rue INTO v_rue
    	FROM Personne,Signataire,Contrat,Logement
    	WHERE v_nom=Personne.nom
    		  AND v_prenom=Personne.prenom
    		  AND v_datenaiss=Personne.datenaiss
    		  AND Personne.id=Signataire.idpersonne 
              AND Contrat.numero=Signataire.numcontrat 
    	      AND Contrat.idlog=Logement.idlogement;
    	RETURN(v_rue);
    END adress_locat;
    /
     
    VARIABLE g_rue VARCHAR2(50);
     
    EXECUTE :g_rue := adress_locat('Di Toro','Marco','18-02-1980');
    PRINT g_rue;
     
    EXECUTE :g_rue := adress_locat('Reventlov','Giskard',NULL);
    PRINT g_rue;

  2. #2
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Points : 6 446
    Points
    6 446
    Billets dans le blog
    1
    Par défaut NULL n'est pas égal à NULL (ni différent d'ailleurs)
    Bonjour,
    NULL n'est pas une valeur, mais l'absence de valeur. Donc v_datenaiss=NULL n'est jamais vrai. Le cas où v_datenaiss est à gérer avec une autre requête avec un v_datenaiss IS NULL.
    Cordialement,
    Franck

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    En une requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND Personne.datenaiss = nvl(v_datenaiss,Personne.datenaiss)
    Pour de meilleur perf il faut faire plus de code :
    Making a genric search sql Query

  4. #4
    McM
    McM est déconnecté
    Expert éminent

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND Personne.datenaiss = nvl(v_datenaiss,Personne.datenaiss)
    Attention ceci ne marche que si Personne.datenaiss n'est pas null

    sinon faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND NVL(Personne.datenaiss, -1) = nvl(v_datenaiss,NVL(Personne.datenaiss,-1))

  5. #5
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Points : 6 446
    Points
    6 446
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND NVL(Personne.datenaiss, -1) = nvl(v_datenaiss,NVL(Personne.datenaiss,-1))
    Mais avec ce prédicat, il n'utilisera jamais d'index même lorsqu'on connaît la valeur

    Par contre cela reste possible avec une seule requête et une execution optimale dans tous les cas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ... WHERE v_datenaiss is null
    UNION ALL
    SELECT ... WHERE v_datenaiss is not null and Personne.datenaiss=v_datenaiss
    Dans ce cas l'optimiseur choisira l'un ou l'autre à l'exécution.

    Cordialement,
    Franck

  6. #6
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 145
    Points : 61
    Points
    61
    Par défaut
    Merci

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

Discussions similaires

  1. Problème fonction avec fopen
    Par val347 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 30/05/2014, 14h15
  2. problème fonction avec vb 2008
    Par walid kh dans le forum VB.NET
    Réponses: 2
    Dernier message: 29/03/2010, 12h05
  3. Réponses: 7
    Dernier message: 21/11/2005, 14h21
  4. Problème avec NULL
    Par Fiquet dans le forum Débuter
    Réponses: 5
    Dernier message: 26/10/2005, 13h40
  5. Problème Cast avec NULL values
    Par WwiloO dans le forum Langage SQL
    Réponses: 1
    Dernier message: 13/10/2005, 10h49

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