Comment appeler PostgreSQL procédure en Java?
Comment faire de requête de ce type en Java et obtenir les résultats:
SELECT filedata.num,st_area(ST_Difference(ST_TRANSFORM(filedata.the_geom,70066),filedata_temp.the_geom))
FROM filedata, filedata_temp
Where filedata.num=filedata_temp.num
Ou, je pense que ce sera mieux si je crée une procédure dans Postgresql à partir de cette requête.
CREATE OR REPLACE FUNCTION get_geom_difference()
RETURNS void AS
$$
BEGIN
SELECT filedata.num,st_area(ST_Difference(ST_TRANSFORM(filedata.the_geom,70066),filedata_temp.the_geom))
FROM filedata, filedata_temp
Where filedata.num=filedata_temp.num
end;
$$
LANGUAGE 'plpgsql'
et de l'appeler
Connection ce_proc= null;
ce_proc = DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgis","postgres","123456");
java.sql.CallableStatement proc = ce_proc.prepareCall("{get_geom_difference()}");
proc.execute();
proc.close();
ce_proc.close();
Mais comment obtenir des résultats de cette procédure en Java?
Mise à JOUR
J'ai essayé cette SP
DROP FUNCTION get_geom_difference();
CREATE OR REPLACE FUNCTION get_geom_difference()
RETURNS integer AS
$$
DECLARE
tt integer;
BEGIN
SELECT filedata.num INTO tt
FROM filedata
Where filedata.num=1;
RETURN tt;
END;
$$
LANGUAGE 'plpgsql'
et appel
Class.forName("org.postgresql.Driver");
Connection connect= null;
connect = DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgis","postgres","123456");
java.sql.CallableStatement proc = connect.prepareCall("{?=call get_geom_difference()}");
proc.registerOutParameter(1, java.sql.Types.INTEGER);
proc.executeQuery();
ResultSet results = (ResultSet) proc.getObject(1);
et ai une erreur:
org.apache.jasper.JasperException: Une exception s'est produite traitement
Page JSP /commit_changes.jsp à la ligne 25in line
proc.executeQuery();cause javax.servlet.ServletException:
org.postgresql.util.PSQLException: Pas de résultats ont été rendus par les
requête
Mais de requête
SELECT filedata.num
FROM filedata
Where filedata.num=1;
retourne 1
.
Où est l'erreur?
Qu'en est
Si vous êtes toujours bloqué après toutes ces réponses, à commencer par fournir de l'information qui aurait dû être ici pour commencer avec: les numéros de Version du logiciel en cours d'utilisation (une très vieille version de PostgreSQL qui n'a pas la langue de la procédure plpgsql pré-installé, pourrait être le problème), la définition de table de table
SELECT get_geom_difference()
dans psql
? Que vous obtenez un résultat là-bas? Si oui, que diriez-vous si, pour les tests, vous utiliser les classiques JDBC syntaxe de la requête avec un SELECT get_geom_difference()
au lieu de {call}
syntaxe?Si vous êtes toujours bloqué après toutes ces réponses, à commencer par fournir de l'information qui aurait dû être ici pour commencer avec: les numéros de Version du logiciel en cours d'utilisation (une très vieille version de PostgreSQL qui n'a pas la langue de la procédure plpgsql pré-installé, pourrait être le problème), la définition de table de table
filedata
(incompatibilité de type de données comme mentionné dans ma réponse pourrait être un problème).OriginalL'auteur Kliver Max | 2012-08-08
Vous devez vous connecter pour publier un commentaire.
Vous pouvez grandement simplifier la fonction. (Garder simpliste fonction de l'intérêt de la question.)
Si, techniquement, ce que vous avez à la question du travail, trop fourni par le type de données correspond. N'est ce pas? Est la colonne
filedata.num
de typeinteger
? C'est ce que je déduis de l'exemple. Sur votre autre question j'étais en supposantnumeric
par manque d'informations. Au moins l'un d'entre eux échouent.Si le type de retour de la fonction ne correspond pas à la valeur de retour vous obtenez un message d'erreur à partir de PostgreSQL fonction. Correctement configuré, votre PostgreSQL journal aurait détaillée des messages d'erreur dans ce cas.
Que voyez-vous, lorsque vous créez la fonction ci-dessus dans PostgreSQL, puis composez le:
de psql. (De préférence dans la même session, pour écarter un problème de bases de données, des ports, des serveurs ou des utilisateurs.)
L'appel d'une fonction simple de prendre un paramètre et renvoyant une valeur scalaire semble assez simple. Chapitre 6.1 de la JDBC PostgreSQL manuel a un exemple complet qui semble convenir parfaitement avec ce que vous avez dans votre question (Mon expertise est avec Postgres plutôt que de JDBC, tout de même).
OriginalL'auteur Erwin Brandstetter
Il y a un bon nombre de différents
CallableStatement
les constructeurs, mais seulement deux d'entre eux vous permettent de récupérer les résultats.Un
ResultSet
est retourné parCallableStatement.executeQuery()
. Il y a un bon exemple dans le lien ci-dessus.Je ne sais pas si l'obtention d'un scalaire résultat d'un
CallableStatement
est légal. Je m'attends àPgJDBC
à la traduire en un ensemble de lignes de une ligne, alors devrait travail.CallableStatement.executeQuery()
pas m'aider, u peut voir la question de mise à jour?OriginalL'auteur Craig Ringer
Votre requête est un exemple classique. Donc, ce que vous aurez besoin est
JDBC (Java Database Connectivity)
et tout le nécessaire pour serv elle, est dans le paquet java.sql
Donc à ce stade je recoemnd vous à lire un tutoriel et si vous avez quelques problème particulier écrire sur elle sur.
OriginalL'auteur Damian Leszczyński - Vash
Vous aurez besoin de JDBC pour le faire. Vous devriez être capable de trouver tous JDBC informations liées ici.
Prendre un coup d'oeil ici pour plus de détail tutoriel sur la façon de connecter votre application Java pour votre PostgreSQL.
Le lien que j'ai posté est d'Oracle (utilisé pour le Soleil) JDBC tutoriel. Elle doit être indépendante de base de données et doit couvrir les bases. J'ai inclus un lien qui devrait ensuite prendre l'OP, pour une approche plus directe de ce qu'il/elle est après.
De sens maintenant, quand vous le mettre de cette façon. 🙂
OriginalL'auteur npinti
fonctionne à 100% java 7 et postgres pgadmin 2016, l'Utilisation createNativeQuery Dans votre transaction écrire ce
et le changement monschema.mymethodThatReturnASelect
pour le schéma, et le nom de votre fonction.
...etc...etc.
OriginalL'auteur diego matos - keke