繁体   English   中英

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

[英]PostgreSQL & JDBC "Multiple ResultSets were returned by the query"

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

如果一个客户被删除,他的客户号码将再次空闲并可以再次分配。例如,客户号码 3 再次空闲并且 getIndex() 中的 FOR 循环仅运行到 3。然后分配此号码。 如果所有号码都被占用,则分配下一个更高的号码。 因此,如果分配了 1、2、3,则选择 4。 function 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");}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM