PostgreSQL 9.2、jdbc4 和 DBMS 通过 PgAdmin3。
我需要使用语句对象检索一些结果集,该语句对象是具有存储函数的可调用对象,然后通过比较这些结果集类型来处理类型。在我处理它们之后,我希望将它们中的一些设置为另一个语句的格式字符串参数。
这是我想要完成的一些伪代码。本质上,我想迭代地添加到批处理,然后使用保存点或回滚进行批处理更新,并在执行该批处理后提交这些更改。
此外,存储过程中有一些 postgres 作为 jdbc 相关语法的字符串,我不确定是否使用 IS NULL、转义引号、需要分号等。
String SQL = "UPDATE AdminBoundaries SET \"WIKI_URL\" = ?";
Statement stmt = conn.createStatement();
stmt.execute("CREATE OR REPLACE FUNCTION refcursorfunc() RETURNS refcursor AS '"
+ " DECLARE "
+ " mycurs refcursor; "
+ " BEGIN "
+ " OPEN mycurs FOR SELECT \"NAME_5\", \"NAME_4\", \"NAME_3\", \"NAME_2\", \"NAME_1\", \"NAME_0\", \"WIKI_URL\", \"LEVEL_DEPT\" FROM"
+ " AdminBoundaries WHERE \"WIKI_URL\" IN(SELECT \"WIKI_URL\" FROM AdminBoundaries"
+ " GROUP By \"WIKI_URL\" HAVING (count (\"WIKI_URL\") > 1)) ORDER BY \"WIKI_URL\";; "
+ " RETURN mycurs; "
+ " END;' language plpgsql");
conn.setAutoCommit(false);
CallableStatement funct = conn.prepareCall("{ ?, ?, ?, ?, ?, ?, ?,? = call refcursorfunc()}");
funct.registerOutParameter(1, java.sql.Types.VARCHAR);
funct.registerOutParameter(2, java.sql.Types.VARCHAR);
funct.registerOutParameter(3, java.sql.Types.VARCHAR);
funct.registerOutParameter(4, java.sql.Types.VARCHAR);
funct.registerOutParameter(5, java.sql.Types.VARCHAR);
funct.registerOutParameter(6, java.sql.Types.VARCHAR);
funct.registerOutParameter(7, java.sql.Types.VARCHAR);
funct.registerOutParameter(8, java.sql.Types.INTEGER);
funct.execute();
ResultSet results (ResultSet) funct.getObject(1);
while(results.next()){
String base_url = "http://127.0.0.1/mediawiki/index.php/";
String name0 = rs.getString("NAME_0");
String name1 = rs.getString("NAME_1");
String name2 = rs.getString("NAME_2");
String name3 = rs.getString("NAME_3");
String name4 = rs.getString("NAME_4");
String name5 = rs.getString("NAME_5");
String wiki_url = rs.getString("WIKI_URL");
int level = rs.getInt("LEVEL_DEPT");
}
PreparedStatement pstmt = null;
pstmt = conn.prepare(SQL, ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.HOLD_CURSORS_OVER_COMMIT, ResultSet.CONCUR_UPDATABLE);
if(wiki_url.equals(somestring)){
if(name1 == null){
if(level != 0){
pstmt.setString(1, somestring + name1);
pstmt.addBatch();
if(name2 == null ){
...etc.
}
}
//either executeUpdate or executeBatch
conn.commit()
pstmt.clearBatch()
conn.setAutoCommit(true);
}
在这种情况下是否可以混合和匹配准备好的语句、可调用的语句或语句?
我知道在执行该语句之前,每个语句只能打开一个结果集,但是如果它关闭,我如何保留结果集的类型对象(即 getXXX 并将其存储为某种数据类型)以在另一个语句上使用?
这适用于首先使用 select 检索数据,然后是三个更新的应用程序。所有这三个都将是具有不同参数的批量更新,这些参数将遍历数据库的行,所有这些都在每次更新后提交的单独事务上进行。每次更新都将是一个单独的函数。
我本来是想用一个语句的结果集,然后用updateXXX和updateRow,但我对效率并不完全确定。