Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中调用PostgreSQL过程?_Java_Postgresql - Fatal编程技术网

如何在Java中调用PostgreSQL过程?

如何在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

如何在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 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);