返回首页

gbase数据、南大通用产品文档:GBase8a使用通配符加载本地文件

更新日期:2024年09月11日

对于URL 中的abs_path,支持通配功能。
URL 的定义格式如下:
file://host +abs_path[,file://host +abs_path] 包含通配字符
示例
LOAD DATA INFILE ‘file://192.168.6.72/var/ftp/pub/line5*.tbl,
file://192.168.6.72/home/gbase/lineitem.*’ INTO TABLE test.t FIELDS
TERMINATED BY ‘|’;

GBase 8s ESQL/C 支持可以保存时间值消息的这两种数据类型:
datetime 数据类型,以时间作为日历日期和时间进行编码。
interval 数据类型,编码一段时间。
下表总了这两种时间数据类型。

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

表 1. ESQL/C 时间数据类型
SQL 数据类型
ESQL/C 数
据类型
C typedef
名称
样本声明
DATETI
ME
datet
ime
dtime
_t
EXEC SQL BEGIN DECLARE
SECTION;
datetime 年销售;

EXEC SQL END DECLARE SECTION;

INTERV
AL
inter
val
intrvl
_t
EXEC SQL BEGIN DECLARE
SECTION;
间隔小时到第二个 test_num;

EXEC SQL END DECLARE SECTION;


头文件 datetime.h 包含 dtime_t 和 intrvl_t 结构,以及可用于组合限定符值的多个
宏定义。将此文件包含在使用任何 datetime 或 interval 主机变量的 C 源文件中:
EXEC SQL include datetime;

decimal.h 头文件定义类型 dec_t,它是 dtime_t 和 intrvl_t 结构的一个组件。

由于这些数据类型的多字性质,
不可能声明一个名为 year 、
month 、
day 、
hour 、
minute 、second 或 fraction 的未初始化的 datetime 或 interval 主机变量:
EXEC SQL BEGIN DECLARE SECTION;
datetime year; /* will cause an error */
datetime year to day year, today; /* ambiguous */
EXEC SQL END DECLARE SECTION;

datetime 或 interval 数据类型存储为十进制数,缩放因子为零,精度等于其限定符
隐含的位数。当您了解精度和尺度时,可以知道存储格式。例如:如果将表列定义为
DATETIME YEAR TO DAY,则它包含四位数年份、两位数月份以及两位数日期,一共有
八位数。因此它被存储为 decimal(8,0)。


GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 125 -
如果基准十进制值的缺省精度不合适,则可以指定不同的精度。例如,如果您有一个
类型为 interval 的主机变量,具有限定符 day to day,则底层的十进制数的缺省精度为两
位。如果有一百天以上的时间间隔,这个精度是不够的。可以指定三位数的精度如下:
interval day(3) to day;
datetime 数据类型
使用 datetime 数据类型为 DATETIME 类型的数据库值声明主机变量。使用限定符
指定 datetime 数据类型的准确性。

例如:以下声明中的限定符是 year to day:
datetime year to day sale;

作为一个主机变量 dtime_t. 结构表示一个 datetime 值:
typedef struct dtime {
short dt_qual;
dec_t dt_dec;
} dtime_t;

dtime 结构和 dtime_t typedef 具有两个部分。下表列出了这些部分。

表 2. dtime 结构中的字段
字段
描述
dt_qu
al
datetime 值的限定符
dt_de
c
datetime 值的字段位数,此字段是 decimal 值。

声明一个 DATETIME 列的主机变量,
其中 datetime 数据类型后面是可选的限定符,
如下所示:
EXEC SQL include datetime;


EXEC SQL BEGIN DECLARE SECTION;
datetime year to day holidays[10];
datetime hour to second wins, places, shows;

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 126 -
datetime column6;
EXEC SQL END DECLARE SECTION;

如果您省略上一个示例中 datetime 主机变量中的限定符,则您的程序必须使
用表 1中显示的宏显式初始化此限定符。
interval 数据类型
使用 interval 数据类型声明 INTERVAL 类型的数据库列的主机变量。

可以使用限定符指定 interval 数据类型的准确性。以下声明中的限定符为 hour to
second:
interval hour to second test_run;

作为一个主机变量 intrvl_t,它表示一个 interval 值:
typedef struct intrvl {
short in_qual;
dec_t in_dec;
} intrvl_t;

intrvl 结构和 intrvl_t typedef 具有两个部分。下表列出了这些部分。

表 3. intrvl 结构中的字段
字段
描述
in_qual
interval 值的限定符
in_dec
interval 值的字段位数,此字段是 decimal 值

声明一个 INTERVAL 列的主机变量,其中 interval 数据类型后面是可选的限定符,
如下所示:
EXEC SQL BEGIN DECLARE SECTION;
interval day(3) to day accrued_leave, leave_taken;
interval hour to second race_length;
interval scheduled;
EXEC SQL END DECLARE SECTION;


GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 127 -
如果您省略上一个示例中 interval 主机变量中的限定符,
则您的程序必须使用以下章
节中描述的宏显式初始化此限定符。
datetime 和 interval 数据类型的宏
除了 datetime 和 interval 数据结构,datetime.h 文件定义了下表中显示的宏函数,
以直接使用二进制形式的限定符。

表 4. datetime 和 interval 数据类型的限定符宏
宏的名称
描述
TU_YEAR
YEAR 限定符字段的实际单位
TU_MONTH
MONTH 限定符字段的实际单位
TU_DAY
DAY 限定符字段的实际单位
TU_HOUR
HOUR 限定符字段的实际单位
TU_MINUTE
MINUTE 限定符字段的实际单位
TU_SECOND
SECOND 限定符字段的实际单位
TU_FRAC
FRACTION 的前导限定符字段的实际单位
TU_Fn
名称为 datetime 结束字段的 FRACTION(n),n 为 1 - 5
TU_START(q)
从限定符 q 返回前导字段数
TU_END(q)
从限定符 q 返回末尾字段数
TU_LEN(q)
返回限定符 q 中位数的长度
TU_FLEN(f)
返回 interval 限定符的第一个字段的位数长度
TU_ENCODE(p,f,t)
从第一个字段数 f 创建一个限定符,其精度为 p ,尾部字段数
为 t
TU_DTENCODE(f,t)
从第一个字段数 f 和尾随的字段数 t 创建一个 datetime 限定

TU_IENCODE(p,f,t)
从第一个字段数 f 和尾随的字段数 t 创建一个 interval 限定
符,其精度为 p ,尾部字段为 t

例如:如果您的程序不在主机变量的声明声明中提供 interval 限定符,您需要使用
interval 限定符宏初始化并设置 interval 主机变量。在以下示例中,interval 变量获得一
个 day to second 限定符,限定符中的最长字段的精度 day 设置为 2:
/* declare a host variable without a qualifier */
EXEC SQL BEGIN DECLARE SECTION;
interval inv1;

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 128 -
EXEC SQL END DECLARE SECTION;


/* set the interval qualifier for the host variable */
inv1.in_qual = TU_IENCODE(2, TU_DAY, TU_SECOND);


/* assign values to the host variable */
incvasc ("5 2:10:02", &inv1);
获取和插入 DATETIME 和 INTERVAL 值
当应用程序获取或插入 DATETIME 或 INTERVAL 值时,GBase 8s ESQL/C 必须确
保主机变量的限定符字段是有效的:
当应用程序将 DATETIME 值提取到 datetime 主机变量或从 datetime 主机变量插
入 DATETIME 值时,必须确保 dtime_t 结构的 dt_qual 字段有效。
当应用程序将 INTERVAL 值提取到 interval 主机变量或从 interval 主机变量插入
INTERVAL 值时,必须确保 intrvl_t 结构的 in_qual 字段有效。
获取和插入到 datetime 主机变量
当应用程序使用 datetime 主机变量获取或插入 DATETIME 值时,
GBase 8s ESQL/C
必须在 datetime 主机变量中找到一个有效的限定符。
GBase 8s ESQL/C 根据与主变量相关
联的 dtime_t 结构中的 dt_qual 字段的值,执行以下操作之一:
当 dt_qual 字段包含有效限定符时,GBase 8s ESQL/C 扩展列值以符合 dt_qual 限定
符。
扩展时添加或删除 DATETIME 值的字段以使其与给定的限定符匹配的操作。您可以
使用 SQL EXTEND 函数和 GBase 8s ESQL/Cdtextend() 函数显式扩展 DATETIME 值。
当 dt_qual 字段不包含一个有效限定符时,GBase 8s ESQL/C 对获取和插入采取不同
的操作:
对于获取,GBase 8s ESQL/C 使用 DATETIME 列值和其限定符初始化 datetime 主
机变量。

(0)
是无效的限定符。
因此,
如果将 dt_qual 字段设置为零,
则可以确保 GBase 8s
ESQL/C 使用 DATETIME 列的限定符。

对于插入,GBase 8s ESQL/C 不能执行插入或修改操作。
GBase 8s ESQL/C 将 SQLSTATE 状态变量设置为一个错误类代码(SQLCODE 设置
为负值),并且 DATETIME 列上的修改和插入操作失败。

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 129 -
获取和插入到 interval 主机变量
当应用程序使用 interval 主机变量获取或插入 INTERVAL 值时,GBase 8s ESQL/C
必须在 interval 主机变量中找到一个有效的限定符。GBase 8s ESQL/C 根据与主变量相关
联的 intrvl_t 结构中的 in_qual 字段的值,执行以下操作之一:
当 in_qual 字段包含有效限定符时,GBase 8s ESQL/C 检查它与来自 INTERVAL 列
值的限定符的一致性。
如果它们属于同一 interval 类 year to month 或 day to fraction,则这两个限定符是
符合的。如果限定符不符合,则 GBase 8s ESQL/C 将 SQLSTATE 状态变量设置为错误类
代码(以及 SQLCODE 设置为负值),并且选择、修改或插入操作失败。

如果限定符符合但不一样,
则 GBase 8s ESQL/C 扩展列的值以符合 in_qual 限定符。
扩展时添加或删除 INTERVAL 的 interval 类值的字段以使其与给定的限定符匹配的操作,
可以使用 GBase 8s ESQL/Cinvextend() 函数显式扩展 INTERVAL 值。

当 in_qual 字段不包含有效的限定符时,GBase 8s ESQL/C 对获取或插入采取不同的
操作:
对于获取,
如果 in_qual 字段包含零或是一个无效的限定符,
则 GBase 8s ESQL/C 使
用 INTERVAL 列值及其限定符初始化 interval 主机变量。
对于插入,如果 in_qual 字段与 INTERVAL 列不一致或如果它没有包含有效值,则
GBase 8s ESQL/C 不会执行插入或修改操作。
GBase 8s ESQL/C 将 SQLSTATE 状态变量设置为一个错误类代码(SQLCODE 设置
为负值),并且 INTERVAL 列上的修改和插入操作失败。
隐式数据转换
可以将 DATETIME 或 INTERVAL 列值获取到字符(char 、string 或 fixchar)主
机变量。 GBase 8s ESQL/C 在它将其存储在字符主机变量之前将 DATETIME 或
INTERVAL 列值主或为字符字符串。
该字符字符串符合 DATETIME 和 INTERVAL 值的
ANSI SQL 标准。如果主机变量太短,则 GBase 8s ESQL/C 将 sqlca.sqlwarn.sqlwarn1 设
置为 W,使用星号(*)填充主机变量,并将任何指示变量设置到不需截断字符字符串的
长度。

还可以从字符(char 、string 、 fixchar 或 varchar)主机变量插入 DATETIME 或
INTERVAL 列值。GBase 8s ESQL/C 使用列值的数据类型和限定符将字符值转换为
DATETIME 或 INTERVAL 值。
它希望字符串包含符合 ANSI SQL 标准的 DATETIME or
INTERVAL 值。


GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 130 -
如果转换失败,则 GBase 8s ESQL/C 将 SQLSTATE 状态变量设置为一个错误类代
码(SQLCODE 设置为负值),并且修改和插入操作失败。
重要: GBase 8s 产品不支持从 DATETIME 和 INTERVAL 列值到数字(double 、
int 等)
主变量的自动数据转换。
GBase 8s 产品也不支持从数字
(double 、
int 等)
或 date
主机变量到 DATETIME 和 INTERVAL 列值的自动数据转换。
DATETIME 和 INTERVAL 值的 ANSI SQL 标准
ANSI SQL 标准指定 DATETIME 和 INTERVAL 值的字符表示法的限定符和格式。
DATETIME 值的标准限定符是 YEAR TO SECOND,标准格式如下:
YYYY-MM-DD HH:MM:SS

INTERVAL 值的标准指定下列两种间隔类:
YEAR TO MONTH 类具有格式:YYYY-MM
该格式的子集也有效:例如,只有月间隔。
DAY TO FRACTION 类具有格式:DD HH:MM:SS.F
连续字段的任何子集也是有效的:例如,MINUTE TO FRACTION。
转换 datetime 值的数据
可以使用 GBase 8s ESQL/C 库函数 dtcvasc() 、
dtcvfmtasc() 、
dttoasc() 和 dttofmtasc()
显式在 DATETIME 列值和字符串之间转换。

例如,
可以使用 GBase 8s ESQL/C 库函数和中间字符串在 DATETIME 和 DATE 日
期类型之间执行转换。

将 DATETIME 值转换为 DATE 值:
使用 dtextend() 函数将 DATETIME 限定符调整为 year to day。
应用 dttoasc() 函数创建 yyyy-mm-dd 格式的字符字符串。
使用模式参数 yyyy-mm-dd 的 rdefmtdate() 函数将字符串转换为 DATE 值。
转换 interval 值的数据
可以使用 GBase 8s ESQL/C 库函数 incvasc() 、
incvfmtasc() 、
intoasc() 和 intofmtasc()
显式在 INTERVAL 列值和字符字符串之间转换。

例如,
可以使用 GBase 8s ESQL/C 库函数和中间字符串在 DATETIME 和 DATE 日
期类型之间执行转换。


GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 131 -
将 DATE 值转换为 DATETIME 值:
声明具有限定符 year to day 的主机变量(或使用
TU_DTENCODE(TU_YEAR,TU_DAY) 宏返回的值初始化限定符)。
使用具有 yyyy-mm-dd 模式的 rfmtdate() 函数将 DATE 值转换为字符字符串。
使用 dtcvasc() 函数将字符字符串转换为之前预备好的 DATETIME 变量中的值。
如有必要,使用 dtextend() 函数调整 DATETIME 限定符。

SUMMARY_STATIO_ALL_TABLES 视图将包含GBase 8c 内汇聚的数据库中每个表
(包
括TOAST 表)的I/O 的统计。
名称
类型
描述
schemaname
name
该表模式名。
relname
name
表名。

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
1051
名称
类型
描述
heap_blks_read
numeric
从该表中读取的磁盘块数。
heap_blks_hit
numeric
此表缓存命中数。
idx_blks_read
numeric
从表中所有索引读取的磁盘块数。
idx_blks_hit
numeric
表中所有索引命中缓存数。
toast_blks_read
numeric
此表的TOAST 表读取的磁盘块数(如果存在)。
toast_blks_hit
numeric
此表的TOAST 表命中缓冲区数(如果存在)。
tidx_blks_read
numeric
此表的TOAST 表索引读取的磁盘块数(如果存在)。
tidx_blks_hit
numeric
此表的TOAST 表索引命中缓冲区数(如果存在)。