0

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,但我对效率并不完全确定。

4

0 回答 0