PostgreSQL 9.2、jdbc4、および DBMS は PgAdmin3 経由です。
ストアド関数を持つ呼び出し可能なオブジェクトであるステートメントオブジェクトを使用して結果セットを取得し、それらの結果セットの型を比較して型を処理する必要があります。それらを処理した後、それらのいくつかを別のステートメントのフォーマット文字列引数として設定したいと考えています。
これは、私が達成したいことの一種の疑似コードです。基本的に、バッチに繰り返し追加してから、セーブポイントまたはロールバックを使用してバッチ更新を行い、そのバッチを実行した後にそれらの変更をコミットしたいと考えています。
さらに、ストアド プロシージャには、jdbc 関連の構文の文字列としていくつかの postgres があります。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);
}
この場合、準備されたステートメント、呼び出し可能なステートメント、またはステートメントを組み合わせて一致させることは可能ですか?
そのステートメントを実行するまでは、ステートメントごとに 1 つの結果セットしか開くことができないことはわかっていますが、結果セットの型オブジェクト (つまり、getXXX を何らかのデータ型として保存) を保持して、別のステートメントを閉じた場合に使用するにはどうすればよいでしょうか?
これは、最初に select を使用してデータを取得し、次に 3 回更新するアプリケーション用です。3つすべてが、データベースの行を反復処理するさまざまなパラメーターを使用したバッチ更新であり、すべての更新後にコミットを伴う個別のトランザクションで行われます。各更新は個別の機能になります。
私はもともと、1 つのステートメントの結果セットを使用してから、updateXXX と updateRow を使用することを考えていましたが、効率については完全にはわかりません。