|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité régulier
![]() Inscription : octobre 2007 Messages : 19 ![]() |
Bonjour,
J'ai créé une table temporaire dans une procédure dans laquelle je stocke les résultats d'un calcul. A la fin de la procédure, je renvoie les lignes de cette table temporaire comme résultat de la fonction. Cela marche très bien lors du premier appel de la fonction. mais lors du 2ème appel, il me met le message d'erreur suivant : ERROR: relation with OID 25509 does not exist En fait, je crois qu'il garde en mémoire l'OID de la table créée lors du 1er appel de la proc. Mais comme la table est détruite sur le commit, elle doit être recréée avec un autre OID : d'où mon problème. Merci de votre aide ... |
|
|
00
|
|
|
#2 |
|
Membre émérite
![]() ![]() Inscription : mars 2002 Messages : 770 ![]() |
bonjour,
peux tu mettre ta fonction stp ? |
|
|
00
|
|
|
#3 | ||
|
Invité régulier
![]() Inscription : octobre 2007 Messages : 19 ![]() |
voici la fonction.
Je l'ai plus utilisée pour apprendre à maîtriser les tables temporaires dans les procs stockées car on pourrait faire la même chose avec une focntion SQL qui renverrait un select ... limit X ... A priori, mon problème viendrait du fait suivant : "PL/PgSQL met en cache les fonctions. Un effet de bord malencontrueux est que, si une fonction PL/pgsql accède à une table temporaire et que cette table est ensuite supprimée et recréée, un prochain appel à la fonction échouera car le contenu de la fonction en cache pointera toujours vers l'ancienne table temporaire". Comment faire pour éviter ce problème ? Code :
|
||
|
|
00
|
|
|
#4 |
|
Membre émérite
![]() ![]() Inscription : mars 2002 Messages : 770 ![]() |
normalement il ne devrait pas mettre en cache, ta fonction est VOLATILE
|
|
|
00
|
|
|
#5 | ||
|
Invité régulier
![]() Inscription : octobre 2007 Messages : 19 ![]() |
Le problème venait effectivement du fait que pg met en cache les fonctions : si une fonction PL/pgsql accède à une table temporaire et que cette table est ensuite supprimée et recréée, un prochain appel à la fonction échouera car le contenu de la fonction en cache pointera toujours vers l'ancienne table temporaire
même si la fonction est VOLATILE, le problème existe pour les tables temporaires. La solution consiste à utiliser EXECUTE. cf code commenté ci-dessous Code :
|
||
|
|
00
|
|
|
#6 |
|
Membre émérite
![]() ![]() Inscription : mars 2002 Messages : 770 ![]() |
Oui effectivement, je connaissais pas ce comportement, j'ai vu sur techdev de pg, qu'il fallait utiliser un execute, etrange .... est ce que ce sera un jour corrigé ? je ne sais pas , Bruce Momjian connait ce bug depuis la 7.4
|
|
|
00
|
|
|
#7 |
|
Candidat au titre de Membre du Club
![]() Inscription : juin 2006 Messages : 26 ![]() |
Je viens de tester sur la version 8.3 : le problème persiste
|
|
|
00
|
|
|
#8 |
|
Membre régulier
![]() ![]() Inscription : mai 2002 Messages : 116 ![]() |
merci pour le tuyo, je viens de rencontrer le même problème également. C'est quand même extraordinaire ...
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com