Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#1 Re : PL/pgSQL » [Jasper + Procédure stockée] Comment faire un update? » 20/02/2012 10:54:01
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
#2 Re : PL/pgSQL » [Jasper + Procédure stockée] Comment faire un update? » 17/02/2012 15:18:34
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...
#3 PL/pgSQL » [Jasper + Procédure stockée] Comment faire un update? » 17/02/2012 12:24:06
- asphator
- Réponses : 5
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.
Pages : 1