返回首页

gbase数据、南大通用产品文档:GBase8sDATETIME 和 INTERVAL 库函数

更新日期:2024年09月11日

必须对 datetime 和 interval 数据类型使用以下 GBase 8s ESQL/C 库函数才能对这
些类型的值执行所有操作,GBase 8s ESQL/C 中提供以下 C 函数来处理 datetime 和

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 132 -
interval 主机变量。
函数名称
描述
请参阅
dtaddinv()
将 interval 值添加到 datetime 值
dtaddinv()
函数
dtcurrent()
获得当前日期和时间
dtcurrent()
函数
dtcvasc()
将符合 ANSI 的字符字符串转换为 datetime 值
dtcvasc()
函数
dtcvfmtasc()
将具有特定格式的字符字符串转换为 datetime 值
dtcvfmtasc(
) 函数
dtextend()
更改 datetime 值的限定符
dtextend()
函数
dtsub()
从另一个 datetime 值减去一个 datetime 值
dtsub() 函

dtsubinv()
从 datetime 值减去间隔值
dtsubinv()
函数
dttoasc()
将 datetime 值转换为符合 ANSI 的字符字符串
dttoasc()
函数
dttofmtasc()
将 datetime 值转换为具有特定格式的字符字符串
dttofmtasc(
) 函数
incvasc()
将符合 ANSI 的字符字符串转换为 interval 值
incvasc()
函数
incvfmtasc()
将具有特定格式的字符字符串转换为 interval 值
incvfmtasc(
) 函数
intoasc()
将 interval 值转换为符合 ANSI 的字符字符串
intoasc()
函数
intofmtasc()
将 interval 值转换为具有特定格式的字符字符串
intoasc()
函数
invdivdbl()
将 interval 值除以数值
intofmtasc(
) 函数
invdivinv()
将 interval 值除以另一个 interval 值
invdivdbl()
函数
invextend()
将 interval 值扩展到不同的 interval 限定符
invdivinv()
函数
invmuldbl()
将 interval 值乘以数值
invextend()
函数


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

高效透明压缩技术
...................................
8

要创建动态线程库,您必须为 GBase 8s ESQL/C 执行的每个线程操作定义例程,并
且使用 GBase 8s ESQL/C 注册这些函数。以下列表显示了多线程 GBase 8s ESQL/C 应用
程序所需的所有函数,并描述了每个函数必须执行的操作。
mint ifxOS_th_once(ifxOS_th_once_t *pblock, ifxOS_th_initroutine_t pfn, int *init_data)
此例程执行初始化 pfn()。即使在同一线程中同时被多个线程同时调用多次,也只执
行一次 pfn() 函数。
pfn() 例程相当于 DCE pthread_once() 或 POSIX pthread_once() 例程。

init_data 变量用于没有 pthread_once() 类型例程的线程包,
例如 Solaris Kernel 线程。
该例程可以通过使用 init_data 作为初始化为 0 的全局变量来模拟该例程。
if (!*init_data)
{
mutex_lock(pblock);
if (!*init_data)
{
(*pfn)();

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 406 -
*init_data = 1;
}
mutex_unlock(pblock);
}
return(0);
mint ifxOS_th_mutexattr_create(ifxOS_th_mutexattr_t *mutex_attr
该函数创建一个互斥属性对象,它们在创建互斥时指定互斥体的属性。互斥属性对象
由用户实现定义的所有属性的缺省值初始化。
该例程相当于 DCE pthread_mutexattr_create()
或 POSIX pthread_mutexattr_init() 例程。如果线程包不支持互斥属性对象,则互斥属性例
程可以是 no-ops。
mint ifxOS_th_mutexattr_setkind_np(ifxOS_th_mutexattr_t *mutex_attr, int kind)
该例程在创建互斥对象时,
使用的互斥类型属性。
此互斥属性 mutex_attr 设置为类型
kind。对于 DCE,该例程是 pthread_mutexattr_setkind_np()。
mint ifxOS_th_mutexattr_delete(ifxOS_th_mutexattr_t *mutex_attr)
该例程删除互斥属性对象 mutex_attr。该例程具有与 DCE pthread_mutexattr_delete()
或 POSIX pthread_mutexattr_destroy() 例程相同的功能。
mint ifxOS_th_mutex_init(ifxOS_th_mutex_t *mutexp, ifxOS_th_mutexattr_t mutex_attr)
该例程创建互斥并将它初始化为未锁定的状态。此例程具有与 DCE
pthread_mutex_init() 或 POSIX pthread_mutex_init() 例程相同的功能。
mint ifxOS_th_mutex_destroy(ifxOS_th_mutex_t *mutexp)
此例程删除互斥对象。此互斥对象在其删除前必须未锁定。此例程具有与 DCE
pthread_mutex_destroy() 或 POSIX pthread_mutex_destroy() 例程相同的功能。
mint ifxOS_th_mutex_lock(ifxOS_th_mutex_t *mutexp)
该例程锁定为锁定的互斥对象。如果互斥对象已经被锁定,则此调用线程等待指定互
斥对象变为未锁定状态。该例程具有与 DCE pthread_mutex_lock() 或 POSIX
pthread_mutex_lock() 例程相同的功能。
mint ifxOS_th_mutex_trylock(ifxOS_th_mutex_t *mutexp)
如果互斥对象成功被锁定,则它返回值 1,如果互斥对象由另一个线程锁定,则它返
回值 0。
该例程具有与 DCE pthread_mutex_trylock() 例程相同的功能。
mint ifxOS_th_mutex_unlock(ifxOS_th_mutex_t *mutexp)
该例程解锁互斥 mutexp。如果线程等锁定此互斥,则该实现定义哪个线程接收到互
斥。该例程具有与 DCE pthread_mutex_unlock() 或 POSIX pthread_mutex_unlock() 例程相
同的功能。
mint ifxOS_th_condattr_create(ifxOS_th_condattr_t *cond_attr)
该例程创建一个对象,用于指定条件变量创建时指定其属性。使用用户实现定义的所

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 407 -
有属性的缺省值初始化对象。该例程具有与 DCE pthread_condattr_create() 或 POSIX
pthread_condattr_init() 例程相同的功能。
mint ifxOS_th_cond_init(ifxOS_th_cond_t *condp, ifxOS_th_condattr_t cond_attr)
该例程创建并初始化集合变量。该例程具有与 DCE pthread_cond_init() 或 POSIX
pthread_cond_init() 例程相同的功能。
mint ifxOS_th_condattr_delete(ifxOS_th_condattr_t *cond_attr)
该例程删除条件变量属性对象 cond_attr。
该例程具有与 DCE pthread_condattr_delete()
或 POSIX pthread_condattr_destroy() 例程相同的功能。
mint ifxOS_th_cond_destroy(ifxOS_th_cond_t *condp)
该例程删除条件变量 condp。该例程具有与 DCE pthread_cond_destroy() 或 POSIX
pthread_cond_destroy() 例程相同的功能。
mint ifxOS_th_cond_timedwait(ifxOS_th_cond_t *sleep_cond, ifxOS_th_mutex_t
*sleep_mutex, ifxOS_th_timespec_t *t)
该例程导致线程等待直到状态变量 sleep_cond 发出信号或广播,或者当前系统时钟
时间变得大于或等于 t 中指定的时间。该例程具有与 DCE pthread_cond_timedwait() 或
POSIX pthread_cond_timedwait() 例程相同的功能。
mint ifxOS_th_keycreate(ifxOS_th_key_t *allkey, ifxOS_th_destructor_t AllDestructor)
该例程生成标识特定于线程的数据值的唯一值。
该例程具有与 DCE pthread_keycreate()
或 POSIX pthread_key_create() 例程相同的功能。
mint ifxOS_th_getspecific(ifxOS_th_key_t key, ifxOS_th_addr_t *tcb)
该例程获取与键相关联的线程特定数据。该例程具有与 DCE pthread_getspecific() 或
POSIX pthread_getspecific() 例程相同的功能。
mint ifxOS_th_setspecific(ifxOS_th_key_t key, ifxOS_th_addr_t tcb)
该例程设置于当前线程的键相关联的 tcb 中的线程的特定数据。如果已经为当前线
程中的键定义了一个值,则将替换现有值的新值。该例程具有与 DCE pthread_setspecific()
或 POSIX pthread_setspecific() 例程相同的功能。
数据类型
可以为上述函数中的数据类型为线程程序包中的等效数据类型创建 typedefs ,
或者可
以还有线程程序包而不是 ifxOS_ 版本中的相应的数据类型。以下列表包括上述函数使用
的所有数据类型:
ifxOS_th_mutex_t
此结构在 DCE 和 POSIX 中定义互斥对象:pthread_mutex_t。
ifxOS_th_mutexattr_t
该结构在 DCE 和 POSIX 中定义了一个名为 pthread_mutexattr_t 的互斥属性

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 408 -
对象。
如果线程包
(例如,
Solaris 核心线程)
中不支持互斥属性,
则可以将它们指定为 mint
数据类型。
ifxOS_th_once_t
该结构允许客户端初始化操作保证对初始化例程的互斥访问,并保证每次初始化只执
行一次。该例程与 DCE 和 POSIX 中的 pthread_once_t 结构具有相同的功能。
ifxOS_th_condattr_t
该结构定义了一个对象,它指定 DCE 和 POSIX 中一个条件变量
pthread_condattr_t 的属性。如果线程包(例如,Solaris 核心线程)中不支持此对象,
则可以为其分配为 mint 数据类型。
ifxOS_th_cond_t
该结构定义了 DCE 和 POSIX 中的名为 pthread_cond_t 的条件变量。
ifxOS_th_timespec_t
该结构定义 ifxOS_th_cond_timedwait() 函数在条件变量未发出信号或广播时,
超时的
绝对时间。该结构是在 DCE 和 POSIX 中的 timespec_t。
ifxOS_th_key_t
该结构定义特定于线程键,在 ifxOS_th_keycreate() 、ifxOS_th_setspecific() 和
ifxOS_getspecific() 例程中使用。该结构是在 DCE 和 POSIX 中的 pthread_key_t。
ifxOS_th_addr_t
该结构定义包含要与 ifxOS_th_key_t 类型特定于线程的数据键相关联的数据的地
址。ifxOS_th_addr_t 结构等同于 DCE 中的 pthread_addr_t。可以指定 void * 作
为可用于不定义此类结构的线程包(如 POSIX)的替代方法。
以下示例使用 Solaris 核心线程演示如何设置动态线程库。第一个任务是定义共享和/
或静态库所需的 17 个动态线程函数。在此示例中,该文件称为 dynthr.c:
/* Prototypes for the dynamic thread functions */

mint ifx_th_once(mutex_t *pblock, void (*pfn)(void), mint *init_data);
mint ifx_th_mutexattr_create(mint *mutex_attr);
mint ifx_th_mutexattr_setkind_np(mint *mutex_attr, mint kind);
mint ifx_th_mutexattr_delete(mint *mutex_attr);
mint ifx_th_mutex_init(mutex_t *mutexp, mint mutex_attr);
mint ifx_th_mutex_destroy(mutex_t *mutexp);
mint ifx_th_mutex_lock(mutex_t *mutexp);
mint ifx_th_mutex_trylock(mutex_t *mutexp);
mint ifx_th_mutex_unlock(mutex_t *mutexp);
mint ifx_th_condattr_create(mint *cond_attr);
mint ifx_th_cond_init(cond_t *condp, mint cond_attr);
mint ifx_th_condattr_delete(mint *cond_attr);
mint ifx_th_cond_destroy(cond_t *condp);
mint ifx_th_cond_timedwait(cond_t *sleep_cond, mutex_t *sleep_mutex,

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 409 -
timestruc_t *t);
mint ifx_th_keycreate(thread_key_t *allkey, void (*AllDestructor)
(void *));
mint ifx_th_getspecific(thread_key_t key, void **tcb);
mint ifx_th_setspecific(thread_key_t key, void *tcb);

/*
* The functions . . . *
* */

mint ifx_th_once(mutex_t *pblock, void (*pfn)(void), mint *init_data)
{
if (!*init_data)
{
mutex_lock(pblock);
if (!*init_data)
{
(*pfn)();
*init_data = 1;
}
mutex_unlock(pblock);
}
return(0);
}

/* Mutex attributes are not supported in solaris kernel threads *
* The functions must be defined anyway, to avoid accessing *
* a NULL function pointer. */

mint ifx_th_mutexattr_create(mint *mutex_attr)
{
*mutex_attr = 0;
return(0);
}

/* Mutex attributes are not supported in solaris kernel threads */
mint ifx_th_mutexattr_setkind_np(mint *mutex_attr, mint kind)
{
*mutex_attr = 0;
return(0);
}

/* Mutex attributes are not supported in solaris kernel threads */
mint ifx_th_mutexattr_delete(mint *mutex_attr)
{
return(0);
}

mint ifx_th_mutex_init(mutex_t *mutexp, mint mutex_attr)

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 410 -
{
return(mutex_init(mutexp, USYNC_THREAD, (void *)NULL));
}

mint ifx_th_mutex_destroy(mutex_t *mutexp)
{
return(mutex_destroy(mutexp));
}

mint ifx_th_mutex_lock(mutex_t *mutexp)
{
return(mutex_lock(mutexp));
}
/* Simulate mutex_trylock using mutex_lock */
mint ifx_th_mutex_trylock(mutex_t *mutexp)
{
mint ret;

ret = mutex_trylock(mutexp);
if (ret == 0)
return(1); /* as per the DCE call */
if (ret == EBUSY)
return(0); /* as per the DCE call */
return(ret);
}

mint ifx_th_mutex_unlock(mutex_t *mutexp)
{
return(mutex_unlock(mutexp));
}

/* Condition attributes are not supported in solaris kernel threads */
mint ifx_th_condattr_create(mint *cond_attr)
{
*cond_attr = 0;
return(0);
}

mint ifx_th_cond_init(cond_t *condp, mint cond_attr)
{
return(cond_init(condp, USYNC_THREAD, (void *)NULL));
}

mint ifx_th_condattr_delete(int *cond_attr)
{
return(0);
}

mint ifx_th_cond_destroy(cond_t *condp)

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 411 -
{
return(cond_destroy(condp));
}

mint ifx_th_cond_timedwait(cond_t *sleep_cond, mutex_t
*sleep_mutex,timestruc_t
*t)
{
return(cond_timedwait(sleep_cond, sleep_mutex, t));
}

mint ifx_th_keycreate(thread_key_t *allkey, void (*AllDestructor)
(void *))
{
return(thr_keycreate(allkey, AllDestructor));
}

mint ifx_th_getspecific(thread_key_t key, void **tcb)
{
return(thr_getspecific(key, tcb));
}

mint ifx_th_setspecific(thread_key_t key, void *tcb)
{
return(thr_setspecific(key, tcb));
注册动态线程函数
GBase 8s ESQL/C 应用程序必须使用 ifxOS_set_thrfunc() 函数注册 GBase 8s
ESQL/C 动态线程函数f。
下列声明描述 ifxOS_set_thrfunc() 函数。
mint ifxOS_set_thrfunc(mint func, mulong (*funcptr)())
第一个参数 func 是 mint,
索引被注册的函数。
第二个参数是要注册的函数的名称。
对于在在 UNIX 操作系统上创建动态线程库中列出的 17 个 ifxOS 函数,必须调用
ifxOS_set_thrfunc() 一次。
如果 ifxOS_set_thrfunc() 函数成功注册函数,
则返回 0,
如果失败则返回 -1。
例如,
要将用户定义的函数 my_mutex_lock() 注册为 ifxOS_th_mutex_lock 例程,请使用以下
调用:
if (ifxOS_set_thrfunc(TH_MUTEX_LOCK, (mulong (*)())my_mutex_lock)
== -1)
TH_MUTEX_LOCK 在 sqlhdr.h 中定义,它告诉客户端在它需要锁定互斥时调用
my_mutex_lock() 。
以下列表显示了它们注册的索引及其函数。
索引

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 412 -
函数
TH_ONCE
ifxOS_th_once
TH_MUTEXATTR_CREATE
ifxOS_th_mutexattr_create()
TH_MUTEXATTR_SETKIND
ifxOS_th_mutexattr_setkind_np()
TH_MUTEXATTR_DELETE
ifxOS_th_mutexattr_delete()
TH_MUTEX_INIT
ifxOS_th_mutex_init()
TH_MUTEX_DESTROY
ifxOS_th_mutex_destroy()
TH_MUTEX_LOCK
ifxOS_th_mutex_lock()
TH_MUTEX_UNLOCK
ifxOS_th_mutex_unlock()
TH_MUTEX_TRYLOCK
ifxOS_th_mutex_trylock()
TH_CONDATTR_CREATE
ifxOS_th_condattr_create()
TH_CONDATTR_DELETE
ifxOS_th_condattr_delete()
TH_COND_INIT
ifxOS_th_cond_init()
TH_COND_DESTROY
ifxOS_th_cond_destroy()
TH_COND_TIMEDWAIT
ifxOS_th_cond_timedwait()
TH_KEYCREATE
ifxOS_th_keycreate()

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 413 -
TH_GETSPECIFIC
ifxOS_th_getspecific()
TH_SETSPECIFIC
ifxOS_th_setspecific()
下列函数 dynthr_init(),也在 dynthr.c 中定义,注册了在 UNIX 操作系统上创建
动态线程库中定义的 17 个函数。FUNCFAIL 定义为 -1。
dynthr_init()
{
if (ifxOS_set_thrfunc(TH_ONCE, (mulong (*)())ifx_th_once)
== FUNCFAIL)
return FUNCFAIL;

if (ifxOS_set_thrfunc(TH_MUTEXATTR_CREATE,
(mulong (*)())ifx_th_mutexattr_create) == FUNCFAIL)
return FUNCFAIL;

if (ifxOS_set_thrfunc(TH_MUTEXATTR_SETKIND,
(mulong (*)())ifx_th_mutexattr_setkind_np) == FUNCFAIL)
return FUNCFAIL;

if (ifxOS_set_thrfunc(TH_MUTEXATTR_DELETE,
(mulong (*)())ifx_th_mutexattr_delete) == FUNCFAIL)
return FUNCFAIL;

if (ifxOS_set_thrfunc(TH_MUTEX_INIT,
(mulong (*)())ifx_th_mutex_init) == FUNCFAIL)
return FUNCFAIL;

if (ifxOS_set_thrfunc(TH_MUTEX_DESTROY,
(mulong (*)()) ifx_th_mutex_destroy) == FUNCFAIL)
return FUNCFAIL;

if (ifxOS_set_thrfunc(TH_MUTEX_LOCK,
(mulong (*)()) ifx_th_mutex_lock) == FUNCFAIL)
return FUNCFAIL;

if (ifxOS_set_thrfunc(TH_MUTEX_UNLOCK,
(mulong (*)())ifx_th_mutex_unlock) == FUNCFAIL)
return FUNCFAIL;

if (ifxOS_set_thrfunc(TH_MUTEX_TRYLOCK,
(mulong (*)())ifx_th_mutex_trylock) == FUNCFAIL)
return FUNCFAIL;
if (ifxOS_set_thrfunc(TH_CONDATTR_CREATE,
(mulong (*)())ifx_th_condattr_create) == FUNCFAIL)
return FUNCFAIL;

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

if (ifxOS_set_thrfunc(TH_CONDATTR_DELETE,
(mulong (*)())ifx_th_condattr_delete) == FUNCFAIL)
return FUNCFAIL;

if (ifxOS_set_thrfunc(TH_COND_INIT,
(mulong (*)())ifx_th_cond_init) == FUNCFAIL)
return FUNCFAIL;

if (ifxOS_set_thrfunc(TH_COND_DESTROY,
(mulong (*)())ifx_th_cond_destroy) == FUNCFAIL)
return FUNCFAIL;
if (ifxOS_set_thrfunc(TH_COND_TIMEDWAIT,
(mulong (*)())ifx_th_cond_timedwait) == FUNCFAIL)
return FUNCFAIL;

if (ifxOS_set_thrfunc(TH_KEYCREATE,
(mulong (*)())ifx_th_keycreate) == FUNCFAIL)
return FUNCFAIL;

if (ifxOS_set_thrfunc(TH_GETSPECIFIC,
(mulong (*)())ifx_th_getspecific) == FUNCFAIL)
return FUNCFAIL;

if (ifxOS_set_thrfunc(TH_SETSPECIFIC,
(mulong (*)())ifx_th_setspecific) == FUNCFAIL)
return FUNCFAIL;
return 0;

}
设置 $THREADLIB 环境变量
以下 C-shell 命令设置 THREADLIB 环境变量以指定用户定义线程包:
setenv THREADLIB DYNAMIC
创建共享库
必须将 dynthr.c 编译到共享或静态库汇总。以下示例说明如何在运行 Solaris 操作系
统的工作站上编译共享或静态库:
% cc -c -DIFX_THREAD -I$GBASEDBTDIR/incl/esql -D_REENTRANT -K pic
dynthr.c
% ld -G -o libdynthr.so dynthr.o
% cp libdynthr.so /usr/lib <== as root
还可以使用 $LD_LIBRARY_PATH 环境变量:
% cc -c -DIFX_THREAD -I$GBASEDBTDIR/incl/esql -D_REENTRANT -K pic
dynthr.c
% cp dynthr.so
% setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:directory>

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 415 -
要将 dynthr.c 编译到静态库,请执行以下操作(在 Solaris 上):
% cc -c -DIFX_THREAD -I$GBASEDBTDIR/incl/esql -D_REENTRANT dynthr.c

% ar -cr dynthr.a dynthr.o
初次调用 dynthr_init() 例程,或线程函数都没有注册时,必须更改您的应用程序
test.ec 。
void main(argc , argv )
int argc;
char *argv[] ;
{ /* begin main */

/* First, set up the dynamic thread library */

dynthr_init();

/* Rest of program */

EXEC SQL database stores7;



}
使用 -thread 和 -l 预处理器选项编译
必须使用 -thread 和 -l 预处理器选项编译应用程序。
-thread 选项指示您正在链接线程安全库而不是缺省的 GBase 8s 共享库。-l 选项允
许您指定想要链接的系统库。最终,编译应用程序时,链接 libdynthr.so 并运行它,如以
下示例所示:
% setenv THREADLIB "dynamic"
% esql -thread -ldynthr test.ec -o test.exe
% test.exe
4 Dynamic SQL