Skip to content

适用虚谷数据库版本

v12.9



适用虚谷数据库版本

v12.9


处理执行结果

📄字数 2.4K
👁️阅读量 加载中...

更新ResultSet结果集

创建Statement对象时,设置Statement属性ResultSetConcurrency为ResultSet.CONCUR_UPDATABLE,并且数据库URL连接串属性return_rowid设置为TRUE时,Statement对象执行SQL语句返回的ResultSet结果集才能被更新。当ResultSet对象为可更新结果集时,将光标移至插入位置,可调用ResultSet类对应的update方法修改结果集中行数据,并通过updateRow方法将更改数据更新到数据库中。

示例: 通过修改结果集中数据值更改数据库中对应记录

java
//创建Statement对象并设置结果集属性为可更新
Statement stm = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
//执行SQL语句
ResultSet rs = stm.executeQuery(sql);
//结果集遍历
while(rs.next())
{
  //更新结果集中指定列数据
    rs.updateLong(1, 5);
  //更新结果集中指定列数据
    rs.updateFloat(3, 12.3f);
  //结果集变更回写入数据库
    rs.updateRow();
}

通过调用ResultSet类的next()、previous()、absolute(int)方法移动光标位置,将光标位置移动到指定数据行,通过ResultSet类对应的get方法获取行数据。

说明

如使用结果集更新数据库数据,需在建立数据库连接时,设置连接属性return_rowid为TRUE,且在生成执行SQL语句对象时,并发属性指定为ResultSet.CONCUR_UPDATABLE。

通过移动光标获取结果集条数

示例: 统计结果集总条数

java
//创建Statement对象
Statement stm= conn.createStatement();
stm.execute("create table test(id int identity(1,1));insert into test values(default)");
//执行结果集查询
ResultSet rs = stm.executeQuery("select * from test");
//移动光标至结果集末尾
rs.last();
//获取结果集行数
int rsCounts = rs.getRow();

多结果集处理

XuguDB-JDBC支持多结果集处理,允许Statement接口支持多重打开的ResultSet对象。执行语句可以是多条SQL语句的集合,即一次性向虚谷服务器发送多条SQL语句,虚谷服务器执行完SQL语句后返回多个执行结果;亦或存储过程定义有多个返回结果集。XuguDB-JDBC的Statement重载了Statement接口中的getMoreResults()方法。

示例: 多结果集处理

java
//SQL语句包含多条查询命令
String sql=" SELECT * FROM A1 WHERE D2=(SELECT AVG(D2) FROM A1 GROUP BY D1);SELECT * FROM A1 WHERE D2>(SELECT MIN(D2) FROM A1 GROUP BY D1)";
//创建Statement对象
Statement stm = conn.createStatement();
//执行SQL语句
boolean f = stm.execute(sql);
//判断是否有ResultSet对象产生
if(f == true){
  //获取结果集对象
  ResultSet rs1 = stm.getResultSet();
  ... ... ... ...
}
while(true)
{
  //判断Statement是否返回了多个ResultSet对象
  if(!stm.getMoreResults(Statement.CLOSE_CURRENT_RESULT)){
    break;
  } else  if((rs2 = cstm.getResultSet())!=null) {
   ... ... ... ...//数据处理部分省略
  }
}

服务端游标使用

XuguDB-JDBC中服务端游标结果集生成需满足两个条件:URL连接串属性recv_mode值为2,Statement对象执行SQL语句为单条SELECT语句。

应用程序端通过Statement类的setFetchSize(int)方法或ResultSet类的setFetchSize(int)方法设置每次从服务端获取多少条数据。

说明

使用服务端游标的ResultSet对象,光标只能单向向前正向移动,不能向后移动或来回滚动。

示例: 虚谷数据库服务端游标使用

java
//创建JDBC特有Statement对象
Statement stm = (com.xugu.cloudjdbc.Statement)conn.createStatement();
//开启服务端游标
stm.setServerCursor(true);
//设置服务端游标单次返回数据条数
stm.setFetchSize(1000);
//执行SQL语句
ResultSet rs = stm.executeQuery("select * from t1");
//遍历数据
while(rs.next())
{
... ... ... ...
}
//关闭服务端游标
stm.setServerCursor(false);

检索自动产生的关键字GeneratedKeys

JDBC 3.0规范中对于自动产生的关键字数值,定义了接口规范,即:getGeneratedKeys()方法。

为了解决对获取自动产生的或自动增加的关键字的值的需求,XuguDB-JDBC根据JDBC3.0规范提供了获得关键字值的方法。获取关键字的值,需要在执行方法中指定自增关键字标记。SQL语句执行完后,调用Statement对象的getGeneratedKeys()方法,获得包含自增长值的ResultSet对象。

示例: 获取数据库自增长关键字的值

java
//创建Statement对象
Statement stmt = conn.createStatement();  
//指定自增长关键字的标识
String[] colN = {"id"};
//在执行方法中引入自增长关键字标识
stmt.executeUpdate("INSERT INTO authors(first_name, last_name) VALUES (‘Ghq’, ‘Wxl’)",colN);
//获取结果集
ResultSet rs = stmt.getGeneratedKeys(); 
if ( rs.next() ) {  
	//获取结果集中的自增长值
   int key = rs.getInt(); 
}