Vous n'êtes pas identifié(e).
Merci beaucoup gleu, tu m'enlèves une belle épine du pied.
En effet, je n'avais pas parcouru la commande EXECUTE...
Bonjour à tous,
Décidément aujourd'hui est la journée ou je n'avance pas...
Je rencontre ce problème :
J'ai une procédure stockée qui me retourne un curseur sur un gros SELECT. Par contre j'aimerai avoir une clause ORDER BY qui soit paramétrable.
C'est à dire que l'un des paramètre de ma procédure est un varchar où j'aimerai passer le paramètre de la clause ORDER BY.
Je n'ai pas de message d'erreur, mais cela ne tri rien :
CREATE OR REPLACE FUNCTION "PG_GetEvtInfos"("Curseur" refcursor, "Filter" varchar, "Order" varchar)
RETURNS refcursor AS
$$
BEGIN
OPEN "Curseur" SCROLL FOR
SELECT
"HIST_EVT_CODE",
FROM "HISTORY"
ORDER BY "Order";
RETURN "Curseur";
END;
$$
LANGUAGE plpgsql;A noter que j'aimerai effectuer la même chose avec la clause WHEN, ceci explique le paramètre "Filter".
Si qq'un a une idée, c'est sympa!
Merci ![]()
Bonjour gleu,
décidément c'est toi qui est d'astreinte sur ce forum? ;o)
Non en fait j'ai contourné le problème.
En fait je vais utiliser le curseur directement depuis mon programme en C.
A l'origine je voulais gérer le tout dans PostGreSQL mais apparemment on ne peut pas.
Bonjour à tous,
J'écris ce petit post, car j'avoue que mes connaissances en PostGreSQL sont limitées étant donné que je débute. Après quelques heures de recherche sur les curseurs, je rencontre un problème.
Le contexte :
Je développe une application qui communique avec une base PostGreSQL. Une des fonctions de la base, par l'appel d'une procédure stockée, est de renvoyer un grand nombre d'enregistrements.
Pour ne pas surcharger la mémoire, et étant donné que je n'aimerai afficher que 5 lignes des résultats par 5 lignes, je cherche une solution propre pour paginer la réponse de cette fonction.
Les curseurs semblent bien appropriés.
Mon problème :
J'ai une procédure stockée qui retourne un curseur sur le résultat de ma requête. Jusque là, pas de pb. Maintenant, j'aimerai développer une fonction Next(Nbre d'enregistrements à afficher), et Previous(Nbre d'enregistrements à afficher).
J'aimerai que ces fonctions ne prennent pas de paramètre curseur en entrée, et qu'elles me renvoie, respectivement, les 5 enregistrements suivant, et les 5 enregistrements précédent.
J'aurai imaginé faire : FOR record_var in FETCH FORWARD 5 IN mon_curseur LOOP RETURN NEXT record_var END LOOP;
mais PostGreSQL m'insulte quand je tente de créer cette fonction next()/previous().
Est-ce la meilleure façon de procéder?
Merci,
Mathieu.
Pourquoi pas!
Bien sur, je ne pourrai pas rentrer dans les détails pour des raisons évidentes de confidentialité (je fais çà dans une activité pro). J'espère avoir terminé cette partie du projet d'ici fin mars, et, pour avoir des retours satisfaisants sur le nombre d'écritures, il faudra attendre encore 1 mois.
Ainsi, si tu me rappelles d'ici fin mars, début avril, il n'y a aucun problème pour l'article!
(Si tu ne me le rappelles pas, j'aurai certainement oublié, car j'aurai certainement la tête dans d'autres activités!!)
Ok merci pour ton avis gleu.
Je venais de téléphoner à un collègue qui a fait le même système et comme tu l'as prédit, il a laissé le serveur en standard sur la flash... Le système tourne depuis 1 an, et pas de problème.
Je suis donc de ton avis, et je vais suivre ta stratégie.
Merci pour ton soutien!
Au niveau des journaux de transaction, si j'ai beau écrire mes données sur un tablespace pointant ma RAM, les journaux seront mis à jour sur le disque c'est çà? Peut on déplacer les journaux sur la RAM?
Pour ce qui est de l'utilisation normale, cela fonctionne, mais j'ai bien peur de détruire ma carte flash en très peu de temps, alors qu'il faut un minimum de maintenance.
En fait, pour être plus concret sur la structure de ma base, je dispose de plusieurs tables (moins de 10) qui seront statiques. Elles seront rarement mises à jour.
Une autre table servira d'historisation d'évènements. C'est cette table qui va être assez fréquemment mise à jour, et c'est celle là que je souhaite mettre sur la RAM.
Je souhaite effectuer un transfert des données écrites dans la RAM vers la FLASH, toutes les minutes à peu près, alors que la table d'historisation peut se voir ajouter plusieurs entrées à la minute. (cela reste normalement peu fréquent, mais je dois faire face à l'imprévu ;p)
Au pire, si le problème des journaux est tel que tu me l'a décrit, je peux toujours effectuer une copie de ma base entière en RAM au démarrage et la sauvegarder toutes les minutes?
Pour l'info, une coupure de courant ne peut normalement pas arriver, et si cela arrive, alors les données apparues dans la dernière minute seront perdues, et ce n'est "pas grave".
Je fais bien de l'embarqué, ainsi comme tu le dis, cela a de l'importance de gérer la mémoire.
En continuant mes recherches, toujours sur le Ram disk, j'ai remarqué que je pouvais créer un tablespace sur mon ram disk.
Est ce que cette solution est intéressante? Je crois que PostGreSQL écrira uniquement dans le tablespace que je lui indique, n'est ce pas?
L'autre souci, est de synchroniser un tablespace en RAM, avec un tablespace miroir en flashdisk. Mis à part le pg_dump et pg_restore périodique, n'y a t'il pas une solution plus propre?
(juste pour l'info, ma RAM est volatile)
Merci gleu pour cette réponse rapide.
En effet, j'étais en train de lire de la documentation sur une stratégie RAM Disk, avec comme tu le dis, des scripts de récupération du rep data sur extinction de la console, et opération inverse après démarrage.
Je risque aussi, lors d'une coupure de courant de perdre des données.
Tu me confirmes donc que PostGreSQL ne gère pas cela en natif et que seul le recours à une solution à base de RamDisk est envisageable?
Bonjour à tous,
Ne trouvant pas de posts à ce sujet, je me permets d'en écrire un :
J'aimerai savoir s'il est possible avec PostGreSQL d'optimiser le serveur pour une utilisation sur mémoire flash.
En effet, les cartes flash étant limitées en nombre d'écriture, j'aimerai pouvoir limiter le nombre d'écritures sur la flash en sorte de rallonger sa durée de vie.
En fait, est ce qu'il est possible d'avoir une base chargée uniquement en RAM, qui, périodiquement, se réplique sur une base en Flashdisk, après qu'une certaine quantité de données à ajouter soit présente en RAM?
Cordialement,
Mathieu
Mon problème est résolu.
Le problème était bien du au fait que sur mon image WinXPe, le secondary Logon service (runas) n'était pas disponible.
En fait ce problème était connu d'un collègue qui m'a envoyé un installeur (NSI) qui déploie le serveur PostGreSQL et qui créé un utilisateur postgres ainsi qu'un service qui démarrera le serveur.
J'ai également utilisé l'installeur (j'avais eu quelques soucis à l'origine mais j'avais réussi à régler le pb).
Le problème c'est que sous ce WinXP Embedded, je n'ai pas la commande RunAs qui permet d'exécuter sous un autre compte, ainsi quand je suis les étapes de l'installeur et que j'arrive à l'initialisation du cluster, il me dit qu'il ne peut pas trouver le Secondary Logon (run as) et ainsi ne peut pas initialiser la base.
Je choisis donc de ne pas l'installer en tant que service.
Après cela, j'ai créé le compte "postgres" à la main, et m'y suis loggé (et donc déloggé d'"Administrator"), et lorsque j'ai exécuté le dbinit() j'ai eu le même problème : "The system cannot find the file specified".
D'après toi, c'est typiquement un problème de compte utilisateur?
Ou bien est-ce un autre problème?
Bonjour à tous,
Je suis nouvel utilisateur postgresql et je rencontre des difficultés depuis la semaine dernière, lors de l'initialisation du serveur.
Je tente d'installer de façon manuelle PostGreSQL sur un Windows XP Embedded.
Après avoir installé PostGreSQL, via l'invité de commande msdos, je tente d'initialiser le serveur avec la commande "dbinit -D D:\PGSQL\data".
Sur mon PC WinXP, je n'ai aucun problème à initialiser le serveur, mais sur le Windows XP Embedded, je rencontre l'erreur :
"The system cannot find the file specified" (erreur lancée plusieurs fois!)
Bien sûr l'initialisation se termine avec un code : "child process exited with exit code 1"
J'ai déjà vérifié les dépendances de dll, avec Dependency Walker, et rien ne semble manquer. (A l'origine il en manquait quelques une : dbghelp.dll, hnetcfg.dll, mobsync.dll, w32topl.dll, mais j'ai tout rajouté manuellement, et inscrit les ActiveX avec regsvr32)
J'ai généré cette erreur en étant loggé en tant qu'admin, mais après avoir créé un compte postgres, j'ai toujours les meme erreurs.
Quelqu'un aurait il une idée concernant l'erreur?
Merci à tous