返回首页

gbase数据、南大通用产品文档:GBase8sSET AUTOFREE 语句

更新日期:2024年09月11日

使用 SET AUTOFREE 语句来指示数据库服务器启用或禁用内存管理特性,一旦
游标关闭,该特性可自动地释放为该游标分配的内存。
语法

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 958

元素
描述
限制
语法
cursor_id
Autofree 要为其
重设的游标的名

必须已在程序中声明了 标识符
cursor_id_var 持有 cursor_id
的值的主变量
必须存储在程序中已声
明了的 cursor_id
必须符合名称
的特定语言的
规则。
用法
此语句是对 SQL 的 ANSI/ISO 标准的扩展。您仅可随同 GBase 8s ESQL/C 使用
此语句。
当为游标启用 Autofree 特性且该游标随后关闭时,您不需要显式地使用 FREE
语句来释放数据库服务器为该游标分配的内存。如果您发出 SET AUTOFREE 但
未指定选项,则缺省为 ENABLED。
启用 Autofree 特性的 SET AUTOFREE 语句必须出现在打开游标的 OPEN 语句
之前。SET AUTOFREE 语句不影响分配给已经打开的游标的内存。在启用游标的
Autofree 之后,您不可第二次打开那个游标。
以 SET AUTOFREE 全局地影响游标
如果您未包括 FOR cursor_id 或 FOR cursor_id_var 子句,则 SET AUTOFREE
的范围是该程序中所有后续声明的游标(或更准确地说,在不带有 FOR 子句的
后续的 SET AUTOFREE 语句之前声明的所有游标全局地重置 Autofree 特
性)。此示例为程序中所有后续的游标启用 Autofree 特性:
EXEC SQL set autofree;
下一示例为所有后续的游标禁用 Autofree 特性:
EXEC SQL set autofree disabled;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 959
使用 FOR 子句来指定特定的游标
如果您指定 FOR cursor _id 或 FOR cursor_id_var,则 SET AUTOFREE 仅影响
您在 FOR 关键字之后指定的游标。
此选项允许您覆盖对所有游标的全局的设置。例如,如果您在程序中为所有游标
发出 SET AUTOFREE ENABLED 语句,则可发出后续的 SET AUTOFREE
DISABLED FOR 语句来为特定的游标禁用 Autofree 特性。
在下列示例中,第一个语句为所有游标启用 Autofree 特性,而第二个语句为名
为 x1 的游标禁用 Autofree 特性:
EXEC SQL set autofree enabled;
EXEC SQL set autofree disabled for x1;
在此,必须已声明了但尚未打开 x1 游标。
关联的和拆离的语句
当自动地释放游标时,也释放它的关联的准备好的语句(或关联的语句)。
在 Autofree 特性的上下文中,术语关联的语句有特殊的含意。如果游标是您以准
备好了的语句声明的第一个游标,或如果它是您在该语句拆离之后以该语句声明
的第一个游标,则以准备好了的语句关联该游标。
在 Autofree 特性的上下文中,术语拆离的语句有特殊的含意。如果您不以准备好
了的语句声明游标,或如果释放了以其关联语句的游标,则拆离该准备好了的语
句。
如果对游标启用 Autofree 特性,该有表有相关联的准备好了的语句,且那个游
标关闭,则数据库服务器释放分配给该准备好了的语句的内存以及分配给该游标
的内存。假设您为下列游标启用 Autofree 特性:
/*Cursor associated with a prepared statement */
EXEC SQL prepare sel_stmt 'select * from customer';
EXEC SQL declare sel_curs2 cursor for sel_stmt;
当数据库服务器关闭 sel_curs2 游标时,它等同于自动地执行下列 FREE 语
句:
FREE sel_curs2;
FREE sel_stmt;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 960
由于自动地释放了 sel_stmt 语句的内存,因此您不可在其上声明新的游标,除非
您再次准备该语句。
隐式地关闭游标
启用了特性的游标存在潜在的问题。在不符合 ANSI 的数据库中,如果您不显式
地关闭游标然后再打开它,则隐式地关闭该游标。对游标的这种隐式的关闭触发
Autofree 特性。第二次打开该游标时,数据库服务器会生成错误消息(cursor
not found),因为该游标已被释放。

下列是一个样例数据库模式:
CREATE TABLE tab (a set(integer not null), b integer);
INSERT INTO tab VALUES ("set{1,2,3}", 10);
下列示例使用 java.sql.Array 对象访存数据:
PreparedStatement pstmt = conn.prepareStatement("select a from tab");
System.out.println("prepare ... ok");
ResultSet rs = pstmt.executeQuery();
System.out.println("executeQuery ... ok");

rs.next();
java.sql.Array array = rs.getArray(1);
System.out.println("getArray() ... ok");
pstmt.close();

/*
* The user can now materialize the data into either
* an array or else a ResultSet. If the collection elements
* are primitives then the array should be an array of primitives,
* not Objects. Mapping data can be provided at this point.
*/

Object obj = array.getArray((long) 1, 2);

int [] intArray = (int []) obj; // cast it to an array of ints
int i;
for (i=0; i < intArray.length; i++)
{
System.out.println("integer element = " + intArray[i]);
}
pstmt.close();
java.sql.Array array = rs.getArray(1) 语句实例化 java.sql.Array 对象。在此点不转换数据。

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 123
-
Object obj = array.getArray((long)1, 2) 语句将数据转换为整数的数组(int 类型,不
是 Integer 对象)

由于未以索引和计数值调用getArray() 方法,
因此,
仅返回数据的子集。

自动装载JDBC 驱动
本示例实现了使用gbase-connector-java 的JDBC4.0 新特性自动装载驱动
功能。本样例需要gbase-connector-java8.3.81.51 及以上版本,和jre1.6 及
以上版本。
示例如下:
package com.gbase.jdbc.simple;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class AutomaticLoadingOfJavaSqlDriver {

public static void main(String[] args) {
AutomaticLoadingOfJavaSqlDriver
automaticLoadingOfJavaSqlDriver = new
AutomaticLoadingOfJavaSqlDriver();

GBase 8a 程序员手册JDBC 篇


- 112 -

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

automaticLoadingOfJavaSqlDriver.userDriverManagerGetConn
ection();
}
/**
* 使用自动装载驱动DriverManager 获取连接.
*/
public void userDriverManagerGetConnection() {
Connection conn = null;
try {
conn =
DriverManager.getConnection("jdbc:gbase://192.168.111.915:5258/test?
user=sysdba&password=");

System.out.println("AutomaticLoadingOfJavaSqlDriver
ok");
} catch (SQLException ex) {
// 处理错误
System.out.println("SQLException: " +
ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " +
ex.getErrorCode());
} finally {
try {
conn.close();
} catch (NullPointerException e) {
} catch (Exception e) {
conn = null;
}
}
}
}

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

- 113 -