|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : mai 2003 Messages : 6 ![]() |
Je suis un nouvel utilisateur de Interbase.
J'aimerai savoir comment executer une procédure stockée avec un corps dynamique comme sous SQL Server. Voici par exemple le code que je tape sous SQL server: Create procedure usp_Card_Select(@Id Int=NULL,@Name varchar=NULL) AS declare @Query as varchar(500) set @Query='select Car_Id, Car_Name, Car_Amount from Card ' set @Qeury=@Query + 'Where Car_State=1 ' if not @Id is null set @Query=@Query + ' and Id=' + @Id if not @Name is null set @Query=@Query + ' and Car_Name=' + @Name exec @Query Go ici je déclare une chaine qui contient la requete SQL à executer. Cette chaine change en fonction de la valeur du paramète @Id et/ou du paramètre @Name. Si un paramètre est défini, la requète change en fonction de ce paramètres. Si aucun paramètre n'est défini on renvoi tous les enregistrements. Enfin on execute la chaine SQL. Merci pour votre contribution. Brisky |
|
|
00
|
|
|
#2 | ||
|
Membre Expert
![]() Frédéric Inscription : octobre 2002 Messages : 1 722 ![]() |
Re,
Il te suffit d'adapter la procédure que je t'ai donné dans le forum Delphi et SGBD... Code :
|
||
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : mai 2003 Messages : 6 ![]() |
Si je comprend bien, avec Interbase il faut définir chaque branche séparement. Ceci dit j'obtiendrai une procédure monstrueuse si le nombre de paramètres devient important. Pour info, la procédure en question utilise 7 paramètres différents qui permettent de filtrer les données selon qu'il soient définis ou non.
Merci pour votre éclairage. Brisky |
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() Frédéric Inscription : octobre 2002 Messages : 1 722 ![]() |
Arff
A ma connaissance on ne peux pas faire de SQL Dynamique dans une procédure stockée. Mais je ne suis pas expert... En effet si tu as 7 paramétres (6 plus un qui represente la clé primaire) ca fait 6^2+1 = 65 possibilitées... Un peu chiant à développer... Tu as une autre alternative qui consiste à faire du SQLDynamique via le langage de programmation que tu vas utiliser pour interroger la base. Ceci dis il faut savoir qu'en terme de performance ca risque d'être moins bon que la procédure stoquée...(A tester...) mais du point de vue maintenance la solution de la procédure stockée risque de vite devenir ingérable (notamment si l'on doit ajouter un paramètre...) Bref à ta place, je ferai du SQLDynamique via le langage qui me sert à interroger la base (Delphi dans ton cas...) |
|
|
00
|
|
|
#5 |
|
Futur Membre du Club
![]() Inscription : février 2004 Messages : 43 ![]() |
On ne peut pas avec firebird???
J'ai cru voir que l'on pouvait le faire avec la commande execute statement... Mais pas sur du tout |
|
|
00
|
|
|
#6 | |
|
Membre émérite
![]() ![]() |
Citation:
J'avais créer une procedure stocké qui prends 4 params, je t'assure que c'est chiants à faire mais je me suis tapé 16 bloc de if end. Sinon, tu as tjs le choix de le faire via Delphi, comme Barbibulle te l'a dit. Courage
__________________
On progresse ..... |
|
|
|
00
|
|
|
#7 | |
|
Membre Expert
![]() Frédéric Inscription : octobre 2002 Messages : 1 722 ![]() |
Citation:
Et donc sous Interbase 6 ou firebird 1.0 il était impossible de faire des requetes dynamiques. Et en effet avec execute statement sous firebird1.5 on peut faire un peu de SQL dynamique (Il faut que les parametres de retours soient toujours en même nombre et de même type). Je n'ai pas encore testé cette nouveauté de firebird 1.5, et c'est vrai que j'ai du coup tendance à en oublier l'existance. |
|
|
|
00
|
|
|
#8 |
|
Futur Membre du Club
![]() Inscription : février 2004 Messages : 43 ![]() |
Dsl barbibulle, je ne disaiis pas du tout ca pour toi.
Je faisais une recherche sur le forum sur le SQL dynamique, je suis tombé dessus et j'ai répondu sans voir la date. Peut on avoir des parametres d'entrée avec le execute statement, qui me serviraient dans les clauses where? |
|
|
00
|
|
|
#9 | ||||||||||
|
Membre Expert
![]() Frédéric Inscription : octobre 2002 Messages : 1 722 ![]() |
Citation:
Citation:
Soit la requete ne revoie pas de données : Code :
Code :
Code :
Par exemple : Param1 est un parametre d'entré de ma PS de type integer et param2 de type varchar(10) Code :
Voilà ce qui ouvre pas mal de possibilités. |
||||||||||
|
|
00
|
|
|
#10 | |||
|
Futur Membre du Club
![]() Inscription : février 2004 Messages : 43 ![]() |
Citation:
Je dois le faire sur une base oracle et sur firebird. J'avais parié à mes collegues que firebird pouvait le faire.... Merci encore |
|||
|
|
00
|
|
|
#11 | |
|
Membre Expert
![]() Frédéric Inscription : octobre 2002 Messages : 1 722 ![]() |
Citation:
|
|
|
|
00
|
|
|
#12 |
|
Membre émérite
![]() ![]() |
Merci à vous tous pour ces infos.
Mais dois je migrer vers Firebird pour avoir cette fonctionnalité, parce que c'est quand même plus souple la requête dynamique que le codage que je fais actuellement avec Interbase 6 open edition. Comme je viens de lire qu'il n'y a pas de risque ,je vous tiens au courant de l'evolution des choses. A+
__________________
On progresse ..... |
|
|
00
|
|
|
#13 |
|
Membre habitué
![]() Inscription : juin 2003 Messages : 112 ![]() |
Salut
Sinon, petite info: moi j'utilise Interbase et j'étais confronté au même problème ... - j'utilise une sous procédure pour la requete principale (un curseur) à qui je passe tous les paramètres. - Dans le curseur, je ne double que les paramètres qui mettent en jeu les index, pour les autres, je fais des OR: admettons que le champ IDMARQUE ne soit pas indexé dans la table ARTICLE : Code :
SELECT NOM_ARTICLE FROM ARTICLE WHERE (IDMARQUE = :MARQUE OR :MARQUE = -1) |
|
|
00
|
|
|
#14 | |
|
Membre Expert
![]() Frédéric Inscription : octobre 2002 Messages : 1 722 ![]() |
Citation:
La seule contrainte c'est qu'on ne peux rechercher un IDARTICLE=-1. Donc faut prendre une valeur qui n'existera jamais dans la colonne. Mais sur le même principe on doit pouvoir faire : Code :
SELECT NOM_ARTICLE FROM ARTICLE WHERE (IDMARQUE = :MARQUE OR :MARQUE IS NULL) On a bien entendu la même contrainte on ne peux rechercher les IDMARQUE qui sont null. (mais si la colonne est NOT NULL il ne peux pas y en avoir et donc c'est la solution à adopter !) Merci J-P-B |
|
|
|
00
|
|
|
#15 |
|
Membre émérite
![]() ![]() |
Salut à tous,
Je me suis donc migrer vers Firebid 1.5.1. C'est vrai que j'ai pratiquement rien fais au niveau de mon système. Tous les autres appli fonctionnent. Seulement voilà, j'aimerais savoir la performance au niveau des requête dynamiques. Car la plupart de mes procedures stockés vont en dependre. Merci
__________________
On progresse ..... |
|
|
00
|
|
|
#16 |
|
Membre Expert
![]() Frédéric Inscription : octobre 2002 Messages : 1 722 ![]() |
Et bien vue que c'est dynamique, le moteur d'interbase ne peut pas préparer la requete, et donc elles vont être un peu moins performantes.
Un PS avec que des ordres SQL statiques est compilé et l'ordre est préparé, ainsi lors de l'exécution le moteur à moins de chose à faire. Mais bon il faut relativiser aussi et ne pas s'affoler pour rien, la baisse de performance n'est pas ennorme à mon avis. Suivant la requete et son temps d'exécution, il est possible que cette baisse de performance ne soit même pas mesurable ou du moins est non significatif. Mais pour le vérifier rien de mieux que l'analyse de performance sur un jeux de données représentatif. Ah oui dernière chose : Firebird 1.5 a été revue entièrement et optimisé, il est donc plus rapide d'interbase 6.0, donc même si vous perdez un peu en faisant du dynamique à mon avis c'est largement ratrapé par votre passage à firebird. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com