如何在Java中调用PostgreSQL过程?
如何在Java中进行这样的查询并得到结果:如何在Java中调用PostgreSQL过程?,java,postgresql,Java,Postgresql,如何在Java中进行这样的查询并得到结果: 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 或者,我认为如果我从这个查询在Postgres中创建过程会更好 CREATE OR REPLACE FUNCTI
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
或者,我认为如果我从这个查询在Postgres中创建过程会更好
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'
叫它
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();
但是如何在Java中从这个过程中获得结果呢
更新
我试过这个
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'
打电话
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);
并得到一个错误:
org.apache.jasper.jaspereException:处理时发生异常
JSP页面/commit_changes.JSP,第25行第行
根本原因javax.servlet.ServletException:
org.postgresql.util.PSQLException:服务器未返回任何结果
质疑
但质疑
SELECT filedata.num
FROM filedata
Where filedata.num=1;
返回1
哪里出错了?您的查询示例很典型。所以你需要的是
服务它所需的一切都在包装中
所以在这一点上,我建议你阅读一些教程,如果你有一些特殊的问题,写在上面 您将需要JDBC来完成这项工作。您应该能够找到所有与JDBC相关的信息
查看有关如何将Java应用程序连接到PostgreSQL的更详细教程。有很多不同的CallableStatement
构造函数,但是
CallableStatement.executeQuery()
返回一个ResultSet
。上面的链接中有一个很好的完整示例
我不知道从CallableStatement
获取标量结果是否合法。不过,我希望PgJDBC
将其转换为一行的行集,因此它应该可以工作。您可以大大简化该函数。(为了这个问题,保持简单化的函数。)
不过,从技术上讲,如果数据类型匹配,那么问题中的内容也会起作用。是吗?列filedata.num
的类型是否为integer
?这就是我从这个例子中收集到的。由于缺乏信息,我当时假设是数值型的。至少有一个会失败
如果函数的返回类型与返回值不匹配,则PostgreSQL函数会出错。如果配置正确,在这种情况下,您的PostgreSQL日志将显示详细的错误消息
在PostgreSQL中创建上述函数并调用时,您看到了什么:
SELECT get_geom_difference(1);
从。(最好在同一会话中,以排除数据库、端口、服务器或用户的混合。)
调用一个包含一个参数并返回一个标量值的简单函数似乎非常简单。有一个完整的例子,似乎与您的问题完全一致(但我的专业知识是Postgres而不是JDBC)。100%java 7和Postgres pgadmin 2016,在您的事务中使用createNativeQuery编写此
并更改myschema.mymethodthattreturnaselect
用于方案和函数的名称
@Override
public List<ViewFormulario> listarFormulario(Long idUsuario) {
List<ViewFormulario> list =null;
try {
Query q = em.createNativeQuery("SELECT * FROM myschema.mymethodThatReturnASelect(?);");
q.setParameter(1, idUsuario);
List<Object[]> listObject = (List<Object[]>) q.getResultList();
if (listObject != null && !listObject.isEmpty()) {
list = new ArrayList<>();
for (Object o[] : listObject) {
ViewFormulario c = new ViewFormulario();
c.setIdProyecto(o[0] != null ? Long.valueOf(o[0].toString()) : -1L);
@覆盖
公共列表Formulario(长idUsuario){
List=null;
试一试{
Query q=em.createNativeQuery(“从myschema.mymethodThatReturnASelect(?);”中选择*;
q、 setParameter(1,idUsuario);
List listObject=(List)q.getResultList();
if(listObject!=null&&!listObject.isEmpty()){
列表=新的ArrayList();
for(对象o[]:listObject){
ViewFormulario c=新的ViewFormulario();
c、 setIdProyecto(o[0]!=null?Long.valueOf(o[0].toString()):-1L);
…等等…等等。CallableStatement.executeQuery()
帮不了我,你能看一下问题更新吗?当这个问题被标记为PostgreSQL时,你为什么要链接到Oracle文档?我觉得更合适。@ErwinBrandstetter:我发布的链接是Oracle的(以前是Sun的)JDBC教程。它应该是独立于数据库的,并且应该涵盖基础知识。我已经包含了一个链接,可以让OP更直接地了解他/她所追求的东西。现在这样说是有意义的。:)关于SELECT get_geom_difference()
在psql
中?您在那里得到结果了吗?如果是,那么对于测试,您使用传统的JDBC查询语法,使用选择get\u geom\u difference()
而不是{call}
syntax?如果您在回答了所有这些问题后仍然感到困惑,请首先提供本应在此处开始的信息:正在使用的软件的版本号(可能是一个非常旧的PostgreSQL版本,没有预先安装过程语言plpgsql,这可能是个问题)、表的表定义filedata
(我在回答中提到的数据类型不匹配可能是一个问题)。
@Override
public List<ViewFormulario> listarFormulario(Long idUsuario) {
List<ViewFormulario> list =null;
try {
Query q = em.createNativeQuery("SELECT * FROM myschema.mymethodThatReturnASelect(?);");
q.setParameter(1, idUsuario);
List<Object[]> listObject = (List<Object[]>) q.getResultList();
if (listObject != null && !listObject.isEmpty()) {
list = new ArrayList<>();
for (Object o[] : listObject) {
ViewFormulario c = new ViewFormulario();
c.setIdProyecto(o[0] != null ? Long.valueOf(o[0].toString()) : -1L);