返回首页

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

更新日期:2024年09月11日

函数原型:
sword GCIIntervalSetYearMonth ( void *hndl,
GCIError *err,
sb4 yr,
sb4 mnth,
GCIInterval *result
);
功能描述:

设置GCIInterval 的日期。
参数说明:
hndlp(输入)
上下文或者环境句柄

errhp(输入)


错误信息句柄,该接口调用失败时,错误信息会存在该句柄上。
yr(输入)
单位:年
mnth(输入)
单位:月
result(输出)
GCIInterval 对象句柄。
返回值:

如果执行成功,返回GCI_SUCCESS,否则返回GCI_ERROR
注释:
请参阅INTERVAL 数据类型相关手册。
8 错误码
#define GCI_BIND_ERROR 1001
#define GCI_DEFINE_ERROR 1002
#define GCI_ATTRGET_ERROR 1003
#define GCI_ATTRSET_ERROR 1004
#define GCI_HANDLEALLOC_ERROR
1005
#define GCI_HANDLEFREE_ERROR 1006

#define GCI_ENVCREATE_ERROR 1007
#define GCI_LOGONNODB_ERROR
1009
#define GCI_LOGOFF_ERROR 1010
#define GCI_SERVERATTACH_ERROR
1011
#define GCI_SESSIONEND_ERROR 28



#define GCI_SESSIONBEGIN_ERROR
1013
#define GCI_SERVERVERSION_ERROR 1008

#define GCI_TRANSCOMMIT_ERROR
1015
#define GCI_TRANSSTART_ERROR 1016
#define GCI_TRANSROLLBACK_ERROR 1017
#define GCI_STMTPREPARE_ERROR
1018
#define GCI_STMTEXECUTE_ERROR
1019
#define GCI_STMTFETCH_ERROR 1020

#define GCI_DESCALLOC_ERROR 1021
#define GCI_DESCFREE_ERROR
1022
#define GCI_PARAMGET_ERROR 1023
#define GCI_PARAMSET_ERROR
1024
#define GCI_DESCANY_ERROR
1025

#define GCI_DIRPATH_LOADSTREAM_ERROR
1026
#define GCI_LOB_GETLENGTH_ERROR 1027
#define GCI_LOB_READ_ERROR
1028
#define GCI_LOG_WRITE_ERROR 1029
#define GCI_LOG_PROCDESC_ERROR 1030

#define GCI_DB_CONNECT_ERROR 3114
#define GCI_NOT_LOGGED_ON 1012
#define GCI_SHUTDOWN_IN_PROGRESS 1014
#define GCI_DATETIME_CONVERT 1040
注:当厂家设置为3 时,错误码设置为数据库返回的错误码。

9 GCCI 综述
GBase 8s GCCI 接口是一套应用程序编程接口,
它允许 C++程序与一个或者多 个
GBase 8s 数据库进行交互。它提供给应用开发人员强大的数据库操作能力, 比
如执行 SQL,
处理存储过程等。
现阶段我们仅实现简单的增删改查基础功能的 接
口,后续阶段将提供其他兼容接口。
10 安装

GBase 8s GCCI 接口基于 GBase 8s GCI 实现,为此我们需要先安装 GBase 8s GCI
相关库并配置其开发环境。



11 环境配置
以下示例说明如何进行 GCCI 编程相关环境设置:
export PATH
GBASEDBTDIR=/home/g3001
GBASEDBTDIR=/usr/gbasedbt
GBASEDBTSERVER=ol_gbasedbt1210_6
INFORMIXSERVER=ol_gbasedbt1210_6
ONCONFIG=onconfig.ol_gbasedbt1210_6
GBASEDBTSQLHOSTS=/home/g3001/etc/sqlhosts.ol_gbasedbt1210_6
INFORMIXSQLHOSTS=/home/g3001/etc/sqlhosts.ol_gbasedbt1210_6 GL_USEGLU=1
PATH=${GBASEDBTDIR}/bin:${GBASEDBTDIR}/extend/krakatoa/jre/bin:${PATH}
export GBASEDBTDIR GBASEDBTSERVER ONCONFIG GBASEDBTSQLHOS TS
GL_USEGLU PATH
export GBASEDBTDIR INFORMIXSERVER INFORMIXSQLHOSTS
export GCICLIENTDIR GBASEDBTDIR INFORMIXSERVER ONCONFIG

INFORMIXSQLHOSTS GL_USEGLU PATH export
LD_LIBRARY_PATH=${GBASEDBTDIR}/csdk/lib/dmi:${GBASEDBTDIR}/csdk/lib/c++:${I
NFORMIXDIR}/csdk/lib:${GBASEDBTDIR}/csdk/lib/cli:${GBASEDBTDIR}/csdk
/lib/esql:$ {GCICLIENTDIR}/lib
export ODBCINI=/etc/odbc.ini
export DB_LOCALE=en_us.8859-1 export CLIENT_LOCALE=en_us.8859-1 export
LANG=zh_CN.UTF-8
export GCIVERSION=1



12 GCCI 编程模式

当您使用由程序逻辑补充的游标时,您可解决普通的 SQL 不可解决的问题。这些问题之
一就是部件爆炸问题,有时称为材料单处理。此问题的核心是对象之间的递归关系;一个
对象包含其他对象,其又包含其他对象。
通常以制造库存为例来说明该问题。例如,公司制造各种部件。有些部件是分立的,但有
些是其他部件的组合。
在可能称为 contains 的单个表中说明这些关系。列 contains.parent 持有系组合的部件的部件
编号。列 contains.child 具有为父部件的组件的部件的部件编号。如果部件编号 123400 是
九个部件的组合,则存在九行,123400 在第一列中,其他部件编号在第二列中。下图展示
描述部件编号 123400 的多行中的一行。
图: 部件爆炸问题


部件爆炸问题在于:给定一个部件编号,产生为那个部件的组件的所有部件的列表。下列
示例是一种解决方案的概要,如以 GBase 8s ESQL/C 实现的那样:
int part_list[200];

boom(top_part)
int top_part;
{
long this_part, child_part;
int next_to_do = 0, next_free = 1;

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

part_list[next_to_do] = top_part;

EXEC SQL DECLARE part_scan CURSOR FOR
SELECT child INTO child_part FROM contains
WHERE parent = this_part;
while(next_to_do < next_free)
{
this_part = part_list[next_to_do];
EXEC SQL OPEN part_scan;
while(SQLCODE == 0)
{
EXEC SQL FETCH part_scan;
if(SQLCODE == 0)
{
part_list[next_free] = child_part;
next_free += 1;
}
}
EXEC SQL CLOSE part_scan;
next_to_do += 1;
}
return (next_free - 1);
}
从技术上讲,contains 表的每一行都是有向无环图,或树,的头结点。该函数执行对该树的
宽度优先搜索,树根是作为它的参数传递的部件编号。该函数使用名为 part_scan 的游标返
回在 parent 列中带有特定的值的所有行。最内层的 while 循环打开 part_scan 游标,在选择
集中访存每一行,并当已检索了每一组件的部件编号时,关闭该游标。
此函数解决部件爆炸问题的核心,但该函数不是完整的解决方案。例如,它不允许组件在
树中出现多个级别。此外,实际的 contains 表还会有列count,给出在每一 parent 中使用
的 child 部件的计数。返回每一组件部件的总计数的程序要复杂得多。
之前描述的迭代方法不是解决部件爆炸问题的唯一方法。如果代的数目有固定的限制,则
您可使用嵌套的外部自连接,以单个 SELECT 语句解决该问题。
如果在一个最高级别部件内,可包含最多四代部件,则下列 SELECT 语句返回所有部件:

SELECT a.parent, a.child, b.child, c.child, d.child
FROM contains a
OUTER (contains b,

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

OUTER (contains c, outer contains d) )
WHERE a.parent = top_part_number
AND a.child = b.parent
AND b.child = c.parent
AND c.child = d.parent
此 SELECT 语句为来源于指定为 top_part_number 的祖先的每一行返回一行。对于不存在
的级别,返回 Null 值。
(请使用指示符变量来检测它们。)要将此解决方案扩展到更多级
别,请选择 contains 表的附加的嵌套外部连接。您还可修订此解决方案来返回每一级别上
部件的数目的计数。


“数据库导航”
中,
右键单击Schema 节点下的存储过程节点中的存储过
程,选择菜单中的“刷新”菜单项,将对存储过程进行刷新,如下图所示:

GBaseDataStudio 管理工具手册
南大通用数据技术股份有限公司
- 73 -
图5- 403 刷新存储过程