Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/04/2011, 13h12   #1
Futur Membre du Club
 
Homme
Inscription : juillet 2002
Messages : 67
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juillet 2002
Messages : 67
Points : 19
Points : 19
Envoyer un message via AIM à gillou13
Par défaut Question de débutant sur les curseurs implicites avec select 'variable'

Bonjour à tous,

je début en PL/SQL (cours au CNAM).

pour un exo, on nous demande de réaliser une procédure socké avec 3 entrées avec la possibilités de ne pas indiqué 2 paramètre sur les trois(NULL). cette fonction doit retourner à l'écran un liste en fonction des entrées indiqué :
ex : .

je bute sur la réalisation du select du curseur.
pour le moment la seul solution que je voie est d'utiliser un curseur par type select possible (en changeant à chaque fois la close WHERE). ça marche mais 'c'est moche...'

est 'il possible d'intégrer select avec condition?

j'ai essayé de passer par un champ texte mais je n'arrive pas à le passer en paramètre dans mon cursor...

quelqu'un peu m'orienter dans mon exo pour réaliser un truc convenable ?

Merci d'avance.
gillou13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 13h40   #2
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 437
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 437
Points : 4 173
Points : 4 173
Dans ta requête, utilise NVL sur les paramètres NULL
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/04/2011, 13h45   #3
Membre chevronné
 
Homme O. Joly
Support
Inscription : décembre 2010
Messages : 287
Détails du profil
Informations personnelles :
Nom : Homme O. Joly
Âge : 38
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Support
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2010
Messages : 287
Points : 617
Points : 617
Ce genre de chose ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SQL> CREATE OR REPLACE FUNCTION f (p1 IN varchar2, p2 IN varchar2 DEFAULT NULL ) RETURN varchar2 IS
  2   ttext varchar2(32767);
  3  begin
  4   FOR c IN (SELECT *
  5             FROM dba_objects
  6             WHERE object_name=p1
  7               AND owner=nvl(p2,'SYS') )
  8   loop
  9     ttext:=c.owner||'.'||c.object_name||' ID =>'||to_char(c.object_id) ;
 10   end loop;
 11   RETURN ttext;
 12  end f;
 13  /
 
Fonction crÚÚe.
 
SQL>
SQL> SELECT f(SEGMENT_NAME) FROM user_segments WHERE rownum <3;
 
F(SEGMENT_NAME)
--------------------------------------------------------------------------------
SYS.CON$ ID =>28
SYS.UNDO$ ID =>15
ojo77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 14h05   #4
Futur Membre du Club
 
Homme
Inscription : juillet 2002
Messages : 67
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juillet 2002
Messages : 67
Points : 19
Points : 19
Envoyer un message via AIM à gillou13
Pas tous à fait,

dans ton exemple ojo77 la ligne 7 pourrai être dupliquer et non remplacer une valeurs. a moins qu'il existe une valeurs magique : "prendre toutes les valeurs".

pour reprendre mon exemple via un champs texte, mon idée était de faire un algo de ce type :

Code :
1
2
3
4
5
6
7
8
9
10
req = "Select * from employe where "
si parametre1 non NULL alors 
   req = req + " service = " + parametre1
fin si
si parametre2 non NULL alors 
   req = req + " AND " + " sexe = " + parametre2
fin si
si parametre3 non NULL alors 
   req = req + " AND " +  " lieu = " + parametre3
fin si
ensuite passer req en paramètre de mon cursor.

sa doit être plus compréhensible comme ça.
gillou13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 14h48   #5
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Regarde Making a genric search sql Query pour la méthode la plus appropriée (décrite dans le PDF).

Peut être un peu complexe d'approche pour un débutant surtout si l'anglais te pose problème, mais autant apprendre tout de suite à faire les choses correctements.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 14h52   #6
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 437
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 437
Points : 4 173
Points : 4 173
C'est plutôt ça (Attention ne marche que si owner is not null):
Code :
1
2
3
4
SELECT *
FROM dba_objects
WHERE object_name=p1
AND owner=nvl(p2,owner)
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 15h04   #7
Futur Membre du Club
 
Homme
Inscription : juillet 2002
Messages : 67
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juillet 2002
Messages : 67
Points : 19
Points : 19
Envoyer un message via AIM à gillou13
Merci à tous,

je n'avait pas compris l'astuce en utilisant nvl et comparer l'objet à lui même si la valeur est null.
mais je devrai m'en sortir avec ça.

Et merci pour le lien vers ask Tom. (ou comment réviser son SQL et son anglais en même temps)
gillou13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 21h27   #8
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
C'est dommage tu n'as pas choisi la solution la plus performante !
Mais évidemment la solution à base de nvl fonctionne correctement et est largement suffisante pour un exo d'étudiant.

Si tu souhaites mieux comprendre la solution exposée sur asktom, je peux essayer de te l'expliquer en français adapté à un débutant, sinon garde à l'esprit que ton approche à base de IF était une bonne idée mais qu'elle nécessite une certaine technique (et/ou compréhension d'oracle) à creuser lorsque tu en auras besoin professionellement parlant.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h52.


 
 
 
 
Partenaires

Hébergement Web