|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
|
Membre chevronné
![]() |
Bonsoir je souhaite pouvoir creer un générateur dans une procédure sql
type Code :
Est ce possible via sql? merci beaucoup j y connais rien du tout a firebird...Et puis c est pas très documenté faut dire |
||
|
|
00
|
|
|
#2 | ||
![]() ![]() Claude RenouleaudDéveloppeur informatique Inscription : février 2006 Messages : 4 760 ![]() |
Salut
C'est possible via un EXECUTE STATEMENT: Code :
Le suspend n'est d'aucune utilité puisque que ta PS n'a pas de paramètres de sortie. Pour tester la présence du générateur, tu peux faire un select sur la table système RDB$GENERATORS. @+ Claudius
__________________
A la question technique que par MP/MV tu formuleras, la réponse aux oubliettes finira. |
||
|
|
00
|
|
|
#3 |
|
Membre chevronné
![]() |
si je fais un select alors que le generateur n existe pas, le script ne va pas planter j espere...
merci beaucoup pour t on aide je vais implémenter cela de suite petite question au passage...SET TERM ^ca sert a quoi? |
|
|
00
|
|
|
#5 |
|
Membre chevronné
![]() |
ok, en résumé ça permet de faire une transaction quoi
|
|
|
00
|
|
|
#6 |
|
Membre chevronné
![]() |
Pour ma procedure stockée, j aimerais qu elle me renvoie un integer mais
1/ je ne vois pas l interet de suspend de totue façon. 2/ etant une procédure stockée et non pas une fonction, comment puis je récupérer la valeur de retour de cette procédure? (typiquement le select du generateur) Vraiment désolé pour toutes ces questions pourries mais firebird c est vraiment spécial pour moi j'ai bossé sur Oracle, sql server, mySql et rien ne ressemble a Firebird je trouve |
|
|
00
|
|
|
#7 |
|
Membre chevronné
![]() |
oups désolé j avais pas vu dans la FAQ, vraiment abruti moi
donc ok pour le select de la procédure merci beaucoup pour ton aide |
|
|
00
|
|
|
#8 |
![]() ![]() Claude RenouleaudDéveloppeur informatique Inscription : février 2006 Messages : 4 760 ![]() |
Salut
Je me pose cette question: quelle est la finalité de cette PS ? Récupérer la valeur courante du générateur ? @+
__________________
A la question technique que par MP/MV tu formuleras, la réponse aux oubliettes finira. |
|
|
00
|
|
|
#9 | ||
|
Membre chevronné
![]() |
non,
elle doit récupérer la valeur du générateur, la valeur finale après incrément (paramètre), et surtout créer ce même générateur si celui-ci n existe pas. Des objets vont etre créer a la volée et je voudrais ne pas me soucier de l 'existence ou pas de tel ou tel générateur via PHP (déja que j ai du mal via firebird tout seul)... voici le code (qui marche pas bien sur de ce que j ai pondu pour le moment Code :
|
||
|
|
00
|
|
|
#10 |
![]() ![]() Claude RenouleaudDéveloppeur informatique Inscription : février 2006 Messages : 4 760 ![]() |
J'ai du mal à saisir ce que doit être la valeur de retour de IDFIN.
La valeur actuelle du générateur + le nombre de parties ? Ce qui serait IDFIN = IDDEBUT + NBPARTIES. @+
__________________
A la question technique que par MP/MV tu formuleras, la réponse aux oubliettes finira. |
|
|
00
|
|
|
#11 |
|
Membre chevronné
![]() |
tout a fait,
en fait on a pas trop confiance en les transactions on a un peu peur qu au niveau accés concurrent on se "partage" des id donc du coup prend la plage d id dont on a besoin avec un générateur puis on fait les insertions tranquilement apres dans la base. Maintenant je comprend vraiment pas pourquoi ma procédure n est pas créé et vu que les messages d erreurs ne sont pas vraiemnt très explicites... as tu une idée? |
|
|
00
|
|
|
#12 | ||
![]() ![]() Claude RenouleaudDéveloppeur informatique Inscription : février 2006 Messages : 4 760 ![]() |
Essaye comme ceci:
Code :
@+
__________________
A la question technique que par MP/MV tu formuleras, la réponse aux oubliettes finira. |
||
|
|
00
|
|
|
#13 |
|
Membre chevronné
![]() |
ça marche nickel
la seule modif que j ai faite vient du code de fin EXECUTE STATEMENT 'SELECT GEN_ID(' || :GENNAME || ', 0) FROM RDB$DATABASE INTO' || :IDDEBUT; EXECUTE STATEMENT 'SELECT GEN_ID(' || :GENNAME || ', '|| :NBPARTIES ||') FROM RDB$DATABASE INTO' || :IDfin; car au prochain appel j aurai besoin que le générateur soit déja incrémenté. Je te remercie beaucoup pour ton aide ça me fait vraiment beaucoup avancer. En espérant ne plus trop avoir de soucis ![]()
|
|
|
00
|
|
|
#14 | |
![]() ![]() Claude RenouleaudDéveloppeur informatique Inscription : février 2006 Messages : 4 760 ![]() |
Citation:
@+ Claudius
__________________
A la question technique que par MP/MV tu formuleras, la réponse aux oubliettes finira. |
|
|
|
00
|
|
|
#15 | ||
|
Membre chevronné
![]() |
me suis un peu trop avancé... voici ce que j ai fait en utilisant sql manager lite for firebird (ma version de firebird est 1.5.3) la compile: OK apres je l appelle ainsi (comme cité dans la FAQ) select IDDEBUT,IDFIN FROM consomme_parties(1, 2, 3) réponse: Code :
mais le pire c 'est que je ne peux plus recompiler la procédure en m affichant une message box: "there is an error in input field 'procedure body' " message d erreur en bas: Precompiler Error: Syntax error - STATEMENT ...je voies pas pourquoi puisqu a vant il n y en avait pas mais je supose que tant qu on a pas executé la procédure, on ne peut pas savoir si les requetes dynamiques fonctionnent... le problème est que l erreur n explique rien en soi, et surtout que meme en dropant ma proc, je ne peux plus la recréer... les joies de firebird ![]() tu as une idée? j ai essayé de trafiquer les requetes EXECUTE STATEMENT mais ça donne pas grand chose, je pense queça vient des liens que la proc créée avec la table des generateurs mais après... |
||
|
|
00
|
|
|
#16 | ||
![]() ![]() Claude RenouleaudDéveloppeur informatique Inscription : février 2006 Messages : 4 760 ![]() |
Resalut
Bon j'ai révisé ma copie Essaye comme ceci: Code :
__________________
A la question technique que par MP/MV tu formuleras, la réponse aux oubliettes finira. |
||
|
|
00
|
|
|
#17 |
|
Membre chevronné
![]() |
meme resultat j arrive a compiler apres j ai le message
Can't format message 13:896 -- message file C:\Program Files\EMS\firebird.msg not found. Dynamic SQL Error. SQL error code = -104. Token unknown - line 1, column 37. RDB$DB_KEY. peut etre que l outil que j utilise n est pas adapté... je crois que je vais faire la chose en php... |
|
|
00
|
|
|
#18 | ||||
|
Expert Confirmé
![]() ![]() ![]() Philippe MakowskiConsultant spécialité Firebird Inscription : mai 2002 Messages : 2 215 ![]() |
je ne comprend pas bien tes salades
mais 1/ les générateurs sont hors transaction et donc un GEN_ID(MON_GEN, 1) donnera toujours une valeur unique 2/ Citation:
si c'est ça autant utiliser SqlLite! Sinon le code serait plutot (cf note de version de Firebird 1.5 où execute statement est clairement expliqué) : Code :
Citation:
__________________
Philippe Makowski IBPhoenix - Firebird Membre de l'April |
||||
|
00
|
|
|
#19 | |
|
Membre chevronné
![]() |
Citation:
du coup on utilise pas les transactions pour éviter de faire des insert qui pourrait 'se croiser', typiquement a chaque interrogation il est primordial qu une plage d id soit occupée d ou l utilisation du generateur merci pour la précision mais le script semble planter sur toutes lignes contenant des EXECUTE STATEMENT et avec ou sans les ":" ça revient au même |
|
|
|
00
|
|
|
#20 | ||
|
Expert Confirmé
![]() ![]() ![]() Philippe MakowskiConsultant spécialité Firebird Inscription : mai 2002 Messages : 2 215 ![]() |
je n'aime pas l'idée de créer un objet à la volée, mais voilà :
Code :
__________________
Philippe Makowski IBPhoenix - Firebird Membre de l'April |
||
|
00
|
Copyright © 2000-2012 - www.developpez.com