返回首页

gbase数据、南大通用产品文档:GBase8ssqlbreakcallback() 函数

更新日期:2024年09月11日

sqlbreakcallback() 函数允许您指定超时间隔,并注册 callback 函数。当数据库服务器
正在处理 SQL 请求时,该 callback 函数为应用程序提供重新获得控制的方法。

限制:
如果您的 GBase 8s ESQL/C 应用程序使用共享内存
(onipcshm)
作为 nettype
来连接到 GBase 8s 数据库服务器,则请不要使用 sqlbreakcallback() 函数。共享内不能不
是真正的网络协议,且不处理支持 callback 函数所需要的 nonblocking I/O。当您随同共享
内存使用 sqlbreakcallback() 时,该调用看来似乎成功地注册 callback 函数(它返回零);
然而,在 SQL 请求期间,该应用程序从不调用 callback 函数。

语法

mint sqlbreakcallback(timeout, callbackfunc_ptr);
int4 timeout;
void (* callbackfunc_ptr)(int status);
timeout
在应用程序进程重新获得控制之前,SQL 请求等待执行的时间间隔。
此值可为如下:
-1
清除 timeout 值。
0
立即调用 callbackfunc_ptr 指示的函数。
>0
将超时间隔设置为在该应用程序调用 callbackfunc_ptr 指示的函数之前经过的毫秒数。

timeout 参数是一 4 字节变量。
此参数依赖于操作系统:
它可为 int、
long 或 short 数
据类型的变量。
callbackfunc_ptr
执行用户定义的 callback 函数的指针。


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

用法
在您以 sqlbreakcallback() 注册 callback 函数之后,应用程序在执行 SQL 请求的三
个不同的点处调用此函数。callback 函数的 status 参数中的值指示应用程序在哪个点调用
该函数。下表总结 status 值。

调用 callback 函数的时刻
status 参数的值
当数据库服务器开始处理 SQL 请
求时
status = 1
在数据库服务器执行 SQL 请求时,
当已经过了超时间隔时
status = 2
当数据库服务器完成 SQL 请求的
处理时
status = 0

当您以 status 值 2 调用 callback 函数时,callback 函数可确定数据库服务器是否可
以下列行动之一来继续处理:
它可调用 sqlbreak() 函数来取消该 SQL 请求。
它可忽略 sqlbreak() 调用,来继续该 SQL 请求。

该 callback 函数,
以及任何它的子例程,
仅可包含下列 GBase
8s
ESQL/C
控制函数:sqldone()、sqlbreak() 和 sqlbreakcallback()。

如果您以 timeout 值零来调用 sqlbreakcallback(),
则 callback 函数立即执行。
callback
函数多次执行,直到它包含对 sqlbreakcallback() 的调用来以下列行动之一重新定义该
callback 函数为止:
它解除该 callback 函数的关联,来终止该 callback 函数的调用,如下:
sqlbreakcallback(-1L, (void *)NULL);
它定义某个其他的 callback 函数,或将 timeout 值重置为非零值,如下:
sqlbreakcallback(timeout, callbackfunc_ptr);

重要: 小 timeout 值可能反而影响您的应用程序的性能。

在您调用 sqlbreakcallback() 函数之前,您必须建立数据库服务器连接。在连接期间,
callback 函数保持有效,或直到 sqlbreakcallback() 函数重新定义该 callback 函数为止。


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

返回代码
0
sqlbreakcallback() 调用成功。
<0
sqlbreakcallback() 调用不成功。

不在 WHERE 子句中编写子查询,您可使用 MERGE 语句将来自源表和目标表的行连接
在一起,然后从目标删除与连接条件相匹配的那些行。(Delete MERGE 中的源表还可为
一个集合派生的表,它的行是查询的结果,该查询连接其他的表和视图,但是在下列的示
例中,源是单个表。)
如在前面的示例中那样,
假设您发现 stock 表的某些行包含不正确的制造商代码。
您想要删
除它们以便重新输入它们,而不是更新它们。您可使用 MERGE 语句,指定 stock 作为目
标表,manufact 作为源表,ON 子句中的连接条件,并对于带有不正确的制造商代码
的 stock 行使用 Delete 子句,如下例所示:
MERGE INTO stock USING manufact
ON stock.manu_code != manufact.manu_code
WHEN MATCHED THEN DELETE;
在此示例中,会从 stock 表中删除那些满足 ON 子句中的连接条件的所有行。在此,对于
其中的 manu_code 列值不等于 manufact 中的任何manu_code 值的 stock 的那些行,连接条
件中的不等谓词(stock.manu_code != manufact.manu_code)求值为真。
在 USING 子句中必须罗列正连接到目标表的源表。
MERGE 语句还可更新目标表的行,
或将数据从源表插入到目标表,
根据该行是否满足 ON
子句为连接目标表与源表而指定的条件。单个 MERGE 语句还可同时组合 DELETE 与
INSERT 操作,或者可同时组合 UPDATE 与 INSERT 操作而不删除任何行。MERGE 语
句不更改源表。要获取关于 Delete 合并、Insert 合并和 Update 合并的语法与限制的更多
信息,请参阅《GBase 8s SQL 指南:语法》 中 MERGE 语句的描述。

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

参数说明:允许输出一些与VACUUM 相关的日志,便于定位VACUUM 相关问题。开
发人员专用,不建议普通用户使用。
该参数属于SIGHUP 类型参数,请参考表15-1 中对应设置方法进行设置。
取值范围:布尔型

on/true 表示开启此日志开关。

off/false 表示关闭此日志开关。
默认值:off