Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#1 17/02/2012 12:24:06
- asphator
- Membre
[Jasper + Procédure stockée] Comment faire un update?
Bonjour,
J'utilise JasperServer pour afficher des rapports.
Ces rapports sont développés sous iReport et ne peuvent se baser que sur une seule requête de type SELECT.
J'ai besoin de faire une mise à jour avant le SELECT (ex: last_consultation_date).
Pour tricher donc, j'ai la requête suivante :
SELECT * FROM func_update_report()
Jusque là, tout va bien.
Voici maintenant la procédure stockée :
CREATE OR REPLACE FUNCTION func_update_report() RETURNS SETOF data_report AS
$BODY$
DECLARE
record data_report;
BEGIN
UPDATE my_table SET last_consultation_date = now();
FOR record IN SELECT * FROM my_table
LOOP
RETURN NEXT record;
END;
RETURN;
END;
$BODY$
LANGUAGE 'plpgsql';
Le problème est le message d'erreur suivant lorsque la procédure stockée est appelée :
org.postgresql.util.PSQLException: ERREUR: ne peut pas exécuter UPDATE dans une transaction en lecture seule Où : instruction SQL « UPDATE my_table SET last_consultation_date = now() » PL/pgSQL function "func_update_report" line 5 at instruction SQL
C'est déjà bizarre en soit puisque par défaut, le mode de transaction devrait être à READ WRITE (j'ai vérifié le postgresql.conf également)...
M'enfin, admettons. Mais là encore, si jamais j'essaie de corriger en ajoutant un SET TRANSACTION READ WRITE; entre BEGIN et UPDATE, j'ai le message d'erreur suivant :
org.postgresql.util.PSQLException: ERREUR: le mode de transaction lecture/écriture doit être configuré avant d'exécuter la première requête Où : instruction SQL « SET TRANSACTION READ WRITE » PL/pgSQL function "func_update_report" line 5 at instruction SQL
que du coup, je ne cerne pas vraiment.
Auriez-vous une idée / explication / solution?
Merci d'avance.
Hors ligne
#2 17/02/2012 12:31:15
- gleu
- Administrateur
Re : [Jasper + Procédure stockée] Comment faire un update?
Avez-vous essayer d'exécuter vous-même votre requête ? autrement dit, sans passer par jasper.
Si non, et que ça ne passe pas, ne seriez-vous pas sur un esclave en lecture seule.
Si oui, et que ça passe, il est tout à fait possible que Jasper ouvre de lui-même une transaction en lecture seule... auquel cas vous ne pouvez rien faire, si ce n'est rien regarder dans le manuel de Jasper pour voir si une parade existe... bon courage dans ce cas.
Guillaume.
Hors ligne
#3 17/02/2012 12:31:42
- Marc Cousin
- Membre
Re : [Jasper + Procédure stockée] Comment faire un update?
À priori, ça doit être jasper reports qui passe la transaction en read only. C'est pas le genre de chose qui se fait tout seul… Ou bien l'utilisateur utilisé pour se connecter par jasper qui a un ALTER ROLE pour le passer en read only… ALTER role xxxx SET session CHARACTERISTICS AS TRANSACTION read only;
Marc.
Hors ligne
#4 17/02/2012 15:18:34
- asphator
- Membre
Re : [Jasper + Procédure stockée] Comment faire un update?
Déjà testé la requête sans passer par Jasper : cela fonctionne très bien.
Maintenant, cela n'explique pas pourquoi le SET TRANSACTION READ WRITE n'a pas d'effet, ni encore moins pourquoi elle entraîne une erreur.
J'ai vérifié le rôle de l'user en charge de l'exécution des requêtes par Jasper, j'ai testé avec :
GRANT ALL PRIVILEGES ON FUNCTION func_update_date() TO my_role;
ALTER ROLE my_role SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE;
Sans effet non plus...
Enfin, sous Oracle, il n'y a pas ce problème, donc selon moi, le soucis vient bien de la configuration de postgres quelque part...
Hors ligne
#5 17/02/2012 15:25:46
- gleu
- Administrateur
Re : [Jasper + Procédure stockée] Comment faire un update?
Maintenant, cela n'explique pas pourquoi le SET TRANSACTION READ WRITE n'a pas d'effet, ni encore moins pourquoi elle entraîne une erreur.
Si Jasper fait lui-même le BEGIN et configure la transaction en lecture seule, il n'est plus moyen de revenir en arrière. Cela expliquerait pourquoi votre SET TRANSACTION ne fonctionne pas (et vous renvoit l'erreur comme quoi "le mode de transaction lecture/écriture doit être configuré avant d'exécuter la première requête".
Enfin, sous Oracle, il n'y a pas ce problème, donc selon moi, le soucis vient bien de la configuration de postgres quelque part...
Argument très discutable. Vu l'erreur que vous recupérez, je suis prêt à parier que le problème vient de Jasper. Le plus simple est certainement de configurer la trace de toutes les requêtes pour savoir ce qui est exécuté avant votre procédure stockée. Je suis prêt à parier que Jasper exécute des requêtes avant.
Guillaume.
Hors ligne
#6 20/02/2012 10:54:01
- asphator
- Membre
Re : [Jasper + Procédure stockée] Comment faire un update?
Bonjour
Effectivement, vous avez raison. Il semblerait que Jasper ne fasse que des transactions read_only par défaut et qu'il faille passer en JNDI pour pouvoir modifier son comportement.
Je vais donc passer sous le forum de Jasper du coup ^^
Merci pour votre aide
ps: pour ceux qui seraient intéressés par la suite, voici le fil du discussion sur Jasper : http://jasperforge.org/plugins/espforum … icid=95700
Hors ligne