PostgreSQL & JDBC“查询返回了多个结果集”

Posted

技术标签:

【中文标题】PostgreSQL & JDBC“查询返回了多个结果集”【英文标题】:PostgreSQL & JDBC "Multiple ResultSets were returned by the query" 【发布时间】:2020-09-23 06:37:37 【问题描述】:

我目前正在做一个学习 PostgreSQL 的练习项目。我想使用以下方法来获取客户编号分配。在客户表中添加新客户时,应连续分配客户编号(1、2、3、4、......)。变量“anz”包含表中的客户数量。

如果一个客户被删除,他的客户号再次空闲,可以再次分配。例如,客户号 3 再次空闲,getIndex() 中的 FOR- 循环只运行到 3。然后分配这个号码.如果所有号码都被占用,则分配下一个更高的号码。因此,如果分配了 1、2、3,则选择 4。 函数 checkEx() 检查每个数字 (1,2,3,4,...) 是否已经存在于表中。

我知道我可以使用 Java 实现这一点,但我想对其进行编程以便在数据库中进行练习。 不幸的是,我总是收到错误“查询返回了多个结果集”。这些函数包含几个 Select 查询,我将其替换为 PERFORM,但没有成功。

对不起,如果这听起来有点复杂,我希望它是可以理解的。 谁能帮帮我?

public static int getKdNr() throws SQLException 
    

            String sql =
            "SELECT * FROM getIndex(); " +
        
            // getIndex()
            "CREATE OR REPLACE FUNCTION getIndex() RETURNS integer AS $BODY$ " +
                                    
                "DECLARE " +
    
                   "inx integer := 0; "                          +
                   "check integer := 0; " +
                   "anz integer := 0; " + 
                                         
                "BEGIN " + 
                
                "PERFORM 'SELECT COUNT(1) FROM customer INTO anz'; " +
                
                            "FOR  i IN 1..anz LOOP "              +
                            //"check := checkVorh(i); "          + 

                              "PERFORM 'SELECT checkEx(i) INTO check'; " + 

                               "IF      check=1 THEN inx := i; "          +
                               "ELSE                 inx := anz+1; "            +
                               "END IF; "                         +          
                            "END LOOP; "                          +
        
                        "RETURN inx; "                            +
                "END; "                                           +
                    
            "$BODY$ LANGUAGE plpgsql; " +
            
            // checkEx(integer)
            "CREATE OR REPLACE FUNCTION checkEx(integer) RETURNS integer AS $BODY$ " +
        
                "DECLARE " +
                
                    "ct integer; " +
                
                "BEGIN " +
                       
                    "PERFORM COUNT(1) INTO ct "      + 
                    "FROM customer "                            +                 
                    "WHERE unique_key = $1; "            +
                   
                    "RETURN ct; "             + 
                   
                "END; " +
            
            "$BODY$ LANGUAGE plpgsql; " ; 

        
    ResultSet rs = stmt.executeQuery(sql);

    return rs.getInt(1);

编辑:

我现在更改了我的程序,但 if 语句不能正常工作。 但我不明白为什么。

public static int getKdNr() throws SQLException 
    
String sql = "SELECT * FROM getIndex(); ";
                
ResultSet rs = stmt.executeQuery(sql);
rs.next();
return rs.getInt(1);



public static void createFunctions() throws SQLException 

stmt = conn.createStatement();

// checkEx(INTEGER)
    String sqlCheckEx = "CREATE OR REPLACE FUNCTION checkEx(INTEGER) RETURNS INTEGER AS $BODY$ " +

        "DECLARE " +
        
            "ct INTEGER; " +
        
        "BEGIN " +
               
            "PERFORM COUNT(1) INTO ct "      + 
            "FROM customer "                            +                 
            "WHERE unique_key = $1; "            +
           
            "RETURN ct; "             + 
           
        "END; " +
    
    "$BODY$ LANGUAGE plpgsql; " ; 
    
    stmt.executeUpdate(sqlCheckEx);
    

    


// getIndex()
String sqlIndex = "CREATE OR REPLACE FUNCTION getIndex() RETURNS INTEGER AS $BODY$ " +
    
                        
    "DECLARE " +

       "inx INTEGER   := 1; "                          +
       "check INTEGER := 0; " +
    
                     
    "BEGIN " + 
            
                "FOR  i IN 1.." + getAnzKd() + " LOOP "              +
                   "check := checkEx(i); "                           + 


                               "IF     check>0 THEN     inx := i; "                         +
                               "ELSE                  inx := " + (getAnzKd() +1) + "; "   +
                               "END IF; "                                               +     
                                       
                 "END LOOP; "                                              +
                        
            "RETURN inx; "                            +
            
    "END; " +
                                      
        
    
"$BODY$ LANGUAGE plpgsql; ";

stmt.executeUpdate(sqlIndex);

IO.println("\n\n--> Funktionen erstellt");

【问题讨论】:

这里有几处非常错误。首先,每次调用该方法时,都会在数据库中重新创建两个函数。 @Kayaman 当然,这是真的。谢谢 不幸的是我仍然有这个问题。如果有人能给我提示,我将不胜感激。 【参考方案1】:

您应该将您的 SQL 拆分为 3 个单独的查询,并为每个查询调用 executeQuery

【讨论】:

以上是关于PostgreSQL & JDBC“查询返回了多个结果集”的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Postgresql 将 JDBC 连接到 sonarqube

Android上的Postgresql JDBC连接错误

Jdbc Postgresql 没有执行查询

使用 JDBC 连接到 PostgreSql 的本地实例

如何解决“方法 org.postgresql.jdbc.PgConnection.createBlob() 尚未实现”

如何使用 JDBC 调用 PostgreSQL 存储过程