返回首页

gbase数据、南大通用产品文档:GBase8s准备备份数据

更新日期:2024年09月11日

备份存储空间和逻辑日志之前,必须先准备系统并复制关键管理文件。
要准备备份数据:
1.
配置 ON-Bar 和存储管理器。
2.
确保您有足够的逻辑日志空间。
ON-Bar 在备份开始时检查可用的逻辑日志空间。如果日志几乎填满,ON-Bar 在试图
备份存储空间之前将备份并释放这些日志。如果日志包含充足的空间,ON-Bar 将备
份存储空间接着备份逻辑日志。
3.
验证您是否有足够的临时磁盘空间。
数据库服务器使用临时磁盘空间来存储备份期间被覆盖以及内存中发生查询处理而溢
出的之前数据映像。验证 DBSPACETEMP 环境变量和 DBSPACETEMP 配置参数指
定的数据库空间是否具有满足您需要的足够空间。如果指定的数据库空间中空间不
足,备份将失败,并且将使用根数据库空间,或者在填满根数据库空间之后,备份将
失败。
4.
将管理文件备份到不同的位置。
5.
运行 oncheck -cD 命令以验证所有数据库服务器数据是否一致。
不需要在每个 0 级备份之前都检查一致性。在下次验证数据库的一致性之前,请勿
放弃已知为一致的备份。

要备份的管理文件
ON-Bar 备份不会替换重要配置文件的正常操作系统备份。必须手动备份关键管理文件。

GBase 8s 备份与恢复指南
南大通用数据技术股份有限公司 - 37 -

重要: 请制作关键管理文件的当前版本的备份副本,以在紧急情况下使用。如果需要更换磁
盘或者如果恢复到第二个计算机系统(导入的恢复),那么必须恢复这些文件。
备份以下管理文件:

紧急引导文件

onconfig 文件

sm_versions 文件

sqlhosts 文件 (UNIX™)

存储管理器配置和数据文件

存储在磁盘上的 Blob 空间中的简单大对象数据

存储在磁盘或光盘的 Blob 空间中的简单大对象的数据

存储于外部的数据(例如:由 DataBlade® 维护的外部表)
提示: 尽管 ON-Bar 包含 onconfig 和 sqlhosts 及其备份的文件,但较好的做法是将
onconfig 和 sqlhosts 文件包含在您的系统归档中。通过将关键文件同时包含在 GBase 8s
和系统归档中,您在需要时可以有更多选择。
尽管 ON-Bar 不备份以下项,但 ON-Bar 将在恢复期间自动重新创建这些项。您不需要为
这些文件创建备份副本:

已分配给数据库服务器但还未分配给表空间范围的数据库空间页面

镜像块,如果相应的主要块是可以访问的

临时数据库空间
ON-Bar 不备份或恢复临时数据库空间中的数据。一旦恢复,数据库服务器重新创
建空的临时数据库空间。
当您执行文件的 0 级、1 级或 2 级备份时,还将备份多个关键文件。bar_act.log 包含有
关备份了哪些关键文件的信息。例如:
Begin backup of critical file '/opt/gbasedbt-11.70.fc3/etc/ixbar.0'.
Completed backup of critical file '/opt/gbasedbt-11.70.fc2/etc/ixbar.0'

Begin backup of critical file '/opt/gbasedbt-11.70.fc3/etc/oncfg_work_loc.0'.
Completed backup of critical file '/opt/gbasedbt-11.70.fc3/etc/oncfg_aork_loc.0'

Begin backup of critical file '/opt/gbasedbt-11.70.fc3/etc/hygia_work.wh'.
Completed backup of critical file '/opt/gbasedbt-11.70.fc2/etc/hygia_work.wh'

集合子查询使用户能够从子查询表达式构造集合表达式。集合子查询在紧邻子查询之前使
用 MULTISET 关键字以将返回的值转换为 MULTISET 集合。但是,当在子查询表达式
之前使用 MULTISET 关键字时,数据库服务器不会更改基础表的各行而只会修改这些行
的副本。例如,如果将集合子查询传递至修改集合的用户定义的例程,那么会修改集合的
副本而不会修改基础表。
集合子查询是可采用下列任何形式的表达式:

MULTISET(SELECT expression1, expression2... FROM tab_name...)

MULTISET(SELECT ITEM expression FROM tab_name...)

在集合子查询中省略 ITEM 关键字
如果在集合子查询表达式中省略 ITEM 关键字,
那么集合子查询就是其元素类型始终为未
命名的 ROW 类型的 MULTISET。未命名 ROW 类型的字段与在子查询的 Projection 子
句中指定的表达式的数据类型相匹配。
假设您创建了包含类型为 MULTISET 的列的以下表:
CREATE TABLE tab2
(
id_num INT,
ms_col MULTISET(ROW(a INT) NOT NULL)
);
下列查询显示如何在 WHERE 子句中使用集合子查询来将子查询返回的 INT 值的行转换
为类型为 MULTISET 的集合。在此示例中,数据库服务器在tab2 的 ms_col 列等于集合子
查询表达式的结果时返回行。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 143 -

图: 查询
SELECT id_num FROM tab2
WHERE ms_col = (MULTISET(SELECT int_col FROM tab1));
该查询在集合子查询中省略了 ITEM 关键字,因此子查询返回的 INT 值类型为
MULTISET(ROW(a INT) NOT NULL)(它与 tab2 的 ms_col 列的数据类型相匹配)。

在集合子查询中指定 ITEM 关键字
当子查询的投影列表包含单个表达式时, 可以用 ITEM 关键字作为子查询的投影列表的
开始以指定 MULTISET 的元素类型与子查询结果的数据类型相匹配。换言之,当包括
ITEM 关键字时,数据库服务器不在投影列表两端放置行包装器。例如:如果子查询(紧
跟在 MULTISET 关键字之后)
返回 INT 值,
集合子查询具有类型 MULTISET
(INT NOT
NULL)。
假设您创建接受类型为 MULTISET(INT NOT NULL)的参数的函数 int_func()。下列查询
显示将具有 INT 值的行转换为 MULTISET 并将集合子查询用作函数 int_func() 中的参数
的集合子查询。
图: 查询
EXECUTE FUNCTION int_func(MULTISET(SELECT ITEM int_col
FROM tab1
WHERE int_col BETWEEN 1 AND 10));
该查询在子查询中包括 ITEM 关键字,因此将查询返回的 int_col 值转换为类型为
MULTISET(INT NOT NULL)的集合。没有 ITEM 关键字,集合子查询将返回类型为
MULTISET(ROW(a INT) NOT NULL)的集合。

FROM 子句的集合子查询
集合子查询在 SELECT 的 FROM 子句中有效,
外部查询可使用子查询返回的值作为数据
源。
集合子查询这一节中的查询示例通过使用 TABLE 关键字后面
(括号内)
跟 MULTISET 关
键字然后跟子查询来指定集合子查询。该语法是对 SQL 语言的 ANSI/ISO 标准的 GBase
8s 扩展。
在(且仅在)SELECT 语句的 FROM 子句中,可以通过指定子查询、省略 TABLE 和
MULTISET 关键字和嵌套的括号来代替 SQL 的 ANSI/ISO 标准的语法,
以指定集合子查
询。
下列查询使用 GBase 8s 扩展语法连接外部查询的 FROM 子句中的两个集合子查询:
图: 查询

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 144 -

SELECT * FROM TABLE(MULTISET(SELECT SUM(C1) FROM T1 GROUP BY C1)),
TABLE(MULTISET(SELECT SUM(C1) FROM T2 GROUP BY C2));
通过使用符合 ANSI/ISO 的语法来连接外部查询的 FROM 子句中的两个派生表,下列查
询在逻辑上等价于上述返回相同结果的查询:
图: 查询
SELECT * FROM (SELECT SUM(C1) FROM T1 GROUP BY C1),
(SELECT SUM(C1) FROM T2 GROUP BY C2);
该查询优于 TABLE(MULTISET(SELECT ...)) GBase 8s 扩展版本之处在于,任何支持
FROM 子句中符合 ANSI/ISO 语法的数据库服务器也可以执行该查询。
有关集合子查询的
语法和限制的更多信息,请参阅《GBase 8s SQL 指南:语法》。

可以使用 GBase 8s ESQL/C 主机变量以两种方式访问不透明数据类型的内部或二进
制格式:
使用 fixed binary 数据类型访问固定长度的不透明数据类型,您可以为其具有表示不
透明数据类型的 C 语言数据结构。

固定长度的不透明数据类型对其数据具有预定义的大小。该大小等于不透明数据类型
的内部数据结构的大小。

使用 var binary 数据类型访问不同长度的不透明数据类型或访问不具有 C 语言的数
据类型的固定长度不透明数据类型。


GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 268 -

不同长度数据类型保存的数据的大小可能因行到行或实例而而异。

fixed binary 和 var binary 数据类型都在它们的声明和不透明数据类型的内部结构
之间具有一对一的映射。
当应用程序传输 fixed binary 或 var binary 主机变量中的数据时,
数据库服务器调用以下不透明类型的支持函数:

接收支持函数描述如何将数据从 fixed binary 或 var binary 主机变量传输到不透明类
型列。

数据库服务器对诸如将不透明类型的内部格式发送到服务器的 INSERT 和 UPDATE
语句的操作调用接收函数。

发送支持函数描述如何将不透明类型列的不透明类型数据传输到 fixed binary 或 var
binary 主机变量。

数据库服务器对将不透明类型的内部格式发送到客户端应用程序的 SELECT 和
FETCH 语句调用发送支持函数。
访问固定长度不透明类型
fixed binary 数据类型允许您以它的内部格式访问固定长度的不透明数据类型。

请按照以下步骤,在数据库服务器和 GBase 8s ESQL/C 应用程序之间传输固定长度
不透明类型列的内部格式:
声明 fixed binary 主机变量。
在 SQL 语句中使用 fixed binary 主机变量在固定长度的不透明类型列的外部格式
上执行 select 、insert 、update 或 delete 操作。
声明固定二进制主机变量
使用 fixed binary 数据类型声明访问固定长度不透明数据类型的内部格式的主机变量。


要声明 fixed binary 主机变量,使用以下语法: GBase 8s 扩展fixed binary’opaque
type’structure name,variable name;

元素
意义
限制
SQL 语法
opaque
type
固定长度不透明数据类
型的名称,
其内部格式存储在
必须已经在数据库中定
GBase 8s
SQL 指南:
语法中

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 269 -

元素
意义
限制
SQL 语法
fixed binary 变量中
义。
的标识符段
structur
e name
代表不透明数据类型的
内部格式的 C 数据结构的名

必须在源文件包含的头
文件(.h)中定义。还必须符
合数据库服务器用于表示不
透明类型的内部格式的数据
结构。
名称必须符
合特定于变量名
的语言规则。
variable
name
声明为 fixed binary 变
量 ESQL/C 变量的名称

名称必须符
合特定于变量名
的语言规则。

重要: fixed binary 主机变量仅对固定长度不透明数据类型的列有效。如果不透明数
据类型是可变长度,请使用 var binary 主机变量。如果不知道固定长度不透明数据类型的
内部格式,仍必须使用 var binary 主机变量访问它。

要使用 fixed binary 主机变量,必须引用映射不透明数据类型的内部数据结构的 C
数据结构。指定此 C 数据结构作为 fixed binary 声明中相同的结构名。

建议您为定义固定长度的不透明数据类型的 C 数据结构创建 C 头文件
(.h 文件)

然后在每个 GBase 8s ESQL/C 源文件中包含此头文件,
来使用 fixed binary 主机变量访问
不透明数据类型。

例如,以下代码片段声明 circle 不透明数据类型的名为 my_circle 的 fixed binary
主机变量:
#include /* contains definition of circle_t */

EXEC SQL BEGIN DECLARE SECTION;
fixed binary 'circle' circle_t my_circle;
EXEC SQL END DECLARE SECTION;

在此示例中,circle.h 头文件包含 circle_t 结构(参见图 1)的声明,
它是 circle 不透明数据类型的内部数据结构。my_circle 主机变量的声明指
定不透明数据类型 circle 的名称和 circle_t 内部数据结构的名称。
不透明类型
当声明 fixed binary 主机变量时,必须指定不透明类型为引用字符串。

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 270 -


重要: 单引号(')和双引号(")都是有效的引号字符。但是,起始引号和结束引号
字符必须相匹配。

不透明类型名称是可选的;它的存在对声明具有以下影响:

当在 fixed binary 声明中省略不透明类型时,
数据库服务器尝试标识合适的支持函数,
以在它将主机变量发送到数据库服务器来存储不透明类型列时使用。
可以使用 fixed binary 主机变量保存多个不同的不透明类型的数据
(只要数据库服务
器能够找到合适的支持函数。)

当在 fixed binary 声明中指定不透明类型时,数据库服务器精确知道使用哪种函数读
取和写入不透明类型列。
使用不透明数据类型可以使数据转换更有效。但是,在这个情况中,fixed binary 主
机变量仅保存特定的不透明数据类型的数据。

可以在单个声明中声明多个 fixed binary 变量。但是,所有的变量必须具有相同的不
透明类型,如下所示:
#include ;

EXEC SQL BEGIN DECLARE SECTION;
fixed binary 'shape' shape_t square1, square2;
EXEC SQL END DECLARE SECTION;
固定二进制主机变量
GBase 8s ESQL/C 程序必须处理 fixed binary 主机变量的内部数据结构的所有操作,
它必须显式分配内存和指定字段值。

下图显示了如何使用 fixed binary 主机变量在 circle_tab 表(参见图 4)circle_col 的
列中插入和选择数据。

图 7. 使用固定的二进制主机变量访问 circle 不透明数据类型的内部结构

/* Include declaration for circle_t structure */

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 271 -

#include ;

EXEC SQL BEGIN DECLARE SECTION;
fixed binary 'circle' circle_t fbin_circle;
EXEC SQL END DECLARE SECTION;

/* Assign data to members of internal data structure */
fbin_circle.center.x = 1.00;
fbin_circle.center.y = 17.00;
fbin_circle.radius = 15.25;

/* Insert a new circle_tab row with a fixed binary host
* variable */
EXEC SQL insert into circle_tab values (:fbin_circle);

/* Select a circle_tab row from into a fixed binary
* host variable */
EXEC SQL select circle_col into :fbin_circle
from circle_tab
where radius(circle_col) = 15.25;
if ((fbin_circle.center.x == 1.00) &&
(fbin_circle.center.y == 17.00))
printf("coordinates = (%d, %d)\n",
fbin_circle.center.x, fbin_circle.center.y);
从固定二进制主机变量插入
要将 fixed binary 主机变量包含的数据插入到不透明类型列,图 1中的
代码片段执行以下步骤:
包含 circle 不透明数据类型的内部结构的定义。
circle_t 内部数据结构的定义(图 1显示)必须可用于您的 GBase 8s ESQL/C
程序。因此,代码段包含 circle.h 头文件,它包含 circle_t 结构的定义。

将 fixed binary 主机变量中的数据存储到内部数据结构 circle_t。
使用 fbin_circle 主机变量将 fixed binary 主变量的声明使用与 circle_t 内部数据
结构相关联。此代码片段将值分配给 circle_t 数据结构的每个成员。

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 272 -


将 fbin_circle 主机变量包含的数据插入到 circle_col 不透明类型列中。
当数据库服务器执行此 INSERT 语句时,它调用 circle 数据类型(circle_rcv)接收
支持函数,以便在 GBase 8s ESQL/C 客户端应用程序发送的数据的内部格式(circle_t)和
磁盘上的 circle 数据类型的内部格式。

使用 fixed binary 主机变量将空值插入到不透明类型列,将指示变量设置为 -1。以
下代码使用使用 fbin circle 主机变量将空值插入到 circle_col 列:
#include ;

EXEC SQL BEGIN DECLARE SECTION;
fixed binary 'circle' circle_t fbin_circle;
int circle_ind;
EXEC SQL END DECLARE SECTION;


circle_ind = -1;
EXEC SQL insert into circle_tab
values (:fbin_circle:circle_ind);
将数据选择到固定二进制主机变量
要将不透明类型列包含的数据选择到 fixed binary 主机变量,图 1中的
代码采用以下步骤:
将 circle_col 不透明列包含的数据选择到 fbin_circle 主机变量中。
当数据库服务器执行此 SELECT 语句时,它会调用 circle
(circle_snd)发送支持函数,以便来在从磁盘检索到的内部格式与
GBase 8s ESQL/C 应用程序使用的内部格式之间进行必要的翻译。此
SELECT 语句还使用名为 radius(参见图 2)的用户定义函数精确知
道不透明类型列的半径值。

从 fixed binary 主机变量访问 circle 数据。
SELECT 语句执行完成后,fbin_circle 主机变量包含 circle 数据类型内部格式的数
据。此代码段包含来自 circle_t 数据结构成员的 (x,y) 坐标值。

当将不透明类型列中的空值选择到 fixed binary 主机变量时,
GBase 8s ESQL/C 将任
何附加指示变量设置为 -1。

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 273 -

访问不固定长度的不透明类型
var binary 数据类型允许您访问以下之一的透明数据类型的内部格式:
固定长度不透明类型列,不需要访问内部格式的 C 结构
不固定长度不透明类型列

请按照以下步骤,在数据库服务和 GBase 8s ESQL/C 应用程序之间传输这些不透明
类型列的内部格式:
声明 var binary 主机变量
在 SQL 语句中使用 var binary 主机变量对不透明类型列的内部格式执行 select 、
insert 、update 或 delete 操作。
声明 var binary 主机变量
要声明 var binary 主机变量,请使用以下语法。 GBase 8s 扩展var binary’opaque
type’structure name,variable name;

元素
意义
限制
SQL 语法
opaqu
e type
不透明数据类型的名
称,其内部格式存储在
var binary 变量中
必须已经在数据库中
定义
GBase 8s SQL 指南:
语法中的标识符段
variab
le name
声明为 var binary
变量的 ESQL/C 变量名

名称必须符合特定于
变量名的语言规则

下图显示了三个 var binary 变量。图 8. var binary 主机变量示例

#include ;
#include ;

EXEC SQL BEGIN DECLARE SECTION;
var binary polygon1;
var binary 'shape' polygon2, a_circle;
var binary 'image' an_image;
EXEC SQL END DECLARE SECTION;

在 var binary 主机变量的声明中,不透明类型的名称必须是一个引用字符串。

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 274 -

重要: 单引号(')和双引号(")都是有效的引号字符。但是,起始引号和结束引号
字符必须相匹配。

不透明类型名称是可选的;它的存在对声明具有以下影响:
当在 var binary 声明中省略不透明类型时,当应用程序接收来自不透明列的内部数
据结构时,数据库服务器尝试标识合适的支持函数。
省略不透明类型的优势是您可以使用 var binary 主机变量保存从多个不同不透明类
型选择的数据(只要数据库服务器能找到合适的支持函数) 。

省略不透明类型的劣势是此方法声明的主机变量不能作为用户定义的例程(UDR)的
参数使用。

当在 var binary 声明中指定不透明类型时,数据库服务器将内部数据结构发送到数据
库服务器来存储在不透明类型列中时,它会精确显示要使用的支持函数。
不透明类型名称提供的歧义的丧失可以使数据转换更有效率。
但是,
在此情况中,
var
binary 主机变量可以保存特定不透明类型数据类型的数据。

可以在单个声明行中声明多个 var binary 变量。但是所有的变量必须具有相同的不透
明类型,如 图 1中所示。
var binary 主机变量
在 GBase 8s ESQL/C 程序中,
可变长度 C 结构 ifx_varlena_t 存储 var binary 主机
变量的二进制值。此数据结构允许您在不指定此不透明数据类型的精确结构时传输二进制
数据。它提供一个数据缓冲区保存与 var binary 主机变量相关联的数据。

重要: ifx_varlena_t 结构对 GBase 8s ESQL/C 程序来说是一个不透明结构。即,您
不能直接访问它的内部结构。ifx_varlena_t 的内部结构可能在之后的版本更改。因此,要
创建便捷的代码,总是对此结构使用 GBase 8s ESQL/C 访问程序函数获取并将值存储在
ifx_varlena_t 结构中。

本节使用可变长度的不透明数据类型 image 演示 GBase 8s ESQL/Cvar binary 主机
变量如何访问不透明数据类型。
此图像数据类型封装了 JPEG 、
GIF 或 PPM 文件等图像。
如果图像小于 2 千字节,则此数据类型的数据结构直接存储此图像。但是,如果图像大于
2 千字节,则数据结构存储包含此图像数据的智能大对象的引用(LO 指针结构)、下图
显示了数据库中 image 数据类型的内部数据结构。


GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 275 -

图 9. 图像不透明数据类型的内部数据结构

typedef struct
{
int img_len;
int img_thresh;
int img_flags;
union
{
ifx_lop_t img_lobhandle;
char img_data[4];
}

} image_t;

typedef struct
{
point_t center;
double radius;
} circle_t;


下图显示了 CREATE TABLE 语句,它创建了具有 image 类型的列和图像标识符的
表 image_tab 。

图 10. 创建一个图像不透明数据类型的列

CREATE TABLE image_tab
(
image_id integer not null primary key),
image_col image
);


GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 276 -


下图显示了如何使用 var binary 主机变量在 image_tab 表(参见图 2)image_col 列
中进行插入和选择。

图 11. 使用 var binary 主机变量访问图像不透明数据类型的内部格式

#include ;

EXEC SQL BEGIN DECLARE SECTION;
var binary 'image' vbin_image;
EXEC SQL END DECLARE SECTION;

struct image_t user_image, *image_ptr;
int imgsz;

/* Load data into members of internal data structure
load_image(&user_image);
imgsz = getsize(&user_image);

/* Allocate memory for var binary data buffer */
ifx_var_flag(&vbin_image, 0);
ifx_var_alloc(&vbin_image, imgsz);

/* Assign data to data buffer of var binary host
* variable */
ifx_var_setdata(&vbin_image, &user_image, imgsz);

/* Insert a new image_tab row with a var binary host
* variable */
EXEC SQL insert into image_tab values (1, :vbin_image);

/* Deallocate image data buffer */
ifx_var_dealloc(&vbin_image);

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 277 -


/* Select an image_tab row from into a var binary
* host variable */
ifx_var_flag(&vbin_image, 1);
EXEC SQL select image_col into :vbin_image
from image_tab
where image_id = 1;
image_ptr = (image_t *)ifx_var_getdata(&vbin_image);
unload_image(&user_image);
ifx_var_dealloc(&vbin_image);
从 var binary 主机变量插入
将 var binary 主机变量包含的数据插入到不透明类型列,图 3中的代码
采用以下步骤:
将图像数据从外部 JPEG 、GIF 或 PPM 文件加载到 image_t 内部数据结构中。
load_image()
C 例程从外部文件加载 user_image 结构。图 1所示的 image_t
内部结构的定义必须可用于 GBase 8s ESQL/C 程序。因此,代码片段包含定义
image_t 结构的 image.h 头文件。

getsize() C 函数作为 GBase 8s ESQL/C 支持 image 不透明数据类型的一部分模块提
供,它返回 image_t 结构的大小。

为 var binary 主机变量 vbin_image 的数据缓冲区分配内存。
标志值为 0 的 ifx_var_flag() 函数通知 GBase 8s ESQL/C 应用程序将为
vbin_image 主机变量分配内存。ifx_var_alloc() 函数然后为数据缓冲区分配图像数据所需
的字节数(imgsz)。

将 image_t 结构存储在 vbin_image 主机变量的数据缓冲区。
ifx_var_setdata() 函数将 user_image 结构包含的数据保存到 vbin_image 数据缓冲
区。此函数还要求数据缓冲区的大小,getsize() 函数返回。

将 vbin_image 数据缓冲区包含的数据插入到 image_col 不透明类型列。
当数据库服务器执行此 INSERT 语句时,它调用 image 数据类型的接收支持函数,
以便在 GBase 8s ESQL/C 客户端应用程序发送的数据的内部格式(image_t)和内部格式
磁盘上的 image 数据类型。


GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 278 -

释放 vbin_image 主机变量的数据缓冲区。
ifx_var_dealloc() 函数释放 vbin_image 数据缓冲区。

要使用 var binary 主机变量将空值插入到不透明类型列中,可以使用以下两种方法:

将与 var binary 主机变量相关联的指示变量设置为 -1。

以下代码使用 image_ind 指示变量和 vbin_image 主机变量将空值插入到 circle_col
列:
#include ;

EXEC SQL BEGIN DECLARE SECTION;
var binary 'image' vbin_image;
int image_ind;
EXEC SQL END DECLARE SECTION;

image_ind = -1;
EXEC SQL insert into image_tab
values (:vbin_image:image_ind);

使用 ifx_var_setnull() 函数将 var binary 主机变量的数据缓冲区设置为空值。

对于相同的 vbin_image 主机变量,下行使用 ifx_var_setnull() 函数将空值插入到
circle_col 列中:
ifx_var_setnull(&vbin_image, 1);
EXEC SQL insert into image_tab values (:vbin_image);
选择到 var binary 主机变量
将不透明类型列包含的数据选择到 var binary 主机变量中,图 3中的代
码采取以下步骤:
给 var binary 主机变量 vbin_image 的数据缓冲区分配内存。
具有标志值 1 的 ifx_var_flag() 函数通知 GBase 8s ESQL/C 它给 vbin_image 主机
变量分配新的数据缓冲区。
(此数据缓冲区在 INSERT 语句完成后被释放。)当 GBase 8s
ESQL/C 接收到 SELECT 语句的数据时,执行此分配。


GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 279 -

将 image_col 不透明类型列包含的数据选择到 vbin_image 数据缓冲区。
当数据库服务器执行此 SELECT 语句时,
它调用 image 的发送支持函数执行在磁盘
上的 image 数据类型的内部格式和已发送(image_t)的 GBase 8s ESQL/C 客户端应用程
序的内部格式之间的必须翻译。

将 vbin_image 主机变量包含的数据缓冲区中的数据存储到 image_t 结构中。
此 SELECT 语句之后,vbin_image 主机变量的数据缓冲区包含 image 数据类型内
部格式的数据。ifx_var_getdata() 函数将此数据缓冲区的内容返回到 image_t 数据结构中。
因为 ifx_var_getdata() 函数将数据缓冲区作为一个 “void *” 值返回,所以这个对
ifx_var_getdata() 的调用在将它分配给 image_ptr 变量之前,将此返回值作为一个指向
image_t 结构的指针。

将 image_t 内部数据结构的图像数据卸载为一个外部 JPEG 、GIF 或 PPM 文件。
unload_image() 例程将 user_image 结构卸载为一个外部文件。

释放 vbin_image 主机变量的数据缓冲区。
ifx_var_dealloc() 函数释放 vbin_image 数据缓冲区。
必须显式释放此数据缓冲区即使
是 GBase 8s ESQL/C 分配的。

要检查具有 var binary 主机变量的不透明类型列是否包含空值,可以使用以下两种
方法:
检查与 var binary 主机变量的相关联的指示变量的值是否为 -1。
以下代码使用 image_ind 指示变量和 vbin_image 主机变量检查 circle_col 列的空值:

#include ;

EXEC SQL BEGIN DECLARE SECTION;
var binary 'image' vbin_image;
int image_ind;
EXEC SQL END DECLARE SECTION;

EXEC SQL select image_col into :vbin_image:image_ind
from image_tab
where image_id = 1;

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 280 -

if (image_ind == -1)
?

使用 ifx_var_isnull() 函数检查 var binary 主机变量的数据缓冲区是否为空值。
对于相同的 vbin_image 主机变量,以下行使用 ifx_var_isnull() 函数检查 image_col
列中的空值:
EXEC SQL select image_col into :vbin_image
from image_tab
where image_id = 1;
if (ifx_var_isnull(&vbin_image) == 1)
?