[Oracle 8i] requête paramétrable ?

requête paramétrable ? [Oracle 8i] - SQL/NoSQL - Programmation

Marsh Posté le 02-05-2005 à 15:03:44    

Bonjour,
 
J'ai 4 paramètres en entrée dans une requête SQL, et ces 4 paramètres sont facultatifs.
Comme je n'ai pas envie de réécrire une clause WHERE à chaque fois que j'ai des paramètres renseignés ou pas, je me posais la question de savoir s'il y avait un moyen en PLSQL ou en SQL de faire une requête générique ?
 
Si au moins un des paramètres n'est pas alimenté, la restriction va se faire sur :
monChamp = '', ou monChamp = NULL
Donc je n'obtiendrai pas le résultat désiré.
 
La question est d'autant plus importante que le nombre de paramètres à renseigner est important : si j'ai 10 paramètres à saisir, ça me parrait un peu long pour construire la requête SQL si je dois faire des tests conditionnels.
 
 
Merci d'avance !

Reply

Marsh Posté le 02-05-2005 à 15:03:44   

Reply

Marsh Posté le 02-05-2005 à 15:22:18    

salut
 
tu peux faire une procédure PLSQL si tu es sous Oracle, tu aura ta fonction à laquelle tu passeras tes parametres.
 
ca ressamble à ca :
PROC ins(nom IN VARCHAR2,...) AS (ou IS)
INSERT INTO table VALUES(nom,...)
END

Reply

Marsh Posté le 02-05-2005 à 15:28:21    

Est-ce que tu peux préciser s'il te plait ?

Reply

Marsh Posté le 02-05-2005 à 15:36:24    

1) utilises-tu Oracle ?
 
2) si oui, c'est comme si tu écrivais une fonction:
 
CREATE PROCEDURE mon_insertion(Parametre1 IN format, autres parametres en IN=ENTREE)    format=VARCHAR2,NUMBER,...
BEGIN
   INSERT INTO ta_table values (parametre1, parametre2,... ce que tu veux);
END
 
après pour l'utiliser:
 
EXEC mon_insertion('toto','rue des fleurs',55555,'Paris....);
 
voila
 
bonne chance

Reply

Marsh Posté le 02-05-2005 à 15:59:11    

Je travaille bien sous Oracle.
 
Question sur ta méthode :
Qu'est-ce que mettre les valeurs des paramètres dans une table apporte ?
 
Est-ce que ça facilite la construction de la clause WHERE de la requête par la suite ?
 
A quoi correspond cette procédure ?
EXEC mon_insertion('toto','rue des fleurs',55555,'Paris....);  
 

Reply

Marsh Posté le 02-05-2005 à 16:04:38    

le exec te permet d'exectuter ta procédure.
 
en regardant des cours ou exmples sur le PLSQL, tu pourras voir que dans ta procédure tu peux mettre des conditions:
IF nom IS NULL
THEN requete1
else requete avec nom
END IF;
 
j'espere que c'est bien un truc comme ca que tu cherches !

Reply

Marsh Posté le 02-05-2005 à 16:19:18    

Merci de ta réponse, mais c'est justement ce que je ne recherche pas : je veux éviter les conditions IF THEN ELSE.
 

Reply

Marsh Posté le 02-05-2005 à 22:59:46    

Peut-être qu'en utilisant des NVL et DECODE tu pourra traiter les cas que tu envisages.
 
NVL(TOTO, 'TATA') : renvoies TOTO si non NULL, et 'TATA' sinon.
 
DECODE( expression , search , result [, search , result]... [, default] ) : cf ici http://www.techonthenet.com/oracle [...] decode.htm
 
A mon avis tu cherchais la fonction DECODE ... :)

Reply

Marsh Posté le 03-05-2005 à 20:35:57    

personnellement je pense que la meilleure solution c'est encore la procédure plsql, c'est quand mm nettement plus puissant qu'une requete sql normal même si c'est vrai que la fonction nvl et decode peut aidé dans ce cas la...
 
par contre, je ne comprends pas pkoi:
EXEC mon_insertion('toto','rue des fleurs',55555,'Paris....);  
 
le EXEC n'a rien a faire la, en sql il suffit d'appelé simplement la procédure par son nom. EXEC est parfois utilisé dans dans des programmes pro C ou pro Cobol mais pas de cette façon la non plus.  
Sous sqlplus ou autre interface sql, il suffit de simplement appelé la fonction ou la procédure.

Reply

Marsh Posté le 04-05-2005 à 07:28:46    

Perso, j'utilise un truc sous SQL Server, qui est pas forcément super terrible, mais bon, ça à l'avantage de marcher :D
 
Je n'ai par contre pas testé avec des requêtes paramètrées, je préfère passer par une PS. Voici un petit exemple :
 

Code :
  1. CREATE PROCEDURE DaArjunaProc
  2. (
  3.     @groumpf as integer = 0
  4. )
  5. AS
  6. BEGIN
  7.     select heure
  8.     from jour
  9.     where (reveil = @groumpf or @groumpf = 0)
  10. END
  11. GO


 
=> Là, ça me sort les infos en fonction du paramètre @groumpf, à moins que ce dernier ne soit pas fourni (à ce moment, il prend la valeur par défaut 0), auxquel cas le @groumpf = 0 est toujours vrai.
 
PS: Mise à part la syntaxe qui diffère légèrement entre T-SQL et PL/SQL, les deux langages sont parfaitement utilisables.
 
Ensuite, pour éxécuter le bignou, ça donne :
 

Code :
  1. -- Test avec @groumpf
  2. exec DaArjunaProc 5;
  3. -- Test sans @groumpf
  4. exec DaArjunaProc;

Reply

Marsh Posté le 04-05-2005 à 07:28:46   

Reply

Marsh Posté le 10-05-2005 à 09:58:10    

en réponse à moi22...
 
"le EXEC n'a rien a faire la"
 
il est nécessaire pour appeler une Procédure PL/SQL, comme décrit plus haut.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed