返回首页

gbase数据、南大通用产品文档:GBase8agbase_stmt_fetch_column

更新日期:2024年09月11日

 摘要:
获取结果集当前行中某列的数据。
 语法:
int gbase_stmt_fetch_column(GBASE_STMT *stmt,
GBASE_BIND *bind_arg,,
unsigned int column,
unsigned long offset);
 参数:
 返回值:
如果成功获取了值,返回0。如果出现错误,返回非0 值。
 错误
CR_INVALID_PARAMETER_NO

无效的列号。
CR_NO_DATA




已抵达结果集的末尾。

GBase 8a 程序员手册C API 篇


- 60 -

南大通用数据技术股份有限公司

参数说明:为没有用ALTER TABLE SET STATISTICS 设置字段目标的表设置缺省统计
目标。此参数设置为正数时,代表统计信息的样本数量;设置为负数时,代表使用百分比的
形式设置统计目标,负数转换为对应的百分比,即-5 代表5%。
该参数属于USERSET 类型参数,请参考表15-1 中对应设置方法进行设置。
取值范围:整型,-100~10000。
须知:

比默认值大的正数数值增加了ANALYZE 所需的时间,但是可能会改善优化器的
估计质量。

调整此参数可能存在性能劣化的风险,如果某个查询劣化,可以考虑:
1.
恢复默认的统计信息。
2.
使用plan hint 来调整到之前的查询计划。
(详细参见使用Plan Hint 进行调优)

当此guc 参数设置为负数时,如果计算的采样样本数大于等于总数据量的2%,且
用户表的数据量小于1600000 时,
ANALYZE 所需时间相比guc 参数为默认值的时
间会有所增加。

当此guc 参数设置为负数时,则autoanalyze 不生效。
默认值:100

java 虚拟机自动完整驱动注册。

PreparedStatement
在GBase
8a
server 中不支持预处理功能,PreparedStatement 是由驱动来
实现的。因此,驱动程序不支持getParameterMetaData()或getMetaData()等,
因为其需要客户端上具有完整的SQL 语法分析程序。
当服务器支持时,会使用服务端预处理语句和二进制编码的结果集。
当使用一个带有large 参数的服务器端预处理命令时要小心,这些参数是
通过setBinaryStream()、
setAsciiStream()、
setUnicodeStream()、
setBlob()
或setClob()设置的。
如果用户将large 参数修改为不带large 的参数后重新执
行语句,
那么此用户必需先调用clearParameters()并重置所有的参数。
原因如
下:

当设置参数时(在执行预处理语句前)
,驱动程序会将large 数据
out-of-band 发送到服务器端预处理语句;

一旦完成了这些,这个在客户端用于读取数据的流就会被关闭(按照
JDBC 规范)
,并且不能再次读取流;

如果一个参数从large 变为非large,
那么驱动必须重置服务器端的预
处理语句状态,这样就可以允许被改变成的参数替代先前的large 值
了。这会删除掉所有已经发送给服务器的large 数据,因此要求通过

GBase 8a 程序员手册JDBC 篇
南大通用数据技术股份有限公司

- 27 -
setBinaryStream()、 setAsciiStream()、setUnicodeStream()、
setBlob()或setClob()方法重发数据。
因此,如果用户想把一个参数的large 类型改成一个非large 的类型,那
么用户必须调用clearParameters()并在重新执行前再次设置准备好语句的所
有参数。

ResultSet
缺省情况下,
ResultSets 被完整地取回并存储在内存中。
在大多数情况下,
这是操作起来最有效的方式,
而且由于GBase 网络协议的设计这也更容易实现。
如果用户使用着拥有大量行或大数据的ResultSets,而且无法在JVM 内为所需
内存分配大量空间,可以通知驱动以“流”方式返回结果,一次一行。为了使
这个功能可用,用户需要按如下方式创建一个语句实例:
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
这是个向前只读结果集,
它读取得容量以整数为单位。
MIN_VALUE 指示驱动
程序以逐行操作的方式形成“流”结果输出。
此后,任何用这个语句创建的结果集都按行检索。
使用这种方法有些要注意的地方,用户必须在当前连接上使用任何查询之
前,读出结果集中所有的行(或者关闭它)
,否则就是会抛出异常。
这些语句持有的锁(在GsDB 存储引擎中,无论它们是GsSYS 表级锁还是行
级锁)
,最早可以在语句完成的时候释放。
如果这个语句在一个事务的范围内,那么这些锁在事务结束时(这意味着
那条语句需要先完成)释放。和大多数其它数据库一样,语句不会完成直到所
有依赖于该语句的结果被读取或对于这个语句活跃的结果被关闭。
因此,当使用“流”结果时,如果用户想对那些被这个语句引用并产生结
果集的表保持并发访问,应当尽快地处理它们。

GBase 8a 程序员手册JDBC 篇


- 28 -

南大通用数据技术股份有限公司

ResultSetMetaData
可用于获取关于 ResultSet 对象中列的类型和属性信息的对象。

Statement
Statements 允许用户执行基本的SQL 查询并且通过后面将介绍的类
ResultSet 获得结果。
调用在对象Connection 上的createStatement()方法,可以创建一个
Statement 实例,而这个Connection 对象可以通过在前面介绍过的
DriverManager.getConnection()或DataSource.getConnection()方法获得。
一旦拥有了一个Statement 实例,就能调用executeQuery(String)方法执
行一个SELECT 查询。
更新数据库中的数据可以使用executeUpdate(String
SQL)方法,
该方法返
回由更新语句影响到的行数。
如果事先不知道SQL 语句将执行一个SELECT 操作还是一个UPDATE/INSERT
操作,
那么就可以使用execute(String
SQL)方法。
如果SQL 查询是一个SELECT,
该方法返回true,
如果是一个UPDATE/INSERT/DELETE 查询时返回false。
并且,
如果是一个SELECT 查询,
可以调用getResultSet()方法获得结果,
如果是一个
UPDATE/INSERT/DELETE 查询,
可以调用Statement 实例上的getUpdateCount()
方法获得被影响到的行数。