返回首页

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

更新日期:2024年09月11日

Important: 不是所有 UNIX 环境都适用前面的表格中操作系统(os)的字长描
述。例如,某些 U 版本可运行在 64 位操作系统上。类似地,有些 F 版本可运
行在支持 64 位应用的带有 32 位内核的操作系统上。
下列示例展示如何使用 SELECT 语句中的 DBINFO 的 'version' 选项来检索 DB-
Access 客户端连接到的数据库服务器的主要版本号:
SELECT DBINFO('version', 'major')
FROM systables
WHERE tabid = 1;
下列表格展示此查询的结果:
(constant)
7
使用 'serial8' 和 'bigserial' 选项
'bigserial' 和 'serial8' 选项分别返回指定插入到了表内的最后的
SERIAL8 或 BIGSERIAL 值的单个整数。要确保有效的结果,请紧跟

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1410
在插入 SERIAL8 或 BIGSERIAL 值的 INSERT 语句之后使用此选
项。
提示: 要获取被插入到表内的最后 SERIAL 值的值,请使用 DBINFO( ) 的
'sqlca.sqlerrd1' 选项。要获取更多信息,请参阅 使用 'sqlca.sqlerrd1' 选
项。
下列示例使用 'serial8' 选项:
EXEC SQL CREATE TABLE fst_tab
(ordernum SERIAL8, partnum INT);
EXEC SQL CREATE TABLE sec_tab (ordernum SERIAL8);

EXEC SQL INSERT INTO fst_tab VALUES (0,1);
EXEC SQL INSERT INTO fst_tab VALUES (0,4);
EXEC SQL INSERT INTO fst_tab VALUES (0,6);

EXEC SQL INSERT INTO sec_tab
SELECT dbinfo('serial8')
FROM fst_tab WHERE partnum = 6;
此示例将包含主键 SERIAL8 值的行插入到 fst_tab 表内,并使用 DBINFO 函数
来将相同的 SERIAL8 值插入到 sec_tab 表内。DBINFO 函数返回的值是被插入
到 fst_tab 内的最后一行的 SERIAL8 值。在随后行中的子查询包含 WHERE 子
句,因此返回单个值。
SQLCA 结构不记录由触发器插入的 serial 值。您不可以 'bigserial' 选项调用
DBINFO 函数来返回由表上的触发器的触发器活动直接地插入了的最近的
BIGSERIAL 值(视图上的 INSTEAD OF 触发器的也不可返回)。出于同样的原
因,DBINFO ('serial8') 函数不可返回由表上的触发器插入了的 SERIAL8 值,由
视图上的 INSTEAD OF 触发器也不可返回。
使用 'get_tz' 选项
'get_tz' 选项返回展示当前会话的时区的 $TZ 字符串。
下列示例在 stores_demo 数据库的 cust_calls 表的查询中使用 'get_tz' 选
项:

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1411
EXEC SQL select first call_dtime, dbinfo('get_tz')
from cust_calls where customer_num = 106;
此示例返回会话时区的字符串值以及 customer_num 值为 106 的
cust_calls 表中的第一个 call_dtime 值。
使用 'utc_current' 选项
'utc_current' 选项返回“全球标准时间”(UTC)的当前值,作为展示在
1970-01-01 00:00:00+00:00 与当前 SQL 语句开始执行时刻之间已消耗
了的秒数的整数值。
“全球的时间”(UT)从地球的旋转计算持续的秒数。UTC 不是这样,
UTC 基于高精度原子时钟使用固定长度的秒数。
由于地球逐渐地减小的旋转速度的变化,在 UTC 中一次又一次地引入
闰年跳跃秒数来减少与 UT 时间的差异。在缺省情况下, GBase 8s 忽
略在 DATETIME 和 INTERVAL 算术中的跳跃秒数。然而,当采用跳
跃秒数的操作系统支持 GBase 8s 时,在操作系统为跳跃秒数调整系统
时钟之后,在后续的 DATETIME 和 INTERVAL 操作中反映跳跃秒
数。
使用 'utc_to_datetime' 选项
考虑到数据库服务器的时区,DBINFO 函数的 'utc_to_datetime' 选项将
UTC 秒数返回到服务器会生成的 DATETIME 值,如果 UNIX™
time( ) 系统调用返回了秒参数的值的话。
'utc_to_datetime' 选项将它的最后的参数强制转型为 DATETIME 值,
该参数必须是表示“全球标准时间”(UTC)的数值表达式。如果这求值
为带有小数部分的数值,则忽略任何小数的秒。
在下列第一个示例中,最后一个参数是表示为字面整数的 UTC 值。在
第二个示例中,最后一个参数是指定存储 UTC 值的整数列的列表达

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1412
式。在两个示例中,DBINFO 都将 UTC 值强制转型为数据库服务器的
时区中的 DATETIME 值:
DBINFO ('utc_to_datetime', 1299912999 )
DBINFO ('utc_to_datetime', timesheet.utc_checkin )
如果最后一个参数的值是负的,则该函数从较早的 UNIX epoch 返回
DATETIME 值,如下例中所示:
SELECT DBINFO("utc_to_datetime", -2134567890.91234)
FROM 'sysmaster:"gbasedbt".sysdual';
此查询返回 DATETIME 值 1902-05-12 08:28:30。
这些示例时间都假设服务器在特定的时区中。下列查询返回四个
DATETIME 值:
SELECT
DBINFO('utc_to_datetime', -32767) AS min_smallint,
DBINFO('utc_to_datetime', +32767) AS max_smallint,
DBINFO('utc_to_datetime', 1299912999),
DBINFO("utc_to_datetime", -2134567890.91234)
FROM 'sysmaster:"gbasedbt".sysdual';
这些是从 United States Pacific 时区中的服务器返回的 DATETIME 值:
1969-12-31 06:53:53 1970-01-01 01:06:07
2011-03-11 22:56:39 1902-05-12 01:28:30
# Server running in TZ=US/Pacific
这些是从 UTC0 时区中的服务器从同一查询返回的 DATETIME 值:
1969-12-31 14:53:53 1970-01-01 09:06:07
2011-03-12 06:56:39 1902-05-12 08:28:30
# Server running in TZ=UTC0
请注意,第三个 DBINFO 结果中的 DAY 组件对于 United States Pacific 时区
与对于 UTC0 时区是不同的,因为这那两个时区之间有 8 小时的偏移量。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1413
对于时间中的点,数据库服务器时区可类似地影响从其他表达式的返回值,诸如
CURRENT、SYSDATE 和 TODAY,其 DATETIME YEAR TO SECOND 或
DATE 表示依赖于服务器的时区。
指数和对数函数
指数和对数函数至少有一个参数,且返回 FLOAT 数据类型。
指数和对数函数有下列语法。
指数和对数函数

元素
描述
限制
语法
float_expression
EXP、LN、LOGN 或 LOG10 函数
的一个参数。要了解这些函数中
float_expression 的含义,其
参阅后面几页上每一函数的单独
的标题。
该域是实数
集,且范围
是正实数集
表达

EXP 函数
EXP 函数返回数值表达式的指数。
下列示例为 angles 表的每一行返回 3 的指数:
SELECT EXP(3) FROM angles;
对于此函数,基数始终为 e,自然对数的基数,如下例所示:
e=exp(1)=2.718281828459
当您想要使用自然对数的基数作为基数值时,请使用 EXP 函数。如果您想要指
定特定的值来升至特定的幂,其参阅 POW 函数。
LN 函数

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1414
LN 函数是 LOGN 函数的别名,返回数值参数的自然对数。此值与指数值相
反。
LN 函数

下列查询为 history 表中的每一行返回 population 的自然对数:
SELECT LN(population) FROM history WHERE country='US' ORDER BY date;
LOG10 函数
LOG10 函数返回以 10 为基数的对数。下列示例为 travel 表的每一行返回距离
的以 10 为基数的对数:
SELECT LOG10(distance) + 1 digits FROM travel;
LOGN 函数
LOGN 函数返回数值参数的自然对数。
此返回值与 EXP 函数从同一参数返回的指数值相逆。
下列查询为 history 表的每一行返回 population 的自然对数:
SELECT LOGN(population) FROM history WHERE country='US'
ORDER BY date;
NVL2 函数
当第一个参数不为 NULL 时,返回第二个参数。如果第一个参数为 NULL,则
返回第三个参数。
NVL2 函数

NVL2 函数是下列代码的同义词:
CASE WHEN expression IS NOT NULL
THEN result-expression
ELSE else-expression

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1415
HEX 函数
HEX 函数返回整数表达式的十六进制编码。
HEX 函数

元素
描述
限制
语法
int_expression
您想要等同的十六进
制的表达式
必须是文字整数或返回整数
的某个其他表达式
表达

下一示例显示十六进制格式的 orders 表的列的数据类型和列长度。 对于 MONEY
和 DECIMAL 列,您可从最低的和次低的字节确定精度和范围。对于 VARCHAR 和
NVARCHAR 列,您可从最低的和次低的字节来确定最小空间和最大空间。 要获取
更多关于编码的信息的信息,请参阅 GBase 8s SQL 参考指南。
SELECT colname, coltype, HEX(collength)
FROM syscolumns C, systables T
WHERE C.tabid = T.tabid AND T.tabname = 'orders';
下列示例罗列当前数据库中所有表的名称以及十六进制格式的对应的 tblspace
编号。
SELECT tabname, HEX(partnum) FROM systables;
十六进制编号中两个最高有效字节构成 dbspace 编号。它们在 GBase 8s 中的
oncheck 输出中标识该表。
HEX 可在表达式上操作,如下一示例所示:
SELECT HEX(order_num + 1) FROM orders;
长度函数
使用长度函数来确定字符列、字符串或变量的长度,或字符表达式返回的值的长
度,或逻辑字符的数目(对于多字节语言环境中的 CHAR_LENGTH)。
长度函数

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1416

元素
描述
限制
语法
column
table 中列的名称
必须有字符数据类型
标识符
table
指定的列在其中的表
的名称
必须存在
标识符
variable 包含字符串的主变量
或 SPL 变量
必须有字符数据类型
请参阅名称的特
定于语言的规
则。
这些函数的每一个都有明确的用途:

LENGTH (又称为 LEN)

OCTET_LENGTH

CHAR_LENGTH(又称为 CHARACTER_LENGTH)
LENGTH 函数
LENGTH 函数(又称为 LEN)返回字符列中的字节数,但不包括任何末尾的空
格。
对于 BYTE 或 TEXT 列,LENGTH 返回全部字节数,包括任何末尾的空格。
在 GBase 8s ESQL/C 中,LENGTH 还可返回字符变量的长度。
下列示例说明 LENGTH 函数的使用:
SELECT customer_num, LENGTH(fname) + LENGTH(lname),
LENGTH('How many bytes is this?')
FROM customer WHERE LENGTH(company) > 10;
下一示例通过该函数的其他名称 LEN 调用它:
EXECUTE FUNCTION LEN("www.ibm.com");

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1417
上面的 SQL 语句返回整数值 11。
另请参阅 GBase 8s GLS 用户指南 中 LENGTH 的讨论。
OCTET_LENGTH 函数
OCTET_LENGTH 返回字符列中的字节数,包括任何末尾的空格。另请参阅
GBase 8s GLS 用户指南。
CHAR_LENGTH 函数
CHAR_LENGTH 函数返回在它的参数中的逻辑字符的数目,该参数可为字符
列、字符变量或引用的字符串。还可调用此内建的函数作为
CHARACTER_LENGTH。
在缺省的 U.S. English 语言环境和其他单字节语言环境中,CHAR_LENGTH 的
行为正像 LENGTH 函数一样,并返回在它的参数中的字节数。
然而,对于支持各种 Unicode、东亚和其他非缺省的语言环境的多字节代码集,
返回值可小于该参数中的字节数。要获取此函数的讨论,请参阅 GBase 8s GLS
用户指南。
安全标签支持函数
安全标签支持函数使得用户能够操纵安全标签。可以三种不同的方式引用安全标
签:

名称,如在 CREATE SECURITY LABEL 或 RENAME SECURITY
LABEL 语句中声明的那样。

安全标签的安全策略的每一组件的值的列表。

IDSSECURITYLABEL 数据类型存储的内部的编码的值。
这些函数可在不同形式的安全标签之间转换。它们通常用于指定 DML 操作的标
签,这些操作处理那些由基于标签的访问控制(LBAC)保证安全的数据行。然
而,与通过调用该函数的用户的安全凭证已提供的访问相比,在这些操作中,安
全标签支持函数不提供针对受保护的数据任何更多的访问。
安全标签支持函数

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1418

元素
描述
限制
语法
column
类型
IDSSECURITYLABEL 的

必须存在并必须存储
policy 的一个标签
标识符
component
policy 的组件的值
必须存在且必须为 policy
的一个组件
引用字符

element
component 的值的列表
内的值
必须存在且必须为 policy
的单个组件的元素
引用字符

label
该函数返回其值的安全
标签的标识符
必须存在且必须为 policy
的一个标签
引用字符

policy
由该函数返回其值的安
全标签支持的安全策略
必须存在且必须为保证该表
安全的安全策略
引用字符

这些函数返回指定的安全策略的安全标签。 可在引用受保护的数据库表的 DML
语句内使用它们,但它们还可在其他调用上下文中求值为安全标签。每一这些函
数需要不同的参数列表:

SECLABEL_TO_CHAR 需要安全策略名称以及返回
IDSSECURITYLABEL 对象的表达式,诸如那种数据类型的列的名称。

SECLABEL_BY_COMP 需要安全策略名称以及该安全标签的个别组件
的值。

SECLABEL_BY_NAME 需要安全策略和安全标签的名称。
SECLABEL_BY_NAME 函数
SECLABEL_BY_NAME 函数使得用户能够通过指定安全标签的名称来直接提供
它。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1419
下列 INSERT 语句将一行插入到表 T1 内,该表受到名为 ‘MegaCorp’ 的安全策
略的保护。 INSERT 语句的 VALUES 子句为通过使用 SECLABEL_BY_NAME 语句
要被插入的行提供安全标签 ‘mylabel’。
INSERT INTO T1 VALUES (SECLABEL_BY_NAME ('MegaCorp', 'mylabel'), 1,
'xyz');
此 SECLABEL_BY_NAME 函数调用的成功并不保证在此示例中 INSERT 操作
的成功,因为 MegaCorp 安全策略的 IDSLBACWRITE 规则影响到该用户是否
有充足的安全凭证来将标签 mylabel 插入到该行内。
SECLABEL_BY_COMP 函数
SECLABEL_BY_COMP 函数返回 IDSSECURITYLABEL 对象,其为它的内部
编码的字符串格式的安全标签。此函数使得用户能够通过指定它的组件值直接地
提供安全标签。
如果安全标签组件需要多个值,则可通过将那些值放在圆括号之间来指定这样的
多个值,比如 (value_1, value_2, ...)。当特定的安全标签中的组件需要
为空时,可通过在左圆括号和右圆括号之间什么都不放来指定它,比如 ()。由于
在安全组件的元素之中,空格(ASCII 32)是有效的字符,因此出现在安全标签
字符串中的任何空格都作为那个组件的元素值的一部分来处理。
安全标签字符串被限定为最大 32 KB。如果该字符串长度超出此限制,则返回错
误。
下列 INSERT 语句将一行插入到表 T1 内,该表受到名为 ‘MegaCorp’ 的安全策
略保护,该策略有三个组件:'level'、'compartments' 和 'groups'。在此,用户为
由指定 SECLABEL_BY_COMP 函数被插入的行提供安全标签。在此示例中,对于
level 组件,安全标签有值 'VP',对于 compartments 组件,安全标签有值
'Marketing',对于 groups 组件,安全标签有值 'West'。在 SECLABEL_BY_COMP
的参数中,冒号符号分隔这些安全组件元素值,且引号定界安全标签的组件值的
列表。
INSERT INTO T1 VALUES (SECLABEL_BY_COMP ('MegaCorp',
'VP:Marketing:West'), 1, 'xyz';
在下一示例中,INSERT 语句在表 T1 中插入一行,该表受到同一 MegaCorp 安
全策略的保护,该策略有与前面的示例相同的三个组件:level、compartments

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1420
和 groups。用户为通过指定该策略名称要被插入的行提供安全标签,以及安全组
件元素的列表作为 SECLABEL_BY_COMP 函数的参数。在此,对于 level 组件,安
全标签有值 'Director',对于 compartments 组件,安全标签有值 'HR' 和
'Finance',对于 groups 组件,安全标签有值 'East' 。
INSERT INTO T1 VALUES (SECLABEL_BY_COMP ('MegaCorp',
'Director:(HR,Finance):East'), 1, 'xyz');
下列示例将一行插入到表 T1 内,该表受到 MegaCorp 安全组件的保护,其三个
组件为 level、compartments 和 groups。SECLABEL_BY_COMP 函数为要被插入的
行指定安全标签。在此示例中,对于 level 组件,安全标签有值 'CEO',对于
compartments 组件,安全标签为空集,对于 groups 组件,安全标签有值
'EntireRegion'。
INSERT INTO T1 VALUES (SECLABEL_BY_COMP ('MegaCorp',
'CEO:():EntireRegion'), 3, 'abc');
如在所有这些示例中那样,SECLABEL_BY_COMP 函数调用的成功不保证
INSERT 语句的成功,因为在数据库服务器允许或拒绝对于插入新行的访问之
前,首先要使用 MegaCorp 安全策略的 IDSLBACRWRITE 规则,将用户的安全
凭证与保护表 T1 的安全标签进行对比。
SECLABEL_TO_CHAR 函数
SECLABEL_TO_CHAR 函数返回一个安全标签字符串格式的安全标签。
执行此函数的用户的安全凭证可影响该函数的输出。如果用户没有对那个元素的
读访问权限,则在输出中不包括安全标签组件的元素。如果用户提供对该数据的
读访问的安全凭证,由仅包含那个元素而没有其他元素的安全标签保护数据,则
用户有对该元素的访问权限。
对于规则集 IDSLBACRULES,仅类型 TREE 的组件可包含用户没有对元素的
子集的读访问权限的元素。对于其他类型组件,如果任何元素阻止读访问,则用
户根本不可读该行。因此,仅类型 TREE 的安全组件可有以此方式排除的安全组
件元素的子集。
例如,如果用户的安全标签的 TREE 类型组件为 {A},且行安全标签的 TREE
类型组件为 {A, B},则仅返回组件 A,且用户感觉不到在行安全标签中存在 B。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1421
然而,如果用户持有 IDSLBACREADTREE 规则上的豁免,则返回的安全组件
为 A 和 B。
在下一示例中,MegaCorp 安全策略有名为 mylabel 的安全标签,该标签由其值
为 'Director' 的 level 组件,以及带有值 'HR' 和 'Finance' 的
compartments 组件组成。被授予了 ‘mylabel’ 的用户已将带有那个安全标签
的一行插入到表 T1 内。在此上下文中,在下列 T1 上的 SELECT 语句中,由
SECLABEL_TO_CHAR 函数返回的安全标签字符串如下。
SELECT SECLABEL_TO_CHAR ('MegaCorp’, C1) FROM T1;
Row returned:
'Director:(HR,Finance)'
由于数据库服务器允许对安全策略名称和安全标签组件的值的读访问,根据
MegaCorp 安全策略的 IDSLBACREAD 规则,此查询的成功说明
SECLABEL_TO_CHAR 函数成功,且该用户的安全凭证是充分的。
限定安全标签字符串的最大大小为 32 KB。如果要被返回的安全标签字符串的长
度超出此上限,则发出警告,且返回截断了的 32 KB 字符串。
SIGN 函数
SIGN 函数返回参数的符号的指示符。
SIGN 函数

如果参数小于零,则返回 -1。如果参数等于零,则返回 0。如果参数大于零,
则返回 1。返回的结果始终是这些值之一的整数。
智能大对象函数
智能大对象函数支持 BLOB 和 CLOB 数据类型的对象:
智能大对象函数有下列语法:
智能大对象

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1422
元素
描述
限制
语法
BLOB_column、
CLOB_column
类型 BLOB 的列;类
型 CLOB 的列
column 数据类型必须
为 BLOB 或 CLOB
标识符
column
table 内 BLOB 或
CLOB 值的副本的列
必须有 CLOB 或 BLOB
作为它的数据类型
引用字
符串
file_destination
在其上放置或获取智
能大对象的系统
有效的值仅为字符串
'server' 或
'client'
引用字
符串
pathname
定位智能大对象的目
录路径和 filename
不超过 256 字节。在
file_destination 系
统上必须存在。另请
参阅 带逗号的
pathname。
引用字
符串
table
包含 BLOB 或 CLOB
值的副本的 column
的表
以逗号(不是句号)
分隔 'table' 和
'column' 参数
引用字
符串
FILETOBLOB 和 FILETOCLOB 函数
FILETOBLOB 函数为存储在指定的操作系统文件中的数据创建 BLOB 值。类似
地,FILETOCLOB 函数为存储在操作系统文件中的数据值创建 CLOB 值。
这些函数从下列参数来确定要使用的操作系统文件:

pathname 参数标识源文件的目录路径和名称。

file destination 参数标识此文件所在的计算机,'client' 或
'server':
o 将 file destination 设置为 'client' 来标识客户端计算机作为源文
件的位置。pathname 既可是完整路径也可是当前目录的相对路径。
o 将 file destination 设置为 'server' 来标识服务器计算机作为源文
件的位置。pathname 必须为完整路径。
table 和 column 参数是可选的:

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1423

如果您省略 table 和 column,则 FILETOBLOB 函数以系统指定的存
储缺省值来创建 BLOB 值,且 FILETOCLOB 函数以系统指定的存储
缺省值来创建 CLOB 值。
这些函数从 ONCONFIG 文件或从 sbspace 获取系统特定的存储特征。
要获取更多关于系统指定的存储缺省值的信息,请参阅 GBase 8s 管理
员指南。

如果您指定 table 和 column,则 FILETOBLOB 和 FILETOCLOB 函
数为它们创建的 BLOB 或 CLOB 值使用来自指定的列的存储特征。
FILETOBLOB 返回一个指向新的 BLOB 值的句柄值(指针)。类似地,
FILETOCLOB 返回一个指向新的 CLOB 值的句柄值。两个参数都不实际地将
智能大对象值复制到数据库列内。您必须将 BLOB 或 CLOB 值指定到适当的
列。
当 FILETOCLOB 函数将文件从客户端或服务器计算机复制到数据库时,它执行
任何可能需要的代码集转换。
下列 INSERT 语句使用 FILETOCLOB 函数来从 smith.rsm 文件中的值创建
CLOB:
INSERT INTO candidate (cand_num, cand_lname, resume)
VALUES (2, 'Smith', FILETOCLOB('smith.rsm', 'client'));
在前面的示例中,FILETOCLOB 函数读取客户端计算机上当前目录中的
smith.rsm 文件,并返回一指向包含此文件中的数据的 CLOB 值的句柄值。由于
FILETOCLOB 函数未指定表和列名称,此新的 CLOB 值有系统指定的存储特
征。然后,该 INSERT 语句将此 CLOB 值指定给 candidate 表中的 resume
列。
下列 INSERT 语句使用 FILETOBLOB 函数从本地数据库服务器上的 photos.xxx
文件中的值创建 BLOB 值,并将那个值插入到 rdb 数据库的 election2008 表
内,其为本地数据库服务器的另一数据库:
INSERT INTO rdb@:election2008 (cand_pic)
VALUES (FILETOBLOB('C:\tmp\photos.xxx', 'server',
'candidate', 'cand_photo'));
在前面的示例中,FILETOBLOB 函数读取本地数据库服务器上指定的目录中的
photos.xxx 文件,并返回指向此包含文件中的数据的 BLOB 值的句柄值。然后,

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1424
该 INSERT 语句将此 BLOB 值指定到本地数据库服务器的 rdb 数据库中的
election2008 表中的 cand_pic 列。此新的 BLOB 值有本地数据库中的
candidate 表中的 cand_photo 列的存储特征。
在下列示例中,新的 BLOB 值有 rdb2 数据库中的 election96 表中的 cand_pix
列的存储特征,在此,rdb1 和 rdb2 是本地 GBase 8s 实例的数据库:
INSERT INTO rdb1:election2008 (cand_pic)
VALUES (FILETOBLOB('C:\tmp\photos.xxx', 'server',
'rdb2:election96', 'cand_pix'));
当您以远程数据库和远程数据库服务器的名称限定 FILETOBLOB 或
FILETOCLOB 函数时,pathname 和 file destination 成为对远程数据库服务器
的相对值。
当您指定 server 作为文件目的地时,如下例所示,FILETOBLOB 函数在远程数据
库服务器上查找源文件(在此情况下,为 photos.xxx):
INSERT INTO rdb@rserv:election (cand_pic)
VALUES (rdb@rserv:FILETOBLOB('C:\tmp\photos.xxx', 'server'));
然而,当您指定 client 为文件目的地时,如下例所示,FILETOBLOB 函数在本地
客户端计算机上查找源文件(在此情况下,为 photos.xxx):
INSERT INTO rdb@rserv:election (cand_pic)
VALUES (rdb@rserv:FILETOBLOB('photos.xxx', 'client'));
带逗号的 pathname
如果逗号(,)符号在函数的 pathname 内,则数据库服务器期望该 pathname 有
下列格式:
"offset, length, pathname"
对于包含逗号的 pathname,您还必须指定偏移量和长度,如下例所示:
FILETOBLOB("0,-1,/tmp/blob,x","server");
引用的 pathname 字符串中的第一个术语是 offset 0,其指导数据库服务器在该文
件的开头开始读。
第二个术语是 length -1,其指导数据库服务器继续读,直到整个文件的结尾为
止。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1425
第三个术语是 /tmp/blob,x pathname,指定读哪个文件。(请注意在 x 前面的逗
号。)
由于 pathname 包括逗号,因此当调用 FILETOBLOB 时,在此示例中以逗号分
隔的 offset 和 length 规范是避免错误所必要的。您不需要为不包括逗号但包括
0、-1 的 pathname 指定 offset 和 length,作为 pathname 字符串的初始字符以
避免任何有效的 pathname 的此类错误。
LOTOFILE 函数
LOTOFILE 函数将智能大对象复制到操作系统文件。
第一个参数指定要复制的 BLOB 或 CLOB 列。该函数从下列参数确定要创建什么
文件:

pathname 标识目录路径和源文件名称。

file destination 标识此文件在其上的计算机,'client' 或
'server':
o 设置 file destination 为 'client' 来标识客户端计算机作为源文
件的位置。pathname 可为完整的 pathname 或相对于当前目录的路
径。
o 设置 file destination 为 'server' 来标识服务器计算机作为源文
件的位置。要求完整的 pathname。
在缺省情况下,LOTOFILE 函数生成这种形式的 filename:
file.hex_id
在此格式中,file 是您在 pathname 中指定的 filename,而 hex_id 是唯一的十六
进制智能大对象标识符。智能大对象标识符的最大位数为 17。然而,大多数智能
大对象可能有位数较少的标识符。
例如,假设您指定 UNIX™ pathname 值如下:
'/tmp/resume'
如果 CLOB 列有标识符 203b2,则 LOTOFILE 创建文件:
/tmp/resume.203b2
对于另一示例,假设您指定 Windows™ pathname 值如下:

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1426
'C:\tmp\resume'
如果 CLOB 列有标识符 203b2,则 LOTOFILE 函数会创建文件:
C:\tmp\resume.203b2
要更改缺省的 filename,您可在 pathname 的 filename 中指定下列通配符:

在 filename 中的一个或多个连续的问号(?)可生成唯一的 filename。
LOTOFILE 函数以来自 BLOB 或 CLOB 列的标识符的十六进制数字替
换每一问号。
例如,假设您指定 UNIX pathname 值如下:
'/tmp/resume??.txt'
LOTOFILE 函数将十六进制标识符的 2 位数字放到该名称内。如果
CLOB 列有标识符 203b2,则 LOTOFILE 函数会创建文件:
/tmp/resume20.txt
如果您指定多于 17 个问号,则 LOTOFILE 忽略它们。

filename 末尾的叹号(!)表示 filename 不需要是唯一的。
例如,假设您指定 Windows pathname 值如下:
'C:\tmp\resume.txt!'
LOTOFILE 函数不使用 filename 中的智能大对象标识符,因此它生成下
列文件:
C:\tmp\resume.txt
如果您指定的 filename 已存在,则 LOTOFILE 返回错误。
当 LOTOFILE 函数将 CLOB 值从数据库复制到客户端或服务器计算机上的文
件时,它执行任何可能需要的代码集转换。
当您以远程数据库和远程数据库服务器的名称限定 LOTOFILE 时,BLOB 或
CLOB 列、pathname 和 file destination 成为对远程数据库服务器的相对值。
当您指定 server 作为文件目的地时,如下一示例中那样,LOTOFILE 函数将智能
大对象从远程数据库服务器复制到在远程数据库服务器上指定目录中的源文件:

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1427
rdb@rserv:LOTOFILE(blob_col, 'C:\tmp\photo.gif!', 'server')
如果您指定 client 作为文件目的地,如在下例中那样,则 LOTOFILE 函数将智
能大对象从远程数据库服务器复制到本地客户端计算机上指定的目录中的源文
件:
rdb@rserv:LOTOFILE(clob_col, 'C:\tmp\essay.txt!', 'client')
LOCOPY 函数
LOCOPY 函数创建智能大对象的一个副本。
第一个参数指定要复制的 BLOB 或 CLOB 列。table 和 column 参数是可选的。

如果您省略 table 和 column 参数,则 LOCOPY 函数以系统指定的存储
缺省值创建智能大对象,并将 BLOB 或 CLOB 列中的数据复制到它之
内。
LOCOPY 函数从 ONCONFIG 文件或 sbspace 获取系统特定的存储缺
省值。要获取更多关于系统指定的存储缺省值的信息,请参阅 GBase 8s
管理员指南。

当您指定 table 和 column 时,LOCOPY 函数为它创建的 BLOB 或
CLOB 值从指定的 column 使用存储特征。
LOCOPY 函数返回指向新的 BLOB 或 CLOB 值的句柄值(一个指针)。此函
数不是 实际地将新的智能大对象值存储到数据库中的列内。您必须将该 BLOB
或 CLOB 值指定到适当的列。
下列 GBase 8s ESQL/C 代码片段将 candidate 表的 resume 列中的 CLOB 值复
制到 interview 表的 resume 列:
/* Insert a new row in the 在 interviews 表中插入新行并
* (从 sqlca.sqlerrd[1])获得结果 SERIAL 值
*/
EXEC SQL insert into interviews (intrv_num, intrv_time)
values (0, '09:30');
intrv_num = sqlca.sqlerrd[1];

/* 以 candidate 编号更新此 interviews 行
* 并从 candidate 表恢复。使用 LOCOPY 来
* 在 candidate 表的 resume 列中
* 创建 CLOB 值的副本。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1428
*/
EXEC SQL update interviews
SET (cand_num, resume) =
(SELECT cand_num,
LOCOPY(resume, 'candidate', 'resume')
FROM candidate
WHERE cand_lname = 'Haven')
WHERE intrv_num = :intrv_num;
在前面的示例中,LOCOPY 函数为 candidate 表中的 CLOB resume 列的副本
返回句柄值。由于 LOCOPY 函数指定表和列名称,因此这个新的 CLOB 值有
此 resume 列的存储特征。如果您省略表(candidate)和列(resume)名称,则
LOCOPY 函数为新的 CLOB 值使用系统定义的存储缺省值。然后,UPDATE
语句将这个新的 CLOB 值指定到 interviews 表中的 resume 列。
在下列示例中,在本地数据库上执行 LOCOPY 函数并在本地服务器上为 rdb 中的
election2008 表中的 BLOB cand_pic 列的副本返回句柄值,rdb 是本地数据库
服务器的另一数据库。然后,INSERT 语句将这个新的 BLOB 值指定到本地的
candidate 表中的 cand_photo 列。
INSERT INTO candidate (cand_photo)
SELECT LOCOPY(cand_pic) FROM rdb:election2008;
当在与分布式查询中原始的 BLOB 或 CLOB 列一样的数据库服务器上执行
LOCOPY 函数时,函数产生 BLOB 或 CLOB 值的两个副本,一个在远程数据
库中,另一个在本地数据库中,如下列两个示例所示。
在第一个示例中,在远程 rdb 数据库上执行 LOCOPY 函数,并为远程
election2008 表中的 BLOB cand_pic 列的副本在远程服务器中返回句柄值。然
后,INSERT 语句将这个新的 BLOB 值指定到本地 candidate 表中的 cand_photo
列:
INSERT INTO candidate (cand_photo)
SELECT rdb:LOCOPY(cand_pic) FROM rdb:election2008;
在第二个示例中,在本地数据库上执行 LOCOPY 函数,并为本地 candidate 表中
的 BLOB cand_photo 列的副本在本地数据库上返回句柄值。然后,该 INSERT
语句将这个新的 BLOB 值指定到远程 rdb 数据库中 election2008 表中的
cand_pic 列:

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1429
INSERT INTO rdb:election2008 (cand_pic)
SELECT LOCOPY(cand_photo) FROM candidate;
内建的 LOCOPY 函数的 BLOB 和 CLOB 参数是内建的 opaque 数据类型。这
些可为由跨数据库 DML 操作返回的值,或为跨数据库函数调用返回的值,但内
建的 opaque 类型不支持跨数据库服务器实例的分布式操作。如果本地数据库与
rdb 数据库是不同的 GBase 8s 实例的数据库,则在前面的两个示例中的
INSERT 语句失败并报错 -999。
时间函数
GBase 8s 的时间函数接受 DATE 或 DATETIME 参数,或 DATE 或
DATETIME 值的字符表示。它们通常返回 DATE 或 DATETIME 值,或将它们
从 DATE 或 DATETIME 值抽取的信息转换为字符串或整数。
另请参阅在 代数函数 部分中的 ROUND 和 TRUNC 函数的描述,其可更改
DATE 或 DATETIME 值的精度。
时间函数


GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1430
元素
描述
限制
语法
char_expression 要被转换为 DATE
或 DATETIME 值
的表达式
必须为文字、主变量、
表达式或字符数据类型
的列
表达式
date/dtime_expr 返回 DATE 或
DATETIME 值的表
达式
可为主变量、表达式、
列或常量。
表达式
day
返回该月的天数
的表达式
必须返回 > 0 但不大于
指定的月中天数的整数
表达式
first
结果中的最大时
间单位。如果您
省略 first 和
last,则缺省的
first 是 YEAR。
必须是指定不小于 last
的时间单位的 DATETIME
限定符关键字
DATETIME
字段限定

format_string
包含第一个参数
的格式掩码的字
符串
必须为指定有效的格式
的字符数据类型。可为
列、主变量、表达式或
常量
引用字符

integer
指定月的整数的
表达式
必须求值为正的或负的
整数
表达式
last
结果中的最小时
间单位
必须是指定不小于
first 的时间单位的
DATETIME 限定符关键字
DATETIME
字段限定

month
表示月的数值的
表达式
必须求值为取值范围从
1 至 12(包括1 和
12)的整数
表达式
non_date_expr
表示要被转换为
DATE 数据类型的
值的表达式
通常是一个表达式,该
表达式返回可被转换为
DATE 数据类型的
表达式

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1431
元素
描述
限制
语法
CHAR、DATETIME 或
INTEGER 值的表达式
num_expr
求值为实数值的
表达式
必须返回数值数据类型
表达式
weekday
星期几的缩写名

包含星期几的有效缩写
的字符数据类型
引用字符

year
表示年份的数值
表达式
必须求值为 4 位整数。
您不可使用 2 位缩写。
表达式
source_char
要被转换为
DATETIME 值的源
字符串
设置为空字符串或NULL
时,返回结果为空。
引用字符

fmt
DATETIME 类型的
格式化字符串
设置为空字符串或NULL
时,返回结果为空。
引用字符

ADD_MONTHS 函数
ADD_MONTHS 函数采用 DATETIME 或 DATE 表达式作为它的第一个参数,
并需要第二个参数指定要添加到第一个参数值上的月数。第二个参数可为正的或
负的。
返回的值是基于第二个参数指定的月数,作为 INTERVAL UNITS MONTH 值的
第一个参数的 DATE 或 DATETIME 值的总和。
返回的数据类型依赖于第一个参数的数据类型:

如果第一个参数求值为 DATE 值,则 ADD_MONTHS 返回 DATE
值。

如果第一个参数求值为 DATETIME 值,则 ADD_MONTHS 返回
DATETIME YEAR TO FRACTION(5) 值,对于时间单位小于 day 的,其
值与第一个参数中的相同。
如果在第一个参数中的 day 和 month 时间单位指定该月的最后一天,或如果结
果月的天数少于第一个参数中的 day,则返回的值为结果月的最后一天。否则,
返回的值与第一个参数为该月的同一天。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1432
如果结果月晚于第一个参数中那年的十二月(或对于负的第二个参数,早于一
月),则返回的值可在不同的年份中。
下列查询使用列表达式作为参数,在 Projection 子句中调用 ADD_MONTHS 函
数两次。在此,列名称表明列数据类型,且 DBDATE 设置为 MDY4/:
SELECT a_serial, b_date, ADD_MONTHS(b_date, a_serial),
c_datetime, ADD_MONTHS(c_datetime, a_serial)
FROM mytab WHERE a_serial = 7;
在此示例中,ADD_MONTHS 返回 DATE 和 DATETIME 值:
a_serial 7
b_date 07/06/2007
(expression) 02/06/2008
c_datetime 2007-10-06 16:47:49.00000
(expression) 2008-05-06 16:47:49.00000
如果您使用主变量来存储 ADD_MONTHS 的参数,但在准备时刻不知道该参数的数
据类型,则 GBase 8s 假设数据类型为 DATETIME YEAR TO FRACTION(5)。如
果在运行时刻,在已准备了该语句之后,用户为主变量提供 DATE 值,则数据库
服务器发出错误 -9750。要防止此错误,请通过使用强制转型来指定主变量的数
据类型,如在此程序片断中所示:
sprintf(query, ",
"select add_months(?::date, 6) from mytab");
EXEC SQL prepare selectq from :query;
EXEC SQL declare select_cursor cursor for selectq;
EXEC SQL open select_cursor using :hostvar_date_input;
EXEC SQL fetch select_cursor into :var_date_output;

CURRENT_DATE 函数
返回会话时区中的当前日期。
CURRENT_DATE 函数

返回的值是当前日期的日期值。
下列函数返回当前的日期。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1433
current_date()
如果在 2012 年 12 月 2 日调用了此函数,则返回的值会是 2012-12-02。
DATE 函数
DATE 函数将它的参数转换为 DATE 值。
它的非 DATE 参数可为可转换为 DATE 值的任何表达式,通常是 CHAR、DATETIME
或 INTEGER 值。下列 WHERE 子句指定引用的字符串作为它的 CHAR 参数:
WHERE order_date < DATE('12/31/07')
当 DATE 函数解释一 CHAR 非 DATE 表达式时,它期望此表达式符合任何 DBDATE
环境变量指定的 DATE 格式。例如,假设当您执行下列查询时,DBDATE 设置为
Y2MD/:
SELECT DISTINCT DATE('02/01/2008') FROM ship_info;
此 SELECT 语句生成错误,因为 DATE 函数不可转换此字符串表达式。DATE
函数将该日期字符串的第一部分(02)解释为年份,第二部分(01)为月份。
对于第三部分(2008),当 DATE 函数期望两位的日期(有效的日期值必须介
于 01 与 31 之间)时,它遇到了四位数字。因此,它不可转换该值。对于要以
DBDATE 的 Y2MD/ 值成功地执行的 SELECT 语句,该参数需要为 '08/02/01'。
要获取关于 DBDATE 的格式的信息,请参阅 GBase 8s SQL 参考指南。
要获取那些可指定 DATE 值的显示和数据条目格式的 GBase 8s 环境变量之中优
先级顺序的信息,请参阅主题 DATE 和 DATETIME 格式规范的优先顺序。
当您为非 DATE 表达式指定正的 INTEGER 值时,DATE 函数将此解释为 1899
年 12 月 31 日之后的天数。
如果整数值为负的,则 DATE 函数将该值解释为 1899 年 12 月 31 日之前的天
数。下列 WHERE 子句为非 DATE 表达式指定 INTEGER 值:
WHERE order_date < DATE(365)
数据库服务器搜索 order_date 值小于 1900 年 12 月 31 日(其为 12/31/1899
加上 365 天)的行。
DAY 函数

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1434
DAY 函数采用 DATE 或 DATETIME 参数,并返回该月的日期作为取值范围从
1 至当前月中天数的一个整数。
下列语句片段调用带有 CURRENT 函数的作为参数的 DAY 函数,比较 order_date
列值与该月的当前日期:
WHERE DAY(order_date) > DAY(CURRENT)
LOCAL_TIMESTAMP 函数
在数据类型 TIMESTAMP 的值中返回会话时区中的当前日期和时间。
LOCAL_TIMESTAMP 函数

此函数与 CURRENT_TIMESTAMP 之间的不同在于,LOCALTIMESTAMP 返回
TIMESTAMP 值,而 CURRENT_TIMESTAMP 返回 TIMESTAMP WITH TIME
ZONE 值。
MONTH 函数
MONTH 函数返回对应于它的 DATE 或 DATETIME 参数的 month 部分的整
数。
像 DAY、YEAR、WEEKDAY 和 QUARTER 内建的时间函数一样,MONTH
函数从作为它的参数的单个 DATE 或 DATETIME 表达式抽取信息。返回值是在
日历年中月份序列内 month 的顺序位置。例如,在 9 月 23 日,该函数表达式
MONTH(TODAY) 返回 9。
下列示例返回取值范围从 1 至 12 的一个数值来表示下订单的月份:
SELECT order_num, MONTH(order_date) FROM orders;
QUARTER 函数
QUARTER 函数返回一个取值范围从 1 至 4 的整数,对应于包括它的 DATE
或 DATETIME 参数的那个日历年的季度。
例如,一月、二月或三月中的任何日期都返回整数 1。
该参数必须为求值为 DATE 或 DATETIME 数据类型的表达式。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1435
QUARTER 函数表达式的示例
下列函数表达式返回 3,因为八月在一年中的第三个季度中。
QUARTER('2014-08-25')
下列示例返回取值范围可从 1 至 4 的一个数值,来表明下订单时的季度:
SELECT order_num, QUARTER(order_date) FROM orders;
下列查询包括 QUARTER 函数表达式,其参数为 order_date 列和 CURRENT 运
算符。WHERE 子句将结果集限定为 order_date 值所在季度早于当前年当前季度
的那些行:
SELECT * FROM orders
WHERE (QUARTER(order_date) < QUARTER(CURRENT))
AND YEAR(order_date) = YEAR(CURRENT);
然而,在第一季度期间,此查询不返回行,因为从小于当前季度的季度里,不可
有数据。也就是说,没有值为零的季度。
WEEKDAY 函数
WEEKDAY 函数接受 DATE 或 DATETIME 参数,并返回取值范围从 0 至 6
代表星期几的整数。
作为返回值,零(0)代表星期天,一(1)代表星期一,以此类推。
下列查询返回与当前日期相同的星期几支付了的所有订单:
SELECT * FROM orders
WHERE WEEKDAY(paid_date) = WEEKDAY(CURRENT);
YEAR 函数
YEAR 函数采用 DATE 或 DATETIME 参数,并返回表示该年的四位整数。
下列示例罗列了其 ship_date 早于当前年初的订单:
SELECT order_num, customer_num FROM orders
WHERE year(ship_date) < YEAR(TODAY);
类似地,由于 DATE 值是一个简单的日历日期,您不可以一个其 last 限定符小
于那个 DAY 的 INTERVAL 值来加上或减去一个 DATE 值。在此情况下,请
将 DATE 值转换为 DATETIME 值。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1436
MONTHS_BETWEEN 函数
MONTHS_BETWEEN 函数接受两个 DATE 或 DATETIME 表达式参数,并返
回一个带符号的 DECIMAL 值,该值量化这些参数之间的月数间隔,就好像
month 是时间的单位一样。
此函数需要两个参数,每一参数可为 DATE 表达式或 DATETIME 表达式。
返回的值为 DECIMAL 数据类型,表示两个参数之间的差异,表达为基于 31 天
为单位的 DECIMAL 值。如果第一个参数是晚于第二个参数的时间点,则返回的
值的符号为正。如果第一个参数早于第二个参数,则返回的值的符号为负。如果
两个参数相等,则返回值为零。
如果两个参数的日期都是一个月的同一天,或都是一个月的最后一天,则结果为
整数。否则,基于一个月 31 天,来计算结果的小数部分。此小数部分还可包括
hour、minute 和 second 时间单位中的差异,除非两个参数都是 DATE 表达
式。
下列查询使用通过 TO_DATE 表达式作为参数返回的两个 DATE 值,调用
Projection 子句中的 MONTHS_BETWEEN 函数。
SELECT MONTHS_BETWEEN(TO_DATE('2-2-2005', '%m-%d-%Y'),
TO_DATE('1-1-2005', '%m-%d-%Y'))
AS lunations FROM systables WHERE tabid = 1;
该查询返回的值表示两个 DATE 参数之间有 32 天的差异,作为 31 天月份的正
值:
months
1.03225806451613
下一示例将 DATETIME 列表达式参数返回到 MONTHS_BETWEEN 表达式,以及对
于表的两行,它们的以月计算的差异:
SELECT d_datetime, e_datetime,
MONTHS_BETWEEN(d_datetime, e_datetime) AS months_between
FROM mytab1;

d_datetime 2007-11-01 09:00:00.00000
e_datetime 2007-12-07 14:30:12.12345
months_between -1.2009453405018

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1437
d_datetime 2007-12-13 09:40:30.00000
e_datetime 2007-11-13 08:40:30.00000
months_between 1.00000000000000
在此,第一个 MONTHS_BETWEEN 结果包括以小于天的时间单位计的差异。第二个
结果没有小数部分,因为两个参数的 day 时间单位有相同的值。
下一示例中的 MONTHS_BETWEEN 表达式比较 DATE 与 DATETIME 值:
SELECT col_datetime, col_date, MONTHS_BETWEEN(col_datetime,
col_date) AS months_between
FROM mytab2;
col_datetime 2008-12-13 08:40:30.00000
col_date 11/13/2007
months_between 13.0000000000000
由于两个参数指定该月的同一天,因此结果没有小数部分。
LAST_DAY 函数
LAST_DAY 函数需要一个 DATE 或 DATETIME 表达式作为它的唯一参数。它
返回它的参数指定的那个月的最后一天的日期。
此返回的值的数据类型与参数的数据类型相同。返回的值与参数之间的差为那个
月剩余的天数。
下列查询返回当前日期的 DATE 表示、当前月中最后一天的日期,以及当前月中
最后一天之前的天数(由第二个 DATE 值减去第一个计算):
SELECT TODAY AS today, LAST_DAY(TODAY) AS last,
LAST_DAY(TODAY) - TODAY AS days_left
FROM systables WHERE tabid = 1;
如果在 2008 年 3 月 12 日发出了该查询,以 MDY4/ 作为缺省的语言环境的
DBDATE 设置,则它会返回下列信息:
today last days_left
03/12/2008 03/31/2008 19
在此示例的 SELECT 语句中,在 Projection 子句中 TODAY 运算符与标识符
today 之间没有名称冲突,因为 AS 关键字向 GBase 8s 表明 today 为一显示标
签。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1438
如果您使用主变量来存储 LAST_DAY 的参数,但在准备时刻不知道该参数的数据
类型,则 GBase 8s 假设该数据类型为 DATETIME YEAR TO FRACTION(5)。如
果在运行时刻,在已准备了该语句之后,用户为该主变量提供 DATE 值,则发出
错误 -9750。要防止发生此错误,请通过使用强制转型来指定该主变量的数据类
型,如在此程序片段中所示:
sprintf(query, ",
"select last_day(?::date) from mytab");
EXEC SQL prepare selectq from :query;
EXEC SQL declare select_cursor cursor for selectq;
EXEC SQL open select_cursor using :hostvar_date_input;
EXEC SQL fetch select_cursor into :var_date_output;
NEXT_DAY 函数
NEXT_DAY 函数返回晚于它的第一个 DATE 或 DATETIME 参数的最早的日
期,并落在它的第二个参数指定的星期几上。第二个参数是三个 ASCII 字符的加
引号的字符串,是星期几的英文名称缩写。
NEXT_DAY 函数需要两个参数:

求值为早于该返回值的日期的 DATE 或 DATETIME 表达式。

至少三个 ASCII 字符的字符串,对应于取值范围从 ASCII 65 至 ASCII
90 的大写字母。这三个字母编码为星期几的英文名称缩写。
成功地执行此函数,返回满足两个条件的最早的日历日期:

该日期晚于第一个参数指定的日期。

该日期落在第二个参数指定的星期几上。
NEXT_DAY 接受下列星期几的缩写字符串:
星期
缩写
星期
缩写
星期日
'SUN'
星期三
'WED'
星期一
'MON'
星期四
'THU'
星期二
'TUE'
星期五
'FRI'


星期六
'SAT'

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1439
忽略跟在这些缩写字符串的第三个字符之后的任何字符。例如,对于第二个参
数,'MONDAY' 和 'MONTAG' 都是有效的规范,每一都指定在第一个参数的日
期之后的星期一。然而,如果第二个字符串的前三个字符不与上表中星期缩写之
一相匹配,比如 'MODNAY', 则 GBase 8s 发出错误。
例如,下列查询包括有效的 NEXT_DAY 表达式:
SELECT ship_date, NEXT_DAY(ship_date, 'SAT') AS next_saturday,
NEXT_DAY(ship_date, 'SAT') - ship_date AS num_days FROM orders;
此查询的结果集可能包括来自 orders 表的下列数据:
ship_date next_saturday num_days
06/01/2006 06/03/2006 2
02/12/2007 02/17/2007 5
05/31/2007 06/02/2007 2
05/23/2007 05/26/2007 3
由 NEXT_DAY 返回的值与第一个参数有相同的数据类型。如果此参数为 DATE
类型,则 NEXT_DAY 返回 DATE 值。如果第一个参数为 DATETIME 类型,
则 NEXT_DAY 返回 DATETIME YEAR TO FRACTION(5) 值。
由于在前面示例中的 ship_date 是 DATE 列,所以返回的日期格式化为 DATE
值,而不是 DATETIME 格式。
如果您使用主变量来存储 NEXT_DAY 的参数,但在准备时刻不知道该参数的数据
类型,则 GBase 8s 假设该数据类型为 DATETIME YEAR TO FRACTION(5)。如果在
运行时刻,在已准备了该语句之后,用户为主变量提供 DATE 值,则发出错误 -
9750。要避免这种错误,请使用强制转型来指定该主变量的类型,如此程序片段
中所示:
sprintf(query, ", "select next_day(?::date, 'SUN') from mytab");
EXEC SQL prepare selectq from :query;
EXEC SQL declare select_cursor cursor for selectq;
EXEC SQL open select_cursor using :hostvar_date_input;
EXEC SQL fetch select_cursor into :var_date_output;
EXTEND 函数
EXTEND 函数调整 DATETIME 或 DATE 值的精度。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1440
作为它的第一个参数的 DATETIME 或 DATE 表达式不可为 DATE 值的加引号
的字符串表示。
如果您未指定 first 和 last 限定符,则缺省的限定符为 YEAR TO
FRACTION(3)。
如果表达式包含未通过时间单位限定符指定的字段,则丢弃那些字段。
如果 first 限定符指定比表达式中存在的更大的(即,更多有效位的)时间单
位,则以 CURRENT 函数返回的值填充新的字段。如果 last 限定符比表达式中
存在的更小的(即,更少有效位的)时间单位,则以常量值填充新的字段。以 1
填充丢失的 MONTH 或 DAY 字段,且以 0 填充丢失的 HOUR 或 FRACTION
字段。
在下列表达式中,EXTEND 调用返回带有 YEAR TO SECOND 表达式的 call_dtime
列值:
EXTEND (call_dtime, YEAR TO SECOND)
您可使用 EXTEND 函数来执行 DATETIME 值与没有相同时间单位限定符的
INTERVAL 值的加法或减法。下一表达式将文字的 DATETIME YEAR TO DAY
值扩展为 YEAR TO MINUTE 精度,因而可从它减去间隔的 YEAR TO MINUTE
值:
EXTEND (DATETIME (2009-8-1) YEAR TO DAY, YEAR TO MINUTE)
- INTERVAL (720) MINUTE (3) TO MINUTE
您可使用 EXTEND 函数来选择性地更新 DATETIME 值中时间单位的子集。在下
一示例中的 UPDATE 语句仅更新 DATETIME YEAR TO MINUTE 列中的 hour
和 minute 时间单位值。
UPDATE cust_calls SET call_dtime = call_dtime -
(EXTEND(call_dtime, HOUR TO MINUTE) - DATETIME (11:00)
HOUR TO MINUTE) WHERE customer_num = 106;
从由 EXTEND 返回的 DATETIME HOUR TO MINUTE 值中减去 11:00 生成一个正的
或负的 INTERVAL HOUR TO MINUTE 值。从 call_dtime 列中原始的值减去此差
异,在 cust_calls.call_dtime 列中将更新的 hour 和 minute 时间单位值强制
为 11:00。
MDY 函数

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1441
MDY 函数将表示 month、day 和 year 的三个整数表达式作为它的参数,并返
回类型 DATE 值。

第一个参数表示月份的数值(1 至 12)。

第二个参数表示该月的日期的数值(1 至 28、29、30 或 31,与月份相
对应)。

第三个参数表示 4 位的年份。您不可使用 2 位缩写。
UPDATE 语句中 MDY 函数的示例
下列示例更新 orders 表中的一行,将其采购订单号为 8052 的 paid_date 列值
更改为当前月的第一天:
UPDATE orders SET paid_date = MDY(MONTH(TODAY), 1, YEAR(TODAY))
WHERE po_num = '8052';
在此,MDY 函数的第一个和最后一个参数是返回对应于当前的 month 和 year 的
整数的时间表达式。第二个参数指定该月的日期为以文字整数。颠倒此示例中前
两个参数的顺序,会将 paid_date 更改为当前年的 1 月 13 日之前的某一天,
除非同一应用还包括了错误检查代码,标识那个时期过早,不是有效的。
GBASE_TO_CHAR 函数
GBASE_TO_CHAR 函数将一求值为 DATE、DATETIME 或数值值的表达式转
换为字符串。
返回的字符串表示第一个参数指定的数据值,使用第二个参数在 format_string 中
定义的格式掩码,可包括特殊的格式符号和文字字符。

此函数的第一个参数必须为 DATE、DATETIME 或内建的数值数据类
型,或可转换为这些数据类型之一的字符串。如果初始的 DATE、
DATETIME 或数值参数的值为 NULL,则该函数返回 NULL 值。

此函数的第二个参数是指定格式掩码的字符串。哪些特殊的字符适合于格
式掩码,主要依赖于 GBASE_TO_CHAR 函数的第一个参数是表示时间
点还是数值。
格式化 DATE 和 DATETIME 表达式
format_string 参数不需要隐含与 GBASE_TO_CHAR 函数的第一个参数中的值
相同的时间单位。当 format_string 中隐含的精度与第一个参数中的 DATETIME

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1442
限定符不同时,GBASE_TO_CHAR 函数扩展 DATETIME 值,就如同它已调用
了 EXTEND 函数。
在下列示例中,用户想要将 tab1 表的 begin_date 列转换为字符串。
begin_date 列定义为 DATETIME YEAR TO SECOND 数据类型。用户使用带有
GBASE_TO_CHAR 函数的 SELECT 语句来执行此转换:
SELECT GBASE_TO_CHAR(begin_date, '%A %B %d, %Y %R') FROM tab1;
此示例的 format_string 中的符号有下列含义。
符号 含义
%A 完整的星期名称,如在语言环境中定义的那样
%B 完整的月份名称,如在语言环境中定义的那样
%d 以整数(01 至 31)表示的该月的日期。在单一位的值之前添零
(0)。
%Y 4 位十进制数值的年份
%R 24 小时表示法的时间(等同于 %H:%M 格式,如下面定义的那样)。
请注意,在上例中紧跟在 %d 格式规范之后的逗号(,)是文字字符,而不是
GBASE_TO_CHAR 函数的参数的分隔符。第二个参数是引号括起的字符串
'%A %B %d, %Y %R',定义 TO_CHAR 返回的值中表示第一个参数的格式掩
码。
将此 format_string 应用于 begin_date 列值,返回此结果:
Wednesday July 25, 2013 18:45
下例中的查询调用 TO_CHAR 来将同一格式字符串应用于 ADD_MONTHS 表达式,并
展示该查询的结果:
SELECT ship_date, GBASE_TO_CHAR(ADD_MONTHS(ship_date, 1),
'%A %B %d, %Y')
AS survey_date FROM orders;
ship_date 03/12/2013
survey_date Thursday April 12, 2013
在以上的查询输出中,

根据 DB_DATE 环境变量设置格式化 ship_date 值,

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1443

并根据 GBASE_TO_CHAR 函数的 '%A %B %d, %Y %R' 格式字符串
参数格式化 survey_date 值。
对于 DATE 或 DATETIME 值,在 GBASE_TO_CHAR 函数的 format_string
参数中附加的有效字符包括下列。
符号 含义
%a 缩写的星期名称,如在语言环境中定义的那样
%b 缩写的月份名称,如在语言环境中定义的那样
%C 表示为整数(00 至 99)的世纪数值(年份除以 100 并截断为整数)
%D 与 %m/%d/%y 格式相同
%e 数值表示的该月的日期(1 至 31)。单一位值之前添加一空格。
%Fn 秒的小数部分的值,由无符号的整数 n 指定精度。n 的缺省值为 2;n
的范围为 0 ≤ n ≤ 5。此值覆盖在 % 与 F 字符之间指定的任何宽度或精
度。
%h 与 %b 格式相同:缩写的月份名称,如在语言环境中定义的那样
%H 2 位整数表示的小时(00 至 23)(24 小时时钟)
%I 2 为整数表示的小时(00 至 11)(12 小时时钟)
%m 整数表示的月份(01 至 12)。任何单一位值之前添加零(0)。
%M 2 位整数表示的分钟(00 至 59)
%S 2 位整数表示的秒(00 至 61)。秒值可达到 61(而不是 59),以允
许偶然的跳跃秒或双跳跃秒。
%T %H:%M:%S 格式的时间
%w 数值表示的星期(0 至 6);0 表示等同于星期日的语言环境。
%y 2 位十进制数值表示的年份。
例如,假设在 2013 年 8 月 23 日,DB-Access 实用程序发出了下列查询:
SELECT GBASE_TO_CHAR(CURRENT YEAR TO FRACTION(5),
"%Y-%m-%d %H:%M:%S.%F")
FROM sysmaster:sysdual;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1444
在此示例中,格式字符串参数以下列文字字符作为 DATETIME 字段值之间的分隔
符指定用户格式:

ASCII 45 ( - ) 连字符分隔年、月和日值

ASCII 32 ( ) 空格分隔开日期与小时

ASCII 58 ( : ) 冒号分隔时、分和秒

ASCII 46 ( . ) 句号分隔秒与秒的小数部分。
这是以指定的 DATETIME 用户格式返回的值:
(expression) 2013-08-23 13:15:53.00
当 DATETIME 或 DATE 表达式是第一个参数时,如果您省略 format_string
参数,则 TO_CHAR 函数使用 DBTIME 或 DBDATE 环境变量的设置作为缺省
值,来格式化在第一个参数中表示的值。在非缺省的语言环境中,通过诸如
GL_DATETIME 和 GL_DATE 这样的环境变量指定 DATETIME 和 DATE 值的
缺省格式。
重要: 对于其精度包括 SECOND 和 FRACTION 数据值的 DATETIME 用户格
式,连接那些字段,除非在 %S 与 %F 格式伪指令之间显式地定义分隔符字符。
在版本 11.70.xC7 以及更早的 GBase 8s 产品中,在缺省情况下, %F 伪指令在
SECOND 与 FRACTION 字段值之间插入了 ASCII 46 字符(.)。然而,在此产
品中,%F 伪指令为隐含缺省的分隔符。
要了解那些可为内建的按时间顺序排列的数据类型指定显示和数据条目格式的
GBase 8s 环境变量之中的优先顺序,请参阅主题 DATE 和 DATETIME 格式规
范的优先顺序。
格式化数值的和 MONEY 表达式
GBASE_TO_CHAR 函数的 format_string 参数支持与 ESQL 函数使用的相同的
数值格式掩码,比如 rfmtdec( )、rfmtdouble( ) 和 rfmtlong( )。 在 GBase 8s
ESQL/C 程序员手册 中,是对数值值(当将数值表达式格式化为字符串时)的
GBase 8s 数值格式掩码的详尽描述。以下是数值格式掩码的简短总结描述。
当将数值表达式格式化为字符串时,数值格式掩码指定应用于某数值值的格式。
此掩码是下列格式化字符的组合:
符号 含义

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1445
* 此字符以星号填充本来为空的显示字段中的任何位置
& 此字符以零填充本来为空的显示字段中的任何位置
# 此字符将开始的零更改为空格。使用此字符来指定字段向左边的最大扩
展。
< 此字符对显示字段总的数值进行左调整。它将开始的零更改为 NULL 字
符串。
, 此字符表明在值的整数部分按三位一组(从单位位置向左数)分隔的符
号。在缺省情况下,此符号为逗号。您可以 DBMONEY 环境变量设置该
符号。在格式化了的数值中,仅当该值的整数部分有四位或更多位时才出
现此符号。
. 此字符表明将货币值的整数部分与小数部分分隔的符号。在缺省情况下,此
符号为句号。您可以 DBMONEY 环境变量设置该符号。在格式字符串中,
您仅可有一个句号。
-
此字符为文字字符。当 expr1 小于零时,它作为负号出现。当您将一行中
的几个负号(-)分组时,单个负号浮动到它可占据的最右边的位置;它不
影响数值及其币种符号。
+ 此字符为文字字符。当 expr1 大于或等于零时,它作为正号出现。当您在
将一行中的几个正号分组时,单个加号或减号浮动到它可占据的最右边的位
置;它不影响数值及其币种符号。
( 此字符为文字字符。它作为负数值的左边的左圆括号(()出现。它是替换
负数的减号的一对会计圆括号之一。当您对一行中的几个分组时,单个左圆
括号浮动到它可占据的最右边的位置;它不影响数值及其币种符号。
) 这是替换负值的减号的一对会计圆括号之一。
$ 此字符显示在数值值前面的币种符号。在缺省的语言环境中,币种符号是
美元号($)。您可以 DBMONEY 环境变量设置非缺省的币种符号。当您
将一行中的几个美元号分组时,单个币种符号浮动到它可占据的最右边的
位置;它不影响该数值。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1446
在 GBASE_TO_CHAR 函数返回的格式化的值中,按字面重新产生格式掩码中
的任何其他字符。
在下面的三个示例中,GBASE_TO_CHAR 的 d_int 列表达式参数的值为 -
12344455。
此查询在 GBASE_TO_CHAR 的调用中未指定格式掩码:
SELECT GBASE_TO_CHAR(d_int) FROM tab_numbers;
下列表格展示此 SELECT 语句的输出。
(expression)
-12344455
下列查询指定货币格式掩码:
SELECT GBASE_TO_CHAR(d_int, "$*********.**") FROM tab_numbers;
下列表格展示此 SELECT 语句的输出。
(expression)
$12344455.00
SELECT GBASE_TO_CHAR(d_int, "-$*********.**") FROM tab_numbers;
该查询返回 - $12344455.00。
SELECT GBASE_TO_CHAR(12344455,"-$*********.**") FROM tab_numbers;
下列表格展示此 SELECT 语句的输出。
(constant)
$12344455.00
应用来自格式掩码参数的币种($)符号,但减号(-)不起作用,因为第一个参
数的值大于零。
请注意,当 GBASE_TO_CHAR 函数的第一个参数是 DATE 或 DATETIME 表
达式时,它是时间表达式,或是可被格式化为 DATE 或 DATETIME 表达式的字
符串。然而,当它的第一个参数是数值或货币值时,GBASE_TO_CHAR 返回那
个参数的值的字符串形式,但它不返回时间表达式。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1447
TO_CHAR 函数
TO_CHAR 函数将一求值为 DATE、DATETIME 或数值值的表达式转换为字符
串。
语法


元素
描述
限制
语法
date/dtime_expr 返回 DATE 或
DATETIME、
TIMESTAMP 值的
表达式
可为主变量、表达式、
列或常量。
表达式
format_string
指定的格式化字
符串
必须为指定有效的格式
的字符数据类型。可为
列、主变量、表达式或
常量
引用字符

num_expr
要转换为字符串
的数值型数据
可为主变量、表达式、
列或常量。
表达式

TO_CHAR(datetime):转换日期型表达式
TO_CAHR(datetime)将日期类型 DATE、DATETIME、TIMESTAMP 表达式转
换为 format_string 参数中指定格式的 VARCHAR 类型值。
对于日期数据类型,TO_CHAR 函数的 format_string 参数有效的日期元素如
下:
元素
含义(范围)
/ - , . :
标点符号在结果中重新复制

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1448
元素
含义(范围)
YYYY
4 位的年份
YY
年份的最后 2 位数字
MM
月份(01-12)
DD
月中的某一天(01—31)
HH、HH12
12 小时制(00—12)
HH24
24 小时制(00—24)
MI
分(00——59)
SS
秒(00—59)
FF[n]
亚秒,n 的取值范围为1—6
缺省的转换形式为:YYY-MM-DD HH:MI:SS。
示例
SELECT TO_CHAR(SYSDATE, "YYYYMMDD") FROM DUAL;
返回结果为:20180520
SELECT TO_CHAR(SYSDATE, "YYYY-MM-DD HH24:MI:SS") FROM DUAL;
返回结果为:2018-05-20 14:30:28
SELECT TO_CHAR(SYSDATE, "YYYY/MM/DD HH:MI:SS") FROM DUAL;
返回结果为:2018/05/20 02:30:30
TO_CHAR(number):转换数值型表达式
TO_CAHR(number)将数值型数据num_expr 转换为 format_string 参数指定的
格式的字符串。
其用法与 GBASE_TO_CHAR() 函数的转换数值表达式为字符串的用法相同。具
体信息,请参见 GBASE_TO_CHAR() 函数。
GBASE_TO_DATE 函数

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1449
GBASE_TO_DATE 函数将字符串转换为 DATETIME 值。该函数根据
format_string 第二个参数指定的日期格式,将 char_expression 第一个参数求值
为日期,并返回等同的日期。
如果 char_expression 为 NULL,则返回 NULL 值。
GBASE_TO_DATE 函数的任何参数都必须为内建的数据类型。
如果您省略 format_string 参数,则 GBASE_TO_DATE 函数将缺省的
DATETIME 格式应用于该 DATETIME 值。通过 GL_DATETIME 环境变量指
定缺省的 DATETIME 格式。
在下列示例中,用户想要将字符串转换为 DATETIME 值,以便以转换了的值来更
新 tab1 表的 begin_date 列。begin_date 列定义为 DATETIME YEAR TO SECOND
数据类型。用户使用包含 GBASE_TO_DATE 函数的 UPDATE 语句来实现此结果:
UPDATE tab1
SET begin_date = GBASE_TO_DATE('Wednesday July 25, 2007
18:45','%A %B %d, %Y %R');
在此示例中的 format_string 参数告诉 GBASE_TO_DATE 函数如何格式化
begin_date 列中转化了的字符串。要获取展示在此格式字符串中每一格式符号的
作用的表格,请参阅 TO_CHAR 函数。
TO_DATE 函数
TO_DATE 函数将字符串转换为 DATETIME 数据类型。支持转换的字符型数据
包括:CHAR、VARCHAR2、NCHAR 或 NVARCHAR2。
TO_DATE 函数有此语法:
TO_DATE 函数

元素
描述
限制
语法
source_char
要被转换为
DATETIME 类型的源
字符串。
设置为空字符串或NULL
时,返回结果为空
引用字符


GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1450
元素
描述
限制
语法
fmt
DATETIME 类型的格
式化字符串
设置为空字符串或NULL
时,返回结果为空。
引用字符

该函数根据 fmt 第二个参数指定的日期格式,将 source_char 第一个参数求值为
日期,并返回等同的日期。
此函数的第一个参数 source_char(源字符串)支持公元、年、月、日、时、
分、秒、亚秒等时间格式。通常『年-月-日 时:分:秒』具有的格式如下:
1)
年度部分(YYYY):支持1~4 位有效数字;
2)
月份部分(MM):取值范围为[0,12],0~9 支持设置为00~09;
3)
日期部分(DD):取值范围为[0,31],0~9 支持设置为00~09;
4)
小时部分(HH/HH12/HH24):hh/hh12 取值范围为[0,12],hh24 取值范围为
[0,24],0~9 均支持设置为00~09;
5)
分钟部分(MI):取值范围为[0,59],0~9 支持设置为00~09;
6)
秒钟部分(SS):取值范围为[0,59],0~9 支持设置为00~09。
此函数的第二个参数 fmt(格式化串)设置为:『YYYY-MM-DD HH:MI:SS』,
连接字符与源字符串相对应,不区分大小写。使用时,用单(双)引号包围。
在下列示例中,用户输入 SELECT 查询语句,对 TO_DATE 函数进行查询,将
字符串转换为 DATETIME 类型。
select to_date(’2017-07-21 13:33:24’, ’YYYY-MM-DD HH:MI:SS’);
返回结果为:
2017-07-21 13:33:24
如果设置省略参数中对应的元素,则执行结果通过to_char 函数展示时包括年、
月、日、时、分、秒、亚秒全部信息,显示形式为:年-月-日 时:分:秒.亚秒
(2017-07-01 00:00:00.000000)。缺省信息系统自动补齐。缺省‘年’则补齐当前
年;缺省‘月’则补齐当前月;缺省‘日’则补齐第一天;缺省‘时’、
‘分’、‘秒’则补齐‘00’;缺省‘亚秒’则补齐‘000000’。
例如,在以下示例中,对 TO_DATE 函数进行查询。
select to_date(’07-21’,‘MM-DD’);

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1451
返回结果如下:
2017-07-21 00:00:00.000000
又如,以下 SQL 语句,对于缺省的‘年、月、日’补齐当前年的当前月的第一
天:
select to_date(’13:33’,‘HH:MI’);
返回结果如下:
2017-10-01 13:33:00.000000
如果省略 fmt 参数(格式化串),只有当 source_char 参数(源字符串)格式为
‘年月日’、‘年月日时分’、‘年月日时分秒’时,TO_DATE 函数执行成
功。否则函数执行失败,系统提示错误。
例如,在以下示例中对 TO_DATE 函数进行查询,设置省略 fmt 参数(格式化
串)。
select to_date(’2017-07-21 13:33:24’);
返回结果如下:
2017-07-21 13:33:24.000000
以下语句执行失败。
select to_date(’07-21 13:33:24’);
source_char 参数(源字符串)与 fmt 参数(格式化串)还可以设置为嵌套函
数、表达式、字符数据类型列。例如,在以下示例中,将TO_DATE 函数的第二
个参数设置为 CAST 表达式:
select (to_date(’10-12 23:56:33’, cast(’mm-ddhh12:mi:ss’as char(30))) ;
返回结果如下:
2017-10-12 23:56:33.000000
如果 source_char 参数(源字符串)与 fmt 参数(格式化串)之间存在连接字符
省略的情况,则当源字符串和格式化串省略的位置相同时,TO_DATE 函数执行
成功,系统返回正确的结果。例如,
select (to_date(’20110911 23:11:24’,’YYYYMMDD HH:MI:SS ’);
返回结果如下:
2011-09-11 23:11:24.000000

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1452
而当源字符串的连接字符省略,对应的格式化串中的连字符未省略时,函数执行
失败,系统返回错误。例如,以下查询语句执行失败:
select to_date(’201707-21’, ’YYYY-MM-DD HH:MI:SS’);
此外,如果将这两个参数的连接字符设置为数字、字母,TO_DATE 函数会执行
失败,系统返回错误。
TO_NUMBER 函数
TO_NUMBER 函数可将表示数值值的数值或字符表达式转换为 DECIMAL 数据
类型。
TO_NUMBER 函数有此语法:
TO_NUMBER 函数

元素
描述
限制
语法
char_expression
要被转换为
DECIMAL 值的表达

必须为文字、主变量、表达
式或字符数据类型的列
表达

num_expression
求值为实数值的表
达式
必须返回数值的数据类型
表达

TO_NUMBER 函数将它的参数转换为 DECIMAL 数据类型。该参数可为数值或
数值表达式的字符串表示。
下列示例检索 TO_NUMBER 函数从 MONEY 值的文字表示返回的 DECIMAL 值:
SELECT TO_NUMBER('$100.00') from mytab;


GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1453
下表展示此 SELECT 语句的输出。
(expression)

功能说明
rebalance 默认往最新的distribution 上分布,也可以通过to distributionid 语法往指
定拓扑上分布。在进行分布之前,需要确认gclusterdb.rebalancing_status 中没有该
表的分布记录,
如果有可以使用delete from 语句删除记录,
否则会影响分布命令的
执行。
语法格式
rebalance
[to distribution_id]
rebalance_options:
Table [[vc_name.]database_name.]table_name
| Database [vc_name.]database_name
| instance
表4- 42 参数说明

GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
348
参数名称


table
[[vc_name.]database_name.]table_name
将指定表从一个distribution 规则转换为按另
一个distribution 规则进行分布。如果
database_name.table_name 已经分布在新的
distribution(gcadmin showdistribution 命令执
行结果中State 值new 的distribution)上,
rebalance table 操作报错,不会向
gclusterdb.rebalancing_status 中增加rebalance
任务。
database [vc_name.]database_name
批量将指定数据库下的所有表从一个
distribution 规则转换为按另一个distribution









database_name.table_name 已经分布在新的
distribution(gcadmin showdistribution 命令执
行结果中State 值new 的distribution)上,
rebalance table 操作报错,不会向
gclusterdb.rebalancing_status 中增加rebalance
任务。
rebalance
database




gclusterdb.rebalancing_status 的rebalance 任务
数。
instance
批量将指定实例下的所有表从一个
distribution 规则转换为按另一个distribution
规则进行分布。如果
database_name.table_name 已经分布在新的
distribution(gcadmin showdistribution 命令执
行结果中State 值new 的distribution)上,
rebalance table 操作报错,不会向
gclusterdb.rebalancing_status 中增加rebalance
任务。rebalance instance 返回加入
gclusterdb.rebalancing_status 的rebalance 任务
数。
to distribution_id
如果不指定[to distribution_id],
rebalance 操作
会按新的
distribution (即
gcadmin
showdistribution 命令执行结果中State 值new
的distribution)规则进行分布。
如果指定[to distribution_id],
rebalance 操作会
按指定的distribution_id 的distribution 规则进
行分布。
示例
示例1:
gbase> rebalance table testdis;
Query OK, 1 row affected

GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
349
gbase> rebalance table testdis to 1;
Query OK, 1 row affected
示例2:
gbase> rebalance database test;
Query OK, 3 rows affected
gbase>
select
index_name,
status,
percentage
from
gclusterdb.rebalancing_status;
+---------------+----------+------------+
| index_name
| status
| percentage |
+---------------+----------+------------+
| test.testrep
| RUNNING
| 0
|
| test.testdis
| STARTING | 0
|
| test.testrand | STARTING | 0
|
+---------------+----------+------------+
3 row in set
gbase>
select
index_name,
status,
percentage
from
gclusterdb.rebalancing_status;
+---------------+-----------+------------+
| index_name
| status
| percentage |
+---------------+-----------+------------+
| test.testrep
| COMPLETED | 100
|
| test.testdis
| RUNNING
| 10
|
| test.testrand | RUNNING
| 90
|
+---------------+-----------+------------+
3 row in set
示例3:
gbase> rebalance instance;
Query OK, 6 rows affected
gbase>
select
index_name,
status,
percentage
from
gclusterdb.rebalancing_status;
+---------------+----------+------------+
| index_name
| status
| percentage |
+---------------+----------+------------+
| test1.t1
| RUNNING
| 0
|
| test.testdis
| STARTING | 0
|
| test.testrand | STARTING | 0
|
| test1.t3
| STARTING | 0
|
| test1.t2
| STARTING | 0
|
| test.testrep
| STARTING | 0
|
+---------------+----------+------------+
6 rows in set

GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
350

The 'javac' or 'jar' command failed
驱动程序遇到了以下任一情况就会发生此错误:
使用 jar 命令将 .class 文件编译为 .jar 文件,以响应 JDBC 应用程序中的 createJar() 命令
使用 javac 和 jar 命令将 .java 文件编译为 .class 文件和 .jar 文件,
以响应 JDBC 应用程序中
的 UDTManager.createUDTClass() 命令。