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