返回首页

gbase数据、南大通用产品文档:GBase8a行列混存的定义

更新日期:2024年09月11日

由于GBase UP 是列存储的集群架构,因此当列数较多,访问的数据记录又非常离
散时,会造成大量的离散I/O,严重影响查询性能。
GBase UP 提供行列混存功能,即通过存储冗余行的信息,提高I/O 性能。
功能
行列混存具有以下功能:
支持SQL 语法,包括建表时定义行存列,对已存在的表创建行存列,删除行存列。

支持快速创建,并行创建行存列。
提升I/O 性能,行存列可以按更小粒度的Data Page 读取数据,而不是DC。
Server 会自动判断某场景是否需要使用行存数据。

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 681
存储冗余方式灵活,用户可自定义数据存储及冗余方式。
行存列维护,
DML 语句自动维护行存列,
包括,
INSERT、
快速UPDATE、
DELETE、
LOAD 等。
建表语法
CREATE TABLE tablename (column-definitions, GROUPED_DEFINITIONS:
[GROUPED_DEFINITIONS]
);
GROUPED_DEFINITIONS:
GROUPED_DEFINITION [,GROUPED_DEFINITION...]
GROUPED [grouped_name](column_references)[COMPRESS(num)]
参数说明

GROUPED:关键字,表示定义的是行存列。

grouped_name:表示行存列的名称。如果不指定名称,则默认为后面的
column_references 中第一个列的名称,
如果该名称重名,
则在名称后面加上
“_#”
(#为从2 开始的一个数字)。

column_references:行存列中包含的物理列的集合,各列间以“,”分隔。

COMPRESS(num):表示行存列指定压缩方式,取值为0、3、5 中的一个。
修改表(创建/删除行存列)语法:
ALTER TABLE table_name ADD GROUPED_DEFINITIONS
ALTER TABLE table_name DROP GROUPED grouped_name
行存列的创建可以在CREATE TABLE 时指定,也可以使用ALTER TABLE...ADD
GROUPED 语句。

SQL 语句中的数据值必须表示为表达式。表达式是一种规范,其可包括运算符、
运算对象和圆括号,数据库服务器可对其求得一个或多个值,或引用某个数据库
对象。
表达式可引用数据库的表中已有的值,或从此数据派生的值,但有些表达式(诸
如 TODAY、USER 或字面值)可返回独立于数据库的值。您可使用表达式来指
定数据操纵语句中的值,定义分片策略和指定其他上下文中的值。只要当您看到
语法图中对表达式的引用时,就可使用 Expression 段。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1310
然而,在大多数上下文中,会限定您使用其返回值为某种特定数据类型的表达
式,或其数据类型可通过数据库服务器转换为某些需要的数据类型。
要获取在本段中描述的内建的运算符和函数的按字母排序的列表,请参阅 表达式
的列表。
SQL 表达式的语法
下面的部分描述 SQL 表达式,其为返回一个或多个值或引用数据库对象的规
范。 GBase 8s 数据库服务器支持系列类别的表达式:
SQL 表达式

二进制运算符


GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1311
元素
描述
限制
语法
SPL_variable
在 SPL 例程中,包含语
法图展示的某个表达式类
型的变量
必须符合那个类型
的表达式的规则
标识符
variable
包含语法图展示的某个表
达式类型的主变量或程序
变量
必须符合那个类型
的表达式的规则
名称的特定
于语言的规

用法
下表罗列 SQL 表达式的类型,如同在 表达式 的图中标识的那样,且描述每一
类型返回的内容。
表达式类型
描述
聚集函数
从内建的或从用户定义的聚集返回值
算术运算符
支持对一个(一元运算符)或两个(二元运算符)数
值运算对象的算术操作
串联运算符
串联两个字符串值
强制转型运算符
从一种数据类型显式强制转型到另一种
列表达式
列值
条件表达式
返回依赖于条件测试的值
常量表达式
在数据操纵(DML)语句中的字面值
构造函数表达式
为复合的数据类型动态地创建值
函数表达式
从内建的或用户定义的函数返回值
语句-本地的变量表达

在声明了它的 SQL 语句中引用语句-本地的变量
(SLV)
您还可使用主变量或 SPL 变量作为表达式。要获取带有对此章节的页引用的完整
列表,请参阅下列 "表达式的列表"。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1312
表达式的列表
每一类 SQL 表达式都包括许多个别的表达式。
下表以字母顺序罗列所有 SQL 表达式(以及一些运算符)。此表中的列有下列含
义:

名称给出每一表达式的名称。

描述给出每一表达式的简短描述。

语法罗列展示该表达式的语法的页。

用法展示描述该表达式的用法的页。
名称
描述
语法
用法
ABS 函数
返回数值参数的绝
对值
代数函数
ABS 函数
ACOS 函数
返回数值参数的反
余弦
三角函数
ACOS 函数
ACOSH 函数
返回指定的数值输
入的双曲正切
三角函数
ACOSH 函数
ADD_MONTHS 函数 添加指定的月数
时间函数
ADD_MONTHS 函数
加法(+)运算符 返回两个数值运算
对象的和
表达式
算术运算符
ASCII 函数
返回在它的字符串
参数中第一个字符
的 ASCII 代码点
字符串操纵函

ASCII 函数
ASIN 函数
返回数值参数的反
正弦
三角函数
ASIN 函数
ASINH 函数
返回指定的数值输
入的双曲正弦
三角函数
ASINH 函数
ATAN 函数
返回数值参数的反
正切
三角函数
ATAN 函数

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1313
名称
描述
语法
用法
ATAN2 函数
计算极坐标的角度
分量
三角函数
ATAN2 函数
ATANH 函数
返回指定的数值输
入的双曲反正切
三角函数
ATANH 函数
AVG 函数
返回一组数值的平
均值
聚集表达式
AVG 函数
BITAND
返回两个参数的位
AND
位逻辑函数
BITAND 函数
BITANDNOT
返回两个参数的位
ANDNOT
位逻辑函数
BITANDNOT 函数
BITNOT
返回两个参数的位
NOT
位逻辑函数
BITNOT 函数
BITOR
返回两个参数的位
OR
位逻辑函数
BITOR 函数
BITXOR
返回两个参数的位
XOR
位逻辑函数
BITXOR 函数
CARDINALITY 函

返回集合数据类型
(SET、MULTISET
或 LIST)中元素的
数目
CARDINALITY
函数
CARDINALITY 函数
CASE 表达式
返回一个依赖于哪
几个条件的测试求
值为真的值
CASE 表达式
CASE 表达式
CAST 表达式
将表达式转换为指
定的数据类型
强制转型表达

强制转型表达式
强制转型(::)
运算符
请参阅“双冒号
(::)强制转型运
算符”
强制转型表达

强制转型表达式

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1314
名称
描述
语法
用法
CEIL 函数
返回大于或等于它
的单个参数的最小
整数
代数函数
CEIL 函数
CHARACTER_
LENGTH 函数
请参阅
CHAR_LENGTH 函
数。(在多字节语
言环境中,这替代
LENGTH 函数。)
长度函数
CHAR_LENGTH 函数
CHAR_LENGTH 函

返回字符串参数中
逻辑字符的计数
长度函数
CHAR_LENGTH 函数
CHARINDEX 函数 返回子字符串在字
符串内的位置
CHARINDEX 函

CHARINDEX 函数
CHR
从缺省的代码集返
回取值范围在 0 至
255 的代码点
字符串操纵函

CHR 函数
列表达式
来自表的列值
列表达式
列表达式
CONCAT 运算符函

串联两个表达式的
结果
字符串操纵函

CONCAT 函数
串联(||)运算

串联两个表达式的
结果
表达式
串联运算符
常量表达式
带有字面的、固定
的或可变值的表达

常量表达式
常量表达式
COS 函数
返回弧度表达式的
余弦
三角函数
COS 函数
COSH 函数
返回参数的双曲余
弦,在此,该参数
是以弧度表达的角
三角函数
COSH 函数

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1315
名称
描述
语法
用法
COUNT(作为函数
集)
返回频率计数的函
数。下面罗列
COUNT 函数的每一
形式。
聚集表达式
COUNT 函数概述
COUNT (ALL
column) 函数
请参阅 COUNT
(column) 函数。
聚集表达式
COUNT 列函数
COUNT (column)
函数
返回指定的列中非
NULL 值的数目
聚集表达式
COUNT 列函数
COUNT DISTINCT
函数
返回指定的列中唯
一的非 NULL 值的
数目
聚集表达式
COUNT DISTINCT 和
COUNT UNIQUE 函数
COUNT UNIQUE 函

请参阅 COUNT
DISTINCT 函数。
聚集表达式
COUNT DISTINCT 和
COUNT UNIQUE 函数
COUNT (*) 函数 返回满足查询的一
组行的计数
聚集表达式
COUNT(*) 函数
CUME_DIST 函数 返回 OLAP 分区中
每一行的百分比排

OLAP 分等级函
数表达式
CUME_DIST 函数
CURRENT 运算符 返回由天的日期和
时间构成的
DATETIME 值的当前
时间
常量表达式
CURRENT 运算符
CURRENT_ROLE 运
算符
返回当前启用的用
户的角色
常量表达式
CURRENT_ROLE 运算

CURRENT_USER 运
算符
返回用户的授权标
识符。USER 运算符
的同义词。
常量表达式
USER 或
CURRENT_USER 运算


GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1316
名称
描述
语法
用法
sequence.CURRV
AL
返回指定的
sequence 的当前值
常量表达式
使用 CURRVAL
DATE 函数
将非日期参数转换
为 DATE 值
时间函数
DATE 函数
DAY 函数
将该月的天数作为
整数返回
时间函数
DAY 函数
DBINFO
(option)
检索数据库和会话
信息的函数。下面
罗列每一 option.
DBINFO 函数
DBINFO 选项
DBINFO
('bigserial')
返回最近插入的
BIGSERIAL 值
DBINFO 函数
使用 'serial8' 和
'bigserial' 选项
DBINFO
('cdrsession')
展示 DML 操作是否
为复制的事务的一
部分
DBINFO 函数
使用 'cdrsession'
选项
DBINFO
('dbhostname')
返回客户端引用连
接到其上的数据库
服务器的主机名称
DBINFO 函数
使用 'dbhostname'
选项
DBINFO
('dbname')
返回客户端应用连
接到其上的数据库
的标识符
DBINFO 函数
使用 'dbname' 选

DBINFO
('dbspace',
tblspace_numbe
r)
返回对应于
tblspace number
的 dbspace 的名称
DBINFO 函数
使用 ('dbspace',
tblspace_num) 选

DBINFO
('get_tz' )
返回当前会话的时

DBINFO 函数
使用 'get_tz' 选

DBINFO
('serial8')
返回最近插入的
SERIAL8 值
DBINFO 函数
使用 'serial8' 和
'bigserial' 选项

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1317
名称
描述
语法
用法
DBINFO
('sessionid')
返回当前会话的会
话 ID
DBINFO 函数
使用 'sessionid'
选项
DBINFO
('sqlca.sqlerrd
1')
返回插入到表中的
最后的 serial 值
DBINFO 函数
使用
'sqlca.sqlerrd1'
选项
DBINFO
('sqlca.sqlerrd
2')
返回通过 DML 语句
和通过 EXECUTE
PROCEDURE 和
EXECUTE FUNCTION
语句处理的行的数

DBINFO 函数
使用
'sqlca.sqlerrd2'
选项
DBINFO
('utc_current')
返回当前的“世界
标准时间”(UTC)
值。
DBINFO 函数
使用
'utc_current' 选

DBINFO
('utc_to_dateti
me',
expression)
返回指定 UTC 值的
整数或列
expression 的
DATETIME 值。
DBINFO 函数
使用
'utc_to_datetime'
选项
DBINFO
('version',
parameter)
通过 parameter 指
定的那样,返回客
户端应用连接到的
数据库服务器的确
切版本的全部或一
部分。
DBINFO 函数
使用 'version' 选

DBSERVERNAME 函

返回数据库服务器
的名称
常量表达式
DBSERVERNAME 和
SITENAME 运算符
DECODE 函数
对一个或多个表达
式对求值,并以指
定的值表达式比较
DECODE 函数
DECODE 函数

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1318
名称
描述
语法
用法
每一对中的 when
表达式
DECRYPT_ BINARY
函数
在处理加密的 BLOB
参数之后,返回明
文的 BLOB 数据值
加密和解密函

DECRYPT_BINARY 函

DECRYPT_CHAR 函

在处理加密的参数
之后,返回明文的
字符串或 CLOB
加密和解密函

DECRYPT_CHAR 函数
DEFAULT_ROLE 运
算符
返回当前用户的缺
省的角色
常量表达式
DEFAULT_ROLE 运算

DEGREES 函数
将弧的单位转换为

三角函数
DEGREES 函数
DELETING 布尔运
算符
如果触发器事件是
DELETE,则返回
't'
触发器类型的
布尔运算符
触发器类型的布尔
运算符
DENSERANK 函数 DENSE_RANK 函数的
同义词
OLAP 分等级函
数表达式
DENSE_RANK 函数
DENSE_RANK 函数 将 OLAP 分区中的
每一行分等级,等
级中没有间隔
OLAP 分等级函
数表达式
DENSE_RANK 函数
除法(/)运算符 返回两个数值运算
对象的商
表达式
算术运算符
双冒号(::)强
制转型运算符
将表达式的值转换
为指定的数据类型
强制转型表达

强制转型表达式
双管道(||)串
联运算符
返回将一个字符串
运算对象连接到另
一字符串运算对象
的字符串
表达式
串联运算符

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1319
名称
描述
语法
用法
ENCRYPT_AES 函

在处理明文字符
串、BLOB 或 CLOB
之后,返回加密的
字符串
加密和解密函

ENCRYPT_AES 函数
ENCRYPT_TDES 函

在处理明文字符
串、BLOB 或 CLOB
之后,返回加密的
字符串
加密和解密函

ENCRYPT_TDES 函数
EXP 函数
返回数值表达式的
指数
指数和对数函

EXP 函数
EXTEND 函数
重置 DATETIME 或
DATE 值的精度
时间函数
EXTEND 函数
FILETOBLOB 函数 从存储在指定的操
作系统文件中的数
据,创建 BLOB 值
智能大对象函

FILETOBLOB 和
FILETOCLOB 函数
FILETOCLOB 函数 从存储在指定的操
作系统文件中的数
据,创建 CLOB 值
智能大对象函

FILETOBLOB 和
FILETOCLOB 函数
FIRST_VALUE 函

对于每一 OLAP
window 分区中的第
一个行,返回指定
表达式的值
OLAP 聚集函数
表达式
LAST_VALUE 函数
FLOOR 函数
返回小于或等于它
的单个参数的最大
的整数
代数函数
FLOOR 函数
FORMAT_UNITS 函

返回指定内存或存
储的数目和缩写的
单位的字符串
FORMAT_UNITS
函数
FORMAT_UNITS 函数

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1320
名称
描述
语法
用法
GETHINT 函数
在处理加密的数据-
字符串参数之后,
返回明文的提示字
符串
加密和解密函

GETHINT 函数
GREATEST 函数
返回值集中的最大

代数函数
GREATEST 函数
HEX 函数
返回 base-10 整数
参数的十六进制编

HEX 函数
HEX 函数
主变量
请参阅变量。
SQL 表达式的
语法
SQL 表达式的语法
IFX_ALLOW_
NEWLINE 函数
设置 newline 会话
模式,允许或不允
许在括起来的字符
串中的换行字符
IFX_ALLOW_NEW
LINE 函数
IFX_ALLOW_NEWLINE
函数
INITCAP 函数
将字符串参数转换
为其中仅每一词的
首字母为大写的字
符串
大小写转换函

INITCAP 函数
INSERTING 布尔
运算符
如果触发器事件为
INSERT,则返回
't'
触发器类型的
布尔运算符
触发器类型的布尔
运算符
INSTR 函数
返回子字符串在字
符串内第 N 次发生
的位置
INSTR 函数
INSTR 函数
ISNULL 函数
返回非 NULL 参数
的值,或如果该参
数为 NULL 则返回
指定的值
ISNUL 函数
ISNULL 函数

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1321
名称
描述
语法
用法
LAG 函数
在 OLAP 分区内的
当前行之前,返回
在指定的偏移量的
行的表达式值
OLAP 分等级函
数表达式
ids_sqs_1513.html
#ids_sqs_1513
LAST_DAY 函数
返回它的参数指定
的那个月的最后一
天的日期
时间函数
LAST_DAY 函数
LAST_VALUE 函数 返回 OLAP window
分区中最后一行的
指定的表达式的值
OLAP 聚集函数
表达式
LAST_VALUE 函数
LEAD 函数
在 OLAP 分区中当
前行之后,返回指
定的偏移量的行的
表达式值
OLAP 分等级函
数表达式
ids_sqs_1513.html
#ids_sqs_1513
LEAST 函数
返回值集中的最小

代数函数
LEAST 函数
LEFT 函数
返回字符串最左边
的 N 个字符
LEFT 函数
LEFT 函数
LEN 函数
LENGTH 函数的同义

长度函数
LENGTH 函数
LENGTH 函数
返回字符列中的字
节数,不包括拖尾
的空格
长度函数
LENGTH 函数
LIST 集合构造函

可包含重复的值的
有序的集合的构造
函数
集合构造函数 集合构造函数
文字 BOOLEAN
BOOLEAN 值的文字
表示
常量表达式
常量表达式

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1322
名称
描述
语法
用法
文字集合
代表集合数据类型
中的元素
常量表达式
文字的集合
文字 DATETIME 代表 DATETIME 值
常量表达式
文字的 DATETIME
文字 INTERVAL 代表 INTERVAL 值
常量表达式
文字的 INTERVAL
精确数值
代表数值
常量表达式
精确数值
文字 opaque 类

代表 opaque 数据
类型
常量表达式
常量表达式
文字 row
代表 ROW 数据类型
中的元素
常量表达式
文字的 Row
LN
返回数值参数的自
然对数
指数和对数函

LN 函数
LOCOPY 函数
创建智能大对象的
副本
智能大对象函

LOCOPY 函数
LOG10 函数
返回数值参数的以
10 为底的对数
指数和对数函

LOG10 函数
LOGN 函数
返回数值参数的自
然对数
指数和对数函

LOGN 函数
LOTOFILE 函数
将 BLOB 或 CLOB
对象复制到文件
智能大对象函

LOTOFILE 函数
LOWER 函数
将大写字母转换为
小写
大小写转换函

LOWER 函数
LPAD 函数
返回由指定数目的
填充字符左填充的
字符串
字符串操纵函

LPAD 函数
LTRIM 函数
从字符串移除指定
的开头填充字符。
字符串操纵函

LTRIM 函数

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1323
名称
描述
语法
用法
MAX 函数
返回指定值集中的
最大值
聚集表达式
MAX 函数
MDY 函数
从整数参数返回
DATE 值
时间函数
MDY 函数
MIN 函数
返回指定的值集中
的最小值
聚集表达式
MIN 函数
MOD 函数
从两个数值参数返
回模值(整数除的
余值)
代数函数
MOD 函数
MONTH 函数
从 DATE 或
DATETIME 参数返回
月份值
时间函数
MONTH 函数
MONTHS_ BETWEEN
函数
返回两个时间参数
之间的月份差
时间函数
MONTHS_BETWEEN 函

乘法(*)运算符 返回两个数值运算
对象的乘积
表达式
算术运算符
MULTISET 集合构
造函数
可包含重复的值的
元素的未排序的集
合的构造函数
集合构造函数 集合构造函数
NEXT_DAY 函数
返回同时满足两个
条件的最早的日历
日期
时间函数
NEXT_DAY 函数
sequence.NEXTV
AL
增加指定的
sequence 的值
常量表达式
使用 NEXTVAL
NTILE 函数
将 OLAP 分区中的
行划分为近似基数
的 N 个分级的类
别,称为 tiles
OLAP 分等级函
数表达式
NTILE 函数

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1324
名称
描述
语法
用法
NULL 关键字
未知的、缺失的或
逻辑上未定义的值
NULL 关键字
NULL 关键字
NULLIF 函数
如果两个值相等,
则返回 NULL
NULLIF 函数
NULLIF 函数
NVL 函数
返回非 NULL 参数
的值,或如果该参
数为 NULL 则返回
指定的值
NVL 函数
NVL 函数
NVL2 函数
当第一个参数不是
NULL 时,返回第二
个参数
NVL2 函数
NVL2 函数
OCTET_LENGTH 函

返回字符列中的字
节数,包括任何结
尾的空格
长度函数
OCTET_LENGTH 函数
PERCENT_RANK 函

返回 OLAP window
分区中每一行的等
级值,规格化到从
0 至 1 的范围
OLAP 分等级函
数表达式
PERCENT_RANK 函数
POW 函数
将一个基值升高到
指定阶数的幂
代数函数
POW 函数
POWER
® 函数
POW 函数的同义词
代数函数
POW 函数
过程调用表达式 请参阅用户定义的
函数。
用户定义的函

用户定义的函数
程序变量
请参阅变量。
SQL 表达式的
语法
SQL 表达式的语法
QUARTER 函数
返回 DATE 或
DATETIME 值的日历
季度
时间函数
QUARTER 函数

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1325
名称
描述
语法
用法
括起来的字符串 文字字符串
常量表达式
引用的字符串
RADIANS 函数
将度数的单位转换
为弧度
三角函数
RADIANS 函数
RANGE 函数
返回指定的值集的
范围
聚集表达式
RANGE 函数
RANK
返回一个序数数目
来划分 OLAP
window 中每一行的
等级
OLAP 分等级函
数表达式
RANK 函数
RATIOTOREPORT
函数
RATIO_TO_REPORT
函数的同义词
OLAP 聚集函数
表达式
RATIO_TO_REPORT
函数
RATIO_TO_REPORT
函数
返回同一 OLAP
window 分区中每一
行值对于所有行合
计值的分数比率
OLAP 聚集函数
表达式
RATIO_TO_REPORT
函数
REPLACE 函数
替换源字符串中指
定的字符
字符串操纵函

REPLACE 函数
REVERSE
颠倒源字符串中字
符的顺序
字符串操纵函

REVERSE 函数
RIGHT 函数
从源字符串返回最
右边的 N 个字符
RIGHT 函数
RIGHT 函数
ROOT 函数
返回实数、正值、
数值参数的第 N 个
根值
代数函数
ROOT 函数
ROUND 函数
返回参数的四舍五
入的值
代数函数
ROUND 函数
ROW 构造函数
命名的 ROW 数据类
型的构造函数
构造函数表达

ROW 构造函数

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1326
名称
描述
语法
用法
ROWNUMBER 函数 ROW_NUMBER 函数的
同义词
OLAP 编号函数
表达式
OLAP 编号函数表达

ROW_NUMBER 函数 返回 OLAP window
分区中每一行的序
列整数
OLAP 编号函数
表达式
OLAP 编号函数表达

RPAD 函数
返回由指定数目的
填充字符右填充的
字符串
字符串操纵函

RPAD 函数
RTRIM 函数
从字符串移除结尾
的空填充字符
字符串操纵函

RTRIM 函数
SECLABEL_BY_
COMP 函数
返回其组件为该参
数的安全标签
安全标签支持
函数
SECLABEL_BY_COMP
函数
SECLABEL_BY_
NAME 函数
返回其标识符为该
参数的安全标签
安全标签支持
函数
SECLABEL_BY_NAME
函数
SECLABEL_TO_
CHAR 函数
返回其字符串格式
为该参数的安全标

安全标签支持
函数
SECLABEL_TO_CHAR
函数
SELECTING 布尔
运算符
如果触发器事件为
SELECT,则返回
't'
触发器类型的
布尔运算符
触发器类型的布尔
运算符
SET 集合构造函

唯一的元素的未排
序集合的构造函数
集合构造函数 集合构造函数
SIGN 函数
返回数值参数的符
号的标志
SIGN 函数
SIGN 函数
SIN 函数
返回弧度参数的正

三角函数
SIN 函数
SINH 函数
返回弧度参数的双
曲正弦
三角函数
SINH 函数

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1327
名称
描述
语法
用法
SITENAME 函数
请参阅
DBSERVERNAME 函
数。
常量表达式
DBSERVERNAME 和
SITENAME 运算符
SLV 表达式
其作用域为声明它
的 SQL 语句的语句
-本地的变量
(SLV)
语句本地的变
量声明
语句本地的变量表
达式
SPACE 函数
返回 N 个空字符的
字符串
字符串操纵函

SPACE 函数
SPL 例程表达式 请参阅“用户定义
的函数”
用户定义的函

用户定义的函数
SPL 变量
存储表达式的 SPL
变量
SQL 表达式的
语法
SQL 表达式的语法
SQLCODE 函数
将 sqlca.sqlcode
值返回到 SPL UDR
SQLCODE 函数
(SPL)
SQLCODE 函数
(SPL)
SQRT 函数
返回数值参数的平
方根
代数函数
SQRT 函数
STDEV 函数
返回数据集的标准
偏差
聚集表达式
STDEV 函数
SUBSTR 函数
返回源字符串的一
子字符串
SUBSTR 函数
SUBSTR 函数
SUBSTRB 函数
返回源字符串的一
子字符串
SUBSTRB 函数 SUBSTRB 函数
SUBSTRING 函数 返回源字符串的一
子字符串
SUBSTRING 函

SUBSTRING 函数
SUBSTRING_INDEX
函数
返回包括第 N 次出
现一定界符的子字
符串
SUBSTRING_IND
EX 函数
SUBSTRING_INDEX
函数

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1328
名称
描述
语法
用法
Substring
( [ x, y ] ) 运
算符
从字符串运算对象
返回子字符串
列表达式
使用子字符串运算

减法(-)运算符 返回两个数值的差
表达式
算术运算符
SUM 函数
返回指定的值集合
总和
聚集表达式
SUM 函数
SYSDATE 运算符 从系统时钟返回当
前的 DATETIME
值。
常量表达式
SYSDATE 运算符
TAN 函数
返回弧度表达式的
正切
三角函数
TAN 函数
TANH 函数
返回弧度参数的双
曲正切
三角函数
TANH 函数
TO_CHAR 函数
将时间或数值转换
成字符串
时间函数
TO_CHAR 函数
TO_DATE 函数
将字符串转换成
DATETIME 值
时间函数
TO_DATE 函数
TO_NUMBER 函数 将数值或字符串转
换成 DECIMAL 值
TO_NUMBER 函

TO_NUMBER 函数
TODAY 运算符
返回当前的系统日

常量表达式
TODAY 运算符
TRIM 函数
从字符串参数删除
空填充字符
字符串操纵函

TRIM 函数
TRUNC 函数
返回截断的数值或
时间值
代数函数
TRUNC 函数
一元减号(-)
指定负数(< 0)值 表达式
算术运算符

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1329
名称
描述
语法
用法
一元加号(+)
指定整数(> 0)
值。
表达式
算术运算符
UNITS 运算符
将整数转化为
INTERVAL 值
常量表达式
UNITS 运算符
UPDATING 布尔运
算符
如果触发器事件为
UPDATE,则返回
't'
触发器类型的
布尔运算符
触发器类型的布尔
运算符
UPPER 函数
将小写字母转换为
大写
大小写转换函

UPPER 函数
用户定义的聚集 用户定义的聚集
(相对于内建的聚
集)
用户定义的聚

用户定义的聚集
用户定义的函数 用户编写的函数
(相对于内建的函
数)
用户定义的函

用户定义的函数
USER 运算符
返回当前用户的授
权表示法
常量表达式
USER 或
CURRENT_USER 运算

变量
存储值的主变量或
程序变量
SQL 表达式的
语法
SQL 表达式的语法
VARIANCE 函数
返回数值值集的差

聚集表达式
VARIANCE 函数
WEEKDAY 函数
返回代表星期几的
整数代码
时间函数
WEEKDAY 函数
Window 聚集函数 返回来自 OLAP
window 分区的聚集
结果
OLAP window
表达式
OLAP window 聚集
函数

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1330
名称
描述
语法
用法
YEAR 函数
返回表示年份的 4
位整数
时间函数
YEAR 函数
* 符号
请参阅“乘法(*)
运算符”
SQL 表达式的
语法
算术运算符
+ 符号
请参阅“加法”和
“一元加号(+)”
SQL 表达式的
语法
算术运算符
- 符号
请参阅“减法”和
“一元减号(-)”
SQL 表达式的
语法
算术运算符
/ 符号
请参阅“除法运算
符”
SQL 表达式的
语法
算术运算符
:: 符号
请参阅“双冒号
(::)强制转型运
算符”
强制转型表达

强制转型表达式
|| 符号
请参阅“双管道
(||)串联运算
符”
SQL 表达式的
语法
串联运算符
[ first,
last ] 符号
请参阅“子字符串
运算符”
列表达式
使用子字符串运算

下面的部分描述出现在前面表格中的每一表达式的语法和用法。
算术运算符
二元算术运算符可组合返回数值的表达式。
算术运算
算术运
算符
运算符函数 算术运算 算术运
算符
运算符函数
加法
+
plus( )
乘法
*
times( )
减法

minus( )
除法
/
divide( )
下列示例使用二元算术运算符:

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1331
quantity * total_price
price * 2
COUNT(*) + 2
如果您将 DATETIME 值与一个或多个 INTERVAL 值组合,则所有 INTERVAL
值的字段都出现在 DATETIME 值中;不执行隐式的 EXTEND 功能。此外,您
不可使用带有 DAY 至 SECOND 间隔的 YEAR 至 MONTH 间隔。要获取关于
二元算术运算符的附加信息,请参阅 GBase 8s SQL 参考指南。
二元算术运算符与运算符函数相关联,如前面的表格所示。以二元运算符连接两
个表达式等同于对这些表达式调用相关联的运算符函数。例如, 下列两个语句都
选择 total_price 列与 2 的乘积。在第一个语句中,* 运算符隐式地调用
times( ) 函数。
SELECT (total_price * 2) FROM items
WHERE order_num = 1001;
SELECT times(total_price, 2) FROM items
WHERE order_num = 1001;
您不可使用算术运算符来将使用聚集函数的表达式与列表达式组合。
数据库服务器为所有内建的数据类型提供与关系运算符相关联的运算符函数。您
可定义这些运算符函数的新版本来处理您自己的用户定义的数据类型。
要获取更多信息,请参阅 GBase 8s 用户定义的例程和数据类型开发者指南 。
数据库服务器还支持下列一元算术运算符。
数值的符号
一元算术运算符
运算符函数

+
positive( )


negate( )
一元算术运算符有前面的表格展示的相关联的运算符函数。您可定义这些函数的
新版本来处理您自己的用户定义的数据类型。要获取更多关于此主题的信息,请
参阅 GBase 8s 用户定义的例程和数据类型开发者指南 。
如果参与在算术表达式中的任何值为 NULL,则整个表达式的值为 NULL,如下例
所示:
SELECT order_num, ship_charge/ship_weight FROM orders

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1332
WHERE order_num = 1023;
如果或 ship_charge 或 ship_weight 为 NULL,则表达
式,ship_charge/ship_weight 的返回值也为 NULL。 如果在条件中使用 NULL 表
达式 ship_charge/ship_weight,则它的真值不可为 TRUE,且不满足条件(除非
该 NULL 表达式是 IS NULL 运算符的一个运算对象)。
位逻辑函数
使用位逻辑函数来执行命名的位运算。
位逻辑函数

元素
描述
限制
语法
int8_expr
可转化为 INT8 值的
数值表达式
对于 BITNOT,最大的
大小减 1
表达式
这些函数的参数可为可转换为 INT8 数据类型的任何数值数据类型。
除了带有单个参数的 BITNOT 之外,这些位逻辑函数都有两个可转换为 INT8
值的参数。
如果两个参数都有相同的整数类型,则返回值的数据类型与参数的类型相同。如
果两个参数的整数类型不同,则返回值为精度较高的整数类型。例如,如果第一
个参数类型为 INT,而第二个参数类型为 INT8,则返回值的类型为 INT8。
如果参数为任何其他数值类型,诸如 DECIMAL、SMALLFLOAT、FLOAT 或
MONEY,或那些类型的某种组合,则返回值数据类型为 DECIMAL(32)。
如果使用主变量,且在准备时刻不知道参数的类型,则假设两个参数都是数据类
型 INTEGER,且返回值为 INTEGER。在执行时刻准备之后,如果为主变量提供不

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1333
同的数据类型值,则 GBase 8s 发出 -9750 错误。要防止发生这样的情况,您可
通过使用强制转型来指定主变量数据类型,如下列 ESQL/C 程序片断所示:
sprintf(query1, ",
bitand( ?::int8, ?::int8) from mytab");
EXEC SQL prepare selectq from :query;
EXEC SQL declare select_cursor cursor for selectq;
EXEC SQL open select_cursor
using :hostvar_int8_input1, :hostvar_int8_input2;


EXEC SQL fetch select_cursor into :var_int8_output;
BITAND 函数
BITAND 函数有两个参数。这些参数可为可转换为 INT8 值的任何数值类型值。
在位运算之前截断小数值。结果是两个参数的 AND。
如果两个参数有相同的整数类型,则返回值的数据类型与参数的类型相同。如果
参数有不同的整数类型(例如,INT 和 INT8),则返回带有更高精度的数据类
型。如果参数是任何其他数值类型,诸如 DECIMAL、SMALLFLOAT、FLOAT
或 MONEY,或那些类型的某种组合,则返回的数据类型为 DECIMAL(32)。
下列示例展示调用 BITAND 函数的查询:
select task_id, task_status,
decode(bitand(task_status,1), 1, ' Y', ' N') as task_a,
decode(bitand(task_status,2), 2, ' Y', ' N') as task_b,
decode(bitand(task_status,4), 4, ' Y', ' N') as task_c
from tasks;

下表展示此 SELECT 语句的输出。
task_id task_status task_a task_b task_c
100 1 Y N N
101 1 Y N N
102 2 N Y N
103 4 N N Y
104 6 N Y Y

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1334
105 3 Y Y N
106 5 Y N Y
107 7 Y Y Y
BITOR 函数
BITOR 函数有两个参数。这些参数可为可转换为 INT8 值的任何数值类型值。
在位运算之前截断小数值。结果是它的两个参数的位 OR。
如果两个参数都有相同的整数类型,则返回值的数据类型与参数的类型相同。如
果参数是不同的整数类型(例如,INT 和 INT8),则返回的类型是有较高精度
的类型。如果参数是任何其他的数值类型,诸如 DECIMAL、SMALLFLOAT、
FLOAT 或 MONEY,或那些类型的某种组合,则返回的数据类型为
DECIMAL(32)
下列示例说明调用 BITOR 函数的查询:
SELECT BITOR(8, 20) AS bitor FROM systables WHERE tabid = 1;
下列表格展示此 SELECT 语句的输出。
bitor
28
BITXOR 函数
BITXOR 函数有两个参数。参数可为可转换为 INT8 值的任何数值类型值。
在位运算之前,截断小数值。结果是它的两个参数的位 XOR。
如果两个参数都有相同的整数类型,则返回值的数据类型与参数的类型相同。如
果参数是不同的数据类型(例如,INT 和 INT8),返回的类型是更高精度的类
型。如果参数是任何其他的数值类型,诸如 DECIMAL、SMALLFLOAT、
FLOAT 或 MONEY,或那些类型的某种组合,则返回的数据类型是
DECIMAL(32)。
下列示例说明调用 BITXOR 函数的查询:
SELECT BITXOR(41, 33) AS bitxor FROM systables WHERE tabid = 1;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1335
下列表格展示此 SELECT 语句的输出。
bitxor
8
此查询调用带有负参数的 BITXOR 函数:
SELECT BITXOR(-20, -41) AS bitxor FROM systables WHERE tabid = 1;
下列表格展示此 SELECT 语句的输出。
bitxor
59
BITANDNOT 函数
BITANDNOT 函数有两个参数。参数可为可转换为 INT8 值的任何数值类型值。
在位运算之前,截断小数值。结果与两个参数的 BITAND(arg1,
BITNOT(arg2)) 相同。
如果两个参数都有相同的整数类型,则返回值的数据类型与参数的类型相同。如
果参数是不同的整数类型(例如,INT 和 INT8),则返回的类型是精度更高的
类型。如果参数是任何其他的数值类型,诸如 DECIMAL、SMALLFLOAT、
FLOAT 或 MONEY,或那些类型的某种组合,则返回的数据类型是
DECIMAL(32)。
下列示例中的查询调用 BITANDNOT 函数:
SELECT BITANDNOT(20,-20) AS bitandnot FROM systables WHERE tabid = 1;

下列表格展示此 SELECT 语句的输出。
bitandnot
16
下列查询为前面的示例中的参数调用等同的 BITAND 和 BITNOT 函数:
select bitand(20, bitnot(-20)) as bitandnot from systables
where tabid = 1;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1336
下列表格展示此 SELECT 语句的输出。
bitandnot
16
BITNOT 函数
BITNOT 函数可取一个小于最大的 INT8 值的任何数值类型值。
在位运算之前,截断小数值。结果是它的参数的位 NOT。
如果参数是 SMALLINT、INT、BIGINT 或 INT8,则返回的数据类型与参数的类
型相同。否则返回的数据类型为 DECIMAL(32)。
下列查询调用 BITNOT 函数:
SELECT BITNOT(8) AS bitnot FROM systables WHERE tabid = 1;
下列表格展示此 SELECT 语句的输出。
bitnot
-9
下一查询调用带有负参数的 BITNOT 函数:
SELECT BITNOT(-20) AS bitnot FROM systables WHERE tabid = 1;
下列表格展示此 SELECT 语句的输出。
bitnot
19
串联运算符
串联运算符是二元运算符,在 SQL 表达式 的通用图中展示其语法。您可使用串
联运算符(||)来串联两个求值为字符数据类型或数值数据类型的两个表达式。这
些示例展示一些可能的串联的表达式组合。

第一个示例将 zipcode 列串联到 lname 列的前三个字母。

第二个示例将后缀 .dbg 串联到名为 file_variable 的主变量的内容。

第三个示例将 TODAY 运算符返回的值串联到字符串 Date。
lname[1,3] || zipcode

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1337
:file_variable || '.dbg'
'Date:' || TODAY
您不可在下列嵌入式语言语句中使用串联运算符:

ALLOCATE COLLECTION

ALLOCATE DESCRIPTOR

ALLOCATE ROW

CREATE FUNCTION FROM

CREATE PROCEDURE FROM

CREATE ROUTINE FROM

DEALLOCATE COLLECTION

DEALLOCATE DESCRIPTOR

DEALLOCATE ROW DESCRIBE

DESCRIBE INPUT

EXECUTE

FLUSH

GET DESCRIPTOR

GET DIAGNOSTICS

PUT

SET AUTOFREE

SET CONNECTION

SET DESCRIPTOR

WHENEVER
除非 DECLARE 和 PREPARE 语句另有注明,在下列动态 SQL 语句中,以诸
如 GBase 8s ESQL/C 语言这样的外部语言编写的例程不可使用串联运算符:

CLOSE

DECLARE

EXECUTE IMMEDIATE

FETCH

FREE

OPEN

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

PREPARE
虽然诸如 cursor_id 规范这样的 DECLARE 语句的输入参数不可为包括串联运算
符的表达式,但 GBase 8s ESQL/C 例程可在 DECLARE 语句内的 SELECT、
INSERT、EXECUTE FUNCTION 或 EXECUTE PROCEDURE 语句中使用此运算
符。
GBase 8s ESQL/C 例程可在 SQL 语句的文本中或在您传递到 PREPARE 语句的
语句中使用串联运算符。
在 SPL 例程中,您可在指定传递到 EXECUTE IMMEDIATE 语句或 PREPARE
语句的 SQL 语句的文本的表达式中包括串联运算符,即使该 SPL 例程的调用上
下文是一 GBase 8s ESQL/C 例程。
您不可随同用户定义的数据类型、随同复合的或大对象数据类型直接地使用串联
运算符,也不可随同非内建的字符或数值数据类型的运算对象使用。在您可将结
果传递到串联运算符之前,您必须将 UDT 或其他被支持的数据类型显式地强制
转型为内建的字符或数值数据类型。
串联运算的结果的数据类型依赖于运算对象的数据类型以及结果字符串的长度,
使用 从 CONCAT 函数的返回类型 部分描述的返回类型提升规则。
串联运算符(||)有相关联的名为 CONCAT 的运算符函数。不可重载
CONCAT 函数。
当您定义基于文本的 UDT 时,您可定义 CONCAT 函数来串联用户定义的数据
类型的对象。要获取更多信息,请参阅 GBase 8s 用户定义的例程和数据类型开
发者指南 。
强制转型表达式
您可使用 CAST 和 AS 关键字或双冒号强制转型运算符( :: )来将表达式强制
转型为另一数据类型。运算符和这些关键字都调用从表达式的数据类型到指定的
目标数据类型的强制转型。
要调用显式的强制转型,您可使用强制转型运算符或 CAST AS 关键字。如果您
使用强制转型运算符或 CAST 和 AS 关键字,但未定义显式的或隐式的强制转
型来执行两种数据类型之间的转换,则该语句返回错误。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1339
强制转型表达式

元素
描述
限制
语法
target_data_type
由强制转型返回
的数据类型
请参阅“对于目标数据
类型的规则”
数据类型
对于目标数据类型的规则
下列规则限制强制转型表达式中的目标数据类型:

目标数据类型必须为内建的、用户定义的数据类型,或数据库中的命名的
row 类型。

目标数据类型不可为未命名的 row 类型或集合类型。

在下列情况下,目标数据类型可为 BLOB 数据类型:
o
源表达式(要被强制转型到另一数据类型的表达式)为 BYTE 数
据类型。
o
源表达式是用户定义的类型,且用户已定义了从用户定义的类型
到 BLOB 类型的强制转型。

在这些条件下,目标数据类型可为 CLOB 类型:
o
源表达式是 TEXT 数据类型。
o
源表达式是用户定义的类型,且用户已定义了从用户定义的类型
到 CLOB 类型的强制转型。

您不可将 BLOB 数据类型强制转型为 BYTE 数据类型。

您不可将 CLOB 数据类型强制转型为 TEXT 数据类型。

必须存在可将源表达式的数据类型转换为目标数据类型的显式的或隐式的
强制转型。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1340
强制转型表达式的示例
下例示例展示将 x 与 y 的总和转化为用户定义的数据类型 user_type 的两种不
同方法。这两种方式产生相同的结果。二者都需要存在从由 (x + y) 返回的类型
到用户定义的类型的显式的或隐式的强制转型:
CAST ((x + y) AS user_type)
(x + y)::user_type
下列示例展示查找等同于表达式 expr 的整数的两种不同方法。二者都需要存在
从数据类型 expr 到 INTEGER 数据类型的隐式的或显式的强制转型:
CAST (expr AS INTEGER)
expr::INTEGER
在下列示例中,用户将 BYTE 列强制转型为 BLOB 类型,并将 BLOB 数据复
制到操作系统文件:
SELECT LOTOFILE(mybytecol::blob, 'fname', 'client')
FROM mytab
WHERE pkey = 12345;
在下列示例中,用户将 TEXT 列强制转型为 CLOB 值,然后将同一表中的
CLOB 列更新为从 TEXT 列派生的 CLOB 值:
UPDATE newtab SET myclobcol = mytextcol::clob;
强制转型表达式中的关键字 NULL
强制转型表达式可出现在 projection 列表中,包括形如 NULL::datatype 的表达
式,在此,datatype 是数据库已知的任何数据类型:
SELECT newtable.col0, null::int FROM newtable;
关键字 NULL 在表达式内有全局的引用作用域。在 SQL 中,关键字 NULL 是
访问 NULL 值的唯一语法机制。对于关键字 NULL 的全局作用域的任何重新定
义或限制的尝试(例如,声明名为 null 的 SPL 变量),都会禁用涉及 NULL
值的任何强制转型表达式。请确保关键字 NULL 在所有表对象上下文中收到它的
全局作用域。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1341
列表达式
列表达式指定数据库中列的数据值,或值的子字符串,或 ROW 类型列内的字
段。这是列表达式的语法。
列表达式

元素
描述
限制
语法
alias
表或视图的临时可替
换的名称,在查询的
FROM 子句中声明
必须返回字符串。限制依
赖于 alias 发生在其中
的 SELECT 语句的子句
标识符
column
列的名称
限制依赖于 column 发生
位置的 SQL 语句
标识符
field_name
在 ROW 列或 ROW 列
表达式中 ROW 字段的
名称
必须为 row-column name
或 row_col_expr 或
field name(对于嵌套的
行)指定的行的成员
标识符
first、last
指示 column 内第一
个字符和最后一个字
符位置的整数
column 必须为 CHAR、
VARCHAR、NCHAR、
NVARCHAR、BYTE 或 TEXT
精确数值

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1342
元素
描述
限制
语法
类型,且 0 < first ≤
last
row_col_expr
返回 ROW 类型值的表
达式
必须返回 ROW 数据类型
表达式
row_column
ROW 类型列的名称
必须为命名的 ROW 数据
类型或未命名的 ROW 数
据类型
标识符
synonym、
table、view
包含 column 的表、
视图或(表或视图
的)同义词
同义词以及它指向的表或
视图必须存在
数据库对
象名称,
数据库对
象名
下列示例展示列表达式:
company
items.price
cat_advert [1,15]
每当有必要区分那些有相同的名称但在不同的表中的列时,您必须以表名称或别
名限定列。下列展示 SELECT 语句的示例使用来自 customer 和 orders 表的
customer_num。第一个示例将表名称置于列名称之前。第二个示例将表别名置于
列名称之前。
SELECT * FROM customer, orders
WHERE customer.customer_num = orders.customer_num;
SELECT * FROM customer c, orders o
WHERE c.customer_num = o.customer_num;
使用点表示法
点表示法(有时称为成员运算符)允许您以为其组件的另一 SQL 标识符限定 SQL
标识符。 您以句号( . )分隔这些标识符。例如,您可以任何下列 SQL 标识符
限定列名称:

表名称:table_name.column_name

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

视图名称:view_name.column_name

同义词名称:syn_name.column_name
这些点表示法的格式称为列 projections。
您还可使用点表示法来直接地访问命名的或未命名的 ROW 列的字段,如下例所
示:
row-column name.field name
点表示法的这种使用称为字段 projection。例如,假设您有带有下列定义的名为
rect 的列:
CREATE TABLE rectangles
(
area float,
rect ROW(x int, y int, length float, width float)
);
下列 SELECT 语句使用点表示法来访问 rect 列的字段 length:
SELECT rect.length FROM rectangles WHERE area = 64;
以星号表示法选择 ROW 列的所有字段
如果您想要选择有 ROW 类型的列的所有字段,则您可不使用点表示法指定列名
称。例如,您可选择 rect 列的所有字段,如下:
SELECT rect FROM rectangles WHERE area = 64;
您还可使用星号(*)表示法来投影有 ROW 数据类型的列的所有字段。例如,如
果您想要使用星号表示法来选择 rect 列的所有字段,您可输入下列语句:
SELECT rect.* FROM rectangles WHERE area = 64;
与分别地指定 rect 列的每一字段相比,星号表示法更容易:
SELECT rect.x, rect.y, rect.length, rect.width
FROM rectangles
WHERE area = 64;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1344
在 SELECT 语句的 projection 列表中,ROW 字段星号表示法是有效
的。它可指定 ROW 类型列的所有字段,或 ROW 列表达式返回的数
据。
星号表示法不必带有 ROW 类型列,因为您可单独指定列名称来投影
它的所有字段。然而,带有 ROW 类型表达式的星号表示法非常有
用,诸如返回 ROW 类型值的子查询和用户定义的函数。要获取更多
信息,请参阅 使用带有 Row 类型表达式的点表示法。
您仅可在 SELECT 语句的 projection 列表中使用带有 ROW 数据类型
的列或表达式的星号表示法。您不可在 SELECT 语句的任何其他子句
中使用带有 ROW 类型的列和表达式的星号表示法。
选择嵌套的字段
当定义列的 ROW 类型本身包含其他 ROW 类型时,该列包含嵌套的字段。使用
点表示法来访问列内的这些嵌套的字段。
例如,假设 employee 表的 address 列包含字段:street、city、state 和
zip。此外,zip 字段包含嵌套的字段:z_code 和 z_suffix。zip 字段上的查询
返回 z_code 和 z_suffix 字段的值。然而,您可指定查询仅返回特定嵌套的字
段。下列示例展示如何使用点表示法来构造 SELECT 语句,该语句仅返回
address 列的 z_code 字段的行:
SELECT address.zip.z_code FROM employee;
优先级的规则
数据库服务器使用下列优先级规则来解释点表示法:
1.
schema name_a . table name_b . column name_c . field name_d
2.
table name_a . column name_b . field name_c . field name_d
3.
column name_a . field name_b . field name_c . field name_d
当标识符的含义不明确时,数据库服务器使用优先级规则来确定标识符指定的是
哪个数据库对象。请考虑下列两个表:
CREATE TABLE b (c ROW(d INTEGER, e CHAR(2));
CREATE TABLE c (d INTEGER);

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1345
在下列 SELECT 语句中,表达式 c.d 引用表 c 的列 d(而不是表 b 中列 c 的
字段 d),因为表表达式比列标识符有更高的优先级:
SELECT * FROM b,c WHERE c.d = 10;
要获取更多关于优先级规则以及如何随同 ROW 列使用点表示法的信息,请参阅
GBase 8s SQL 教程指南。
使用带有 Row 类型表达式的点表示法
除了指定 ROW 数据类型的列之外,您还可使用带有任何求值为 ROW 类型的表
达式的点表示法。例如,在 INSERT 语句中,您可在返回值的单独行的子查询中
使用点表示法。假设您创建名为 row_t 的 ROW 类型:
CREATE ROW TYPE row_t (part_id INT, amt INT);
还假设您创建了基于 row_t ROW 类型的名为 tab1 的 typed 表:
CREATE TABLE tab1 OF TYPE row_t;
还假设您将下列值插入了表 tab1:
INSERT INTO tab1 VALUES (ROW(1,7));
INSERT INTO tab1 VALUES (ROW(2,10));
最后,假设您创建了另一名为 tab2 的表:
CREATE TABLE tab2 (colx INT);
现在,您可使用点表示法来将仅从表 tab1 的 part_id 列的值插入 tab2 表内:
INSERT INTO tab2
VALUES ((SELECT t FROM tab1 t
WHERE part_id = 1).part_id);
当您想要选择 ROW 类型列的所有字段时,星号形式的点表示法不是必须的,因
为您可单独指定列名称来选择所有它的字段。然而,当您如在前面示例中那样使
用子查询,或当您调用返回 ROW 类型值的用户定义的函数时,点表示法的星号
形式可非常有用。
假设名为 new_row 的用户定义的函数返回 ROW 类型值,且您想要调用此函数来
将该 ROW 类型值插入表内。星号表示法使得指定将 new_row( ) 函数返回的所有
ROW 类型列插入表内变得非常容易:
INSERT INTO mytab2 SELECT new_row (mycol).* FROM mytab1;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1346
在分片表达式中不允许引用 ROW 类型列的字段或 ROW 类型表达式。分片表达
式是在像 CREATE TABLE、CREATE INDEX 和 ALTER FRAGMENT 那样的
SQL 语句中定义表分片或索引分片的表达式。
使用子字符串运算符
您可在 CHAR、VARCHAR、NCHAR、NVARCHAR、BYTE 和 TEXT 列上使
用子字符串运算符来定义列子字符串作为通过该表达式指定的列的一部分。
当一对方括号([ ])括起以逗号分隔的无符号整数,其中 first 整数大于零但不大
于 last 整数时,在字符列的标识符之后, GBase 8s 将方括号解释为子字符串运
算符。表达式返回列中数据值的从 first 直到 last 字符,在此 first 和 last 定义
子字符串。例如,在表达式 cat_advert [6,15] 中,返回值是列 cat_advert
的从第 6 个字符直到第 15 个字符。
在缺省的语言环境中,如果数据值占据至少 15 字节,则此表达式求值为包括该
列值的十字节的一子字符串。但在多字节语言环境中,此表达式返回十个连续的
逻辑字符的字符串,其存储长度可能超过 10 字节,以第六个逻辑字符开头。要
获取关于列子字符串的 GLS 方面的更多信息,请参阅 GBase 8s GLS 用户指南。
在下列示例中,如果 customer 表的 lname 列中的值是 Greenburg,则下列表达
式求值为 burg:
lname[6,9]
条件表达式可包括使用子字符串运算符 ( [ first, last ] ) 的列表达式,如下例所
示:
SELECT lname FROM customer WHERE phone[5,7] = '356';
此处需要引号来防止数据库服务器将数值过滤器应用到标准值中的数字。
另请参阅 字符串操纵函数 部分,其描述两个可指定 SQL 语句内子字符串表达
式的内建的 SQL 函数,SUBSTR( ) 和 SUBSTRING( )。
注: 数据库服务器可使用通过子字符串运算符定义的子字符串作为查询中的索引
过滤器。然而,对于由 SUBSTR( ) 或 SUBSTRING( ) 定义的子字符串,或对于其
他内建的字符串操纵函数,情况并非如此。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1347
使用 Rowid
在 GBase 8s 中,您可使用与表行相关联的 rowid 列作为该行的一个属性。
rowid 列本质上是未分片的表中以及以 WITH ROWIDS 子句创建了的分片的表
中的一个隐藏列。对于每一行,rowid 列是唯一的,但它不必是顺序的。然而,
推荐您使用主键作为访问方式,而不是利用 rowid 列。
下列示例使用 SELECT 语句中的 ROWID 关键字:
SELECT *, ROWID FROM customer;
SELECT fname, ROWID FROM customer ORDER BY ROWID;
SELECT HEX(rowid) FROM customer WHERE customer_num = 106;
最后的示例展示如何获得您的行的定位的页号(0x 之后的前六位)和槽号(最后
两位)。
在包含聚集函数的查询的 Projection 子句的选择列表中,您不可使用 ROWID 关
键字。
使用 ROWNUM
ROWNUM 是数据库系统对结果集的编序排列,结果集中第一行的 ROWNUM
值为 1,第二行的 ROWNUM 值为 2 ,依次类推。
可以使用 ROWNUM 限制查询返回的总行数,如下所示。
SELECT * FROM customer WHERE ROWNUM < 10;
如果在同一查询连用ROWNUM 和 ORDER BY,则会先根据 ROWNUM 条件取
结果集,然后再重新排序,因此,以下语句可能返回与上述示例不同的结果:
SELECT * FROM customer WHERE ROWNUM < 10 ORDER BY fname;
如果想要先排序再应用 ROWNUM 条件,则可以在子查询中嵌入 ORDER BY 子
句,而将 ROWNUM 条件放置顶层查询中。例如,以下查询返回按客户编号大小
排序的前 10 行结果集。
SELECT * FROM
(SELECT * FROM customer ORDER BY customer_num)
WHERE ROWNUM < 11;
在此示例中,ROWNUM 值是第一层 SELECT 语句的值,因此,它们在子查询
已经通过 customer_num 排序后生成。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1348
注意:ROWNUM 不能使用“> ”条件。
使用智能大对象
SELECT、UPDATE 和 INSERT 语句不直接操纵智能大对象的值。相反,它们使
用句柄值(一类指针)来访问 BLOB 或 CLOB 值,如下:

SELECT 语句返回指向 projection 列表指定的 BLOB 或 CLOB 值的句
柄值。SELECT 不返回 projection 列表指定的 BLOB 或 CLOB 列的实
际值。相反,它返回指向该列数据的句柄值。

INSERT 和 UPDATE 语句不将 BLOB 或 CLOB 列的实际数据发送到
数据库服务器。相反,它们接受指向此数据的句柄值作为要插入或更新的
值。
要访问智能大对象列的数据,您必须使用下列应用编程接口(API)之一:

从一 GBase 8s ESQL/C 程序内,使用访问智能大对象的 GBase 8s
ESQL/C 库函数。要获取更多信息,请参阅 GBase 8s ESQL/C 程序员手
册。

从诸如 DataBlade 模块这样的 C 程序内,使用客户端和服务器 API。
您不可在涉及算术运算符的表达式中使用智能大对象列的名称。例如,对智能大
对象句柄值的诸如加法或减法这样的运算没有意义。
当您选择智能大对象列时,您可将句柄值赋予任何数目的列:带有相同句柄值的
所有列共享该 CLOB 或 BLOB 值。这种存储管理降低 CLOB 或 BLOB 值的磁盘空
间量,但当几个列分享同一智能大对象值时,导致下列情况:

提高在 CLOB 或 BLOB 列上锁争夺的机会。如果两列共享同一智能大
对象值,则该数据库可能被需要访问它的一列锁定。

可从多个点更新 CLOB 或 BLOB 值。
要移除这些限制,您可为需要访问它的每一列都创建单独的 BLOB 或 CLOB 数
据的副本。您可使用 LOCOPY 函数来创建现有智能大对象的副本。
您还可使用内建的函数 LOTOFILE、FILETOCLOB 和 FILETOBLOB 来访问
智能大对象值,如 智能大对象函数 中描述的那样。要获取更多关于 BLOB 和
CLOB 数据类型的信息,请参阅 GBase 8s SQL 参考指南。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1349
条件表达式
条件表达式返回依赖于条件测试的结果的值。此图展示条件表达式的语法。
条件表达式

CASE 表达式
CASE 表达式允许诸如 SELECT 语句这样的 SQL 语句返回几个可能的结果之
一,依赖于这几个条件中那哪个求值为真。
CASE 表达式有两种形式:通用的 CASE 表达式和线性的 CASE 表达式。
CASE 表达式

在 CASE 表达式中,您必须包括至少一个 WHEN 子句。随后的 WHEN 子句和
ELSE 子句是可选的。您可在 SQL 语句中您可使用列表达式的任何地方使用通
用的或线性的 CASE 表达式(例如,在 SELECT 语句的 Projection 子句中)。
搜索条件中的表达式或结果值表达式可包含子查询,且您可在另一 CASE 表达式
中嵌套 CASE 表达式。
当在聚集表达式中出现 CASE 表达式时,您不可使用 CASE 表达式中的聚集函
数。
您可指定触发器类型布尔运算符(DELETING、INSERTING、SELECTING 或
UPDATING)作为仅在触发器例程内的 CASE 表达式中的条件。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1350
下列查询片断声明两个聚集列表达式的别名:
SELECT . . .
SUM(orders.ship_weight) as o2,
COUNT(DISTINCT
CASE WHEN orders.backlog MATCHES 'n'
THEN orders.order_num END ) AS o3,
. . .
在此,SUM 的参数为 DECIMAL(8,2) 列值,且 COUNT DISTINCT 聚集以 CASE 表
达式作为它的参数。
请不要弄混 CASE 表达式与 SPL 的 CASE 语句,它们支持不同的语法和功
能。
CASE 表达式数据类型兼容性
在 CASE 表达式中,所有的结果都应为同一数据类型或可兼容的数据类型。
如果在所有 WHEN ... THEN 分支子句中的结果不是同一数据类型或兼容的数据
类型,则发生错误。
下表展示哪些字符数据类型是兼容的,以及为每一组合返回的数据类型。
表 1. 从兼容的字符数据类型返回的数据类型
数据类

NCHAR
(>255
)
NCHAR
(<=255
)
NVARCH
AR
CHAR
(<=255
)
CHAR
(>25
5)
VARCHA
R
LVARCH
AR
(>255)
LVARCH
AR
(<=255
)
NCHAR
(>255)
NCHAR NCHAR
NCHAR
NCHAR
NCHAR NCHAR
NCHAR
NCHAR
NCHAR
(<=255
)
NCHAR NCHAR
NVARCH
AR
NCHAR
NCHAR NVARCH
AR
NCHAR
NCHAR
NVARCH
AR
NCHAR NVARCH
AR
NVARCH
AR
NVARCH
AR
NCHAR NVARCH
AR
NCHAR
NVARCH
AR

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

NCHAR
(>255
)
NCHAR
(<=255
)
NVARCH
AR
CHAR
(<=255
)
CHAR
(>25
5)
VARCHA
R
LVARCH
AR
(>255)
LVARCH
AR
(<=255
)
CHAR
(<=255
)
NCHAR NCHAR
NVARCH
AR
CHAR
CHAR VARCHA
R
CHAR
CHAR
CHAR
(>255)
NCHAR NCHAR
NCHAR
CHAR
CHAR CHAR
CHAR
CHAR
VARCHA
R
NCHAR NVARCH
AR
NVARCH
AR
VARCHA
R
CHAR VARCHA
R
CHAR
VARCHA
R
LVARCH
AR
(>255)
NCHAR NCHAR
NCHAR
CHAR
CHAR CHAR
LVARCH
AR
LVARCH
AR
LVARCH
AR
(<=255
)
NCHAR NCHAR
NVARCH
AR
CHAR
CHAR VARCHA
R
LVARCH
AR
LVARCH
AR
下表展示哪些数值数据类型是兼容的,以及为每一组合返回的数据类型。
表 2. 从可兼容的数值数据类型返回的数据类型

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

INTEG
ER
SMALL
INT
SERI
AL
DECIM
AL
FLOA
T
SMALLFL
OAT
MON
EY
BIGI
NT
BIGSER
IAL
INTEGER INTEG
ER
INTEG
ER
INTEG
ER
DECIM
AL
DECIM
AL
DECIMAL MON
EY
DECIM
AL
DECIMA
L
SMALLIN
T
INTEG
ER
SMALL
INT
INTEG
ER
DECIM
AL
DECIM
AL
DECIMAL MON
EY
DECIM
AL
DECIMA
L
SERIAL INTEG
ER
INTEG
ER
SERIA
L
DECIM
AL
DECIM
AL
DECIMAL MON
EY
DECIM
AL
DECIMA
L
DECIMAL DECIM
AL
DECIM
AL
DECIM
AL
DECIM
AL
DECIM
AL
DECIMAL MON
EY
DECIM
AL
DECIMA
L
FLOAT
DECIM
AL
DECIM
AL
DECIM
AL
DECIM
AL
FLOAT FLOAT
MON
EY
DECIM
AL
DECIMA
L
SMALLFL
OAT
DECIM
AL
DECIM
AL
DECIM
AL
DECIM
AL
FLOAT SMALLFL
OAT
MON
EY
DECIM
AL
DECIMA
L
MONEY
MONEY MONEY MONEY MONEY MONEY MONEY
MON
EY
MONEY MONEY
BIGINT DECIM
AL
DECIM
AL
DECIM
AL
DECIM
AL
DECIM
AL
DECIMAL MON
EY
BIGIN
T
BIGINT
BIGSERI
AL
DECIM
AL
DECIM
AL
DECIM
AL
DECIM
AL
DECIM
AL
DECIMAL MON
EY
BIGIN
T
BIGSER
IAL
通用的 CASE 表达式
通用的 CASE 表达式测试 WHEN 子句中为真的条件。如果它发现为真的条件,
则它返回在 THEN 子句中指定的结果。
通用的 CASE 表达式


GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1353
元素
描述
限制
语法
expr
返回某种数据类
型的表达式
在 THEN 子句中的 expr 的数据类型必须
与在其他 THEN 子句中的表达式的数据类
型相兼容
表达式
数据库服务器以 WHEN 子句在该语句出现的顺序处理它们。如果 WHEN 子句
的搜索条件求值为 TRUE,则数据库服务器使用对应的 THEN 表达式的值作为结
果,并停止处理该 CASE 表达式。
如果没有 WHEN 条件求值为 TRUE,则数据库服务器使用 ELSE 表达式作为总
的结果。如果没有 WHEN 条件求值为 TRUE,且未指定了 ELSE 子句,则返回
的 CASE 表达式值为 NULL。您可使用 IS NULL 条件来处理 NULL 结果。要
获取更多关于如何处理 NULL 值的信息,请参阅 IS NULL 和 IS NOT NULL 条
件。
下一示例展示 Projection 子句中通用的 CASE 表达式。
在此示例中,用户检索每一客户的名称和地址以及基于那个顾客存在的问题的数
目而计算出的数值:
SELECT cust_name,
CASE
WHEN number_of_problems = 0
THEN 100
WHEN number_of_problems > 0 AND number_of_problems < 4
THEN number_of_problems * 500
WHEN number_of_problems >= 4 and number_of_problems <= 9
THEN number_of_problems * 400
ELSE
(number_of_problems * 300) + 250
END,
cust_address
FROM custtab
在通用的 CASE 表达式中,所有的结果都应为同一数据类型,或它们应求值为以
共同兼容的数据类型。如果在所有 WHEN 子句中的结果不是同一数据类型,或
如果它们未求值为相互兼容的类型的值,则发生错误。要获取更多关于返回的数
据类型的兼容性的信息,请参阅 CASE 表达式数据类型兼容性。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1354
线性的 CASE 表达式
线性的 CASE 表达式将跟在 CASE 关键字之后的表达式的值与 WHEN 子句中
的表达式作比较。
线性的 CASE 表达式

元素
描述
限制
语法
expr
返回某种
数据类型
的值的表
达式
跟在 WHEN 关键字之后的 expr 的数据类型必
须与跟在 CASE 关键字之后的表达式的数据类
型相兼容。THEN 子句中的 expr 的数据类型必
须与其他 THEN 子句中表达式的数据类型相兼
容。
表达式
数据库服务器对跟在 CASE 关键字之后的表达式求值,然后顺序地处理 WHEN
子句。如果 WHEN 关键字之后的表达式返回的值与跟在 CASE 关键字之后的表
达式的一样,则数据库服务器使用跟在 THEN 关键字之后的表达式的值作为该
CASE 表达式的总结果。然后,数据库服务器停止处理该 CASE 表达式。
如果没有 WHEN 表达式返回与跟在 CASE 关键字之后的表达式相同的值,则数
据库服务器使用 ELSE 子句的表达式作为该 CASE 表达式的总结果(或,如果
未指定了 ELSE 子句,则该 CASE 表达式的返回值为 NULL)。
下一示例展示 SELECT 语句的 Projection 子句的 projection 列表中的线性的
CASE 表达式。对于电影标题表中的每部电影,该查询返回电影的标题、成本和类
型。该语句使用 CASE 表达式来派生每部电影的类型:
SELECT title, CASE movie_type
WHEN 1 THEN 'HORROR'
WHEN 2 THEN 'COMEDY'
WHEN 3 THEN 'ROMANCE'
WHEN 4 THEN 'WESTERN'
ELSE 'UNCLASSIFIED'

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1355
END,
our_cost FROM movie_titles;
在线性的 CASE 表达式中,WHEN 子句表达式的数据类型必须与跟在 CASE 关
键字之后的表示的数据类型相兼容。
ISNULL 函数
ISNULL 表达式返回不同的结果,这取决于于它的第一个参数求值是否为 NULL。
ISNULL 函数

元素
描述
限制
语法
expr1
expr2
返回兼容的数据类型的值的
表达式

表达式
ISNULL 对 expression1 求值。如果 expression1 不是 NULL,则 ISNULL 返
回 expression1 的值。如果 expression1 为 NULL,则 ISNULL 返回
expression2 的值。
表达式 expression1 和 expression2 可为任何数据类型,只要可将它们强制转型
为共同的兼容的数据类型。
NVL 函数
NVL 表达式返回不同的结果,这依赖于它的第一个参数求值是否为 NULL。
NVL 函数

元素
描述
限制
语法
expr1
expr2
返回兼容的数据类型的值的
表达式
不可为主变量或 BYTE 或
TEXT 对象
表达式

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1356
NVL 对 expression1 求值。如果 expression1 不是 NULL,则 NVL 返回
expression1 的值。如果 expression1 为 NULL,则 NVL 返回 expression2 的
值。表达式 expression1 和 expression2 可为任何数据类型,只要可将它们强制
转型为共同的兼容的数据类型。
假设 employees 表的 addr 列在有些行中有 NULL 值,且用户想要能够为这些行
打印标签 Address unknown。 当 addr 列有 NULL 值时,用户输入下列 SELECT
语句来显示标签 Address unknown:
SELECT fname, NVL (addr, 'Address unknown') AS address FROM
employees;
NULLIF 函数
NULLIF 表达式返回不同的结果,这依赖于它的两个参数是否相等。
NULLIF 函数

元素
描述
限制
语法
expr1
expr2
返回兼容的数据类型的值的
表达式
不可为 BYTE 或 TEXT 数据
类型
表达式
NULLIF 对它的两个参数 expr1 和 expr2 求值。

如果它们的值相等,则 NULLIF 返回 NULL。

如果它们的值不等,则 NULLIF 返回 expr1。
expr1 与 expr2 参数可为存在内建的比较函数的任何数据类型,或可强制转型为
有内建的比较函数的相兼容的数据类型的任何两种数据类型。
下列示例使用 NULLIF 函数来将布尔 FALSE 值('f')转换为 NULL 值:
SELECT name, answer, NULLIF(answer, 'f') FROM booktab;
在此,第一个参数是可有真('t')或假('f')值的布尔列表达式,且第二个布尔参
数始终为 'f"(表示 FALSE)。对于在 answer 列中有 'f' 的行,通过 NULLIF
函数返回的值会是 NULL(因为当参数相等时,返回 NULL 值)。然而,对于

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1357
有 't' 作为第一个参数,通过 NULLIF 返回的值总是 't',因为当一个是 't' 而其
他的是 'f' 时,两个参数不可相等;当两个值不相等时,返回第一个参数。
DECODE 函数
DECODE 表达式类似于 CASE 表达式,它能够根据指定列中找到的值打印不同
的结果。
DECODE 函数

元素
描述
限制
语法
expr
可对其值和数据类
型求值的表达式

表达式
when_expr
对比值
when_expr 和expr 的数据
类型必须一致、
when_expr 的值不可为
NULL。
表达式
then_expr
对应 when_expr 的
返回值
与 when_expr 成对出现,
多个 then_expr 值可以是
不同数据类型。但是:

当第一个 then_expr 是
数值型时,其它
then_expr 不允许为日
期型;

当第一个 then_expr 是
日期型时,其它
then_expr 不允许为非
整数数值型;

表达式
else_expr
缺省值
可以省略。
表达式

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1358
表达式 expr、when_expr 和 then_expr 是必需的。DECODE 对 expr 求值,并
把它和 when_expr 比较。如果 when_expr 的值与 expr 的值相匹配,则
DECODE 返回 then_expr。
表达式 when_expr 和 then_expr 是一个表达式对,并且可以在 DECODE 函数
中指定任意数量的表达式对。在所有情况下,DECODE 都把表达式对中的第一
个成员和 expr 比较,如果第一个成员和 expr 相匹配,那么就返回第二个成员。
如果没有表达式与 expr 匹配,DECODE 就返回 else_expr。如果没有表达式与
expr 相匹配,并且未指定 else_expr,则 DECODE 返回 NULL。
假设用户要将 students 表的 evaluation 列中的描述性值在输出中的转换为数
字值。下表给出了 students 表的内容。
firstname
evaluation
Edward
Great
Joe
Not done
Mary
Good
Jim
Poor
现在,用户输入带有 DECODE 函数的查询,将 evaluation 列中的描述性值转换
为等同的数值:
SELECT firstname, DECODE(evaluation,
'Poor', 0,
'Fair', 25,
'Good', 50,
'Very Good', 75,
'Great', 100,
-1) as grade
FROM students;
此 SELECT 语句的输出如下所示:
firstname evaluation
---------- -----------
Edward 100
Joe -1

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1359
Mary 50
Jim 0
可以为参数指定任何数据类型。如果多个 then_expr 值的数据类型不一致,
DECODE() 函数返回的结果值的数据类型同第一个 then_expr 值的数据类型相同。
当返回的结果值数据类型与第一个 then_expr 值的数据类型不同时,会自动按照
以下规则进行隐式转换:

支持数值型、日期型转换为字符型;

支持纯数值(科学计数法)字符串转换为数值型;

支持日期型字符串转换为日期型;

支持整数数值型转换为日期型。
a) 整数值范围:[-2147483648,214783647]
b) 整数 0 转换为 1899-12-31 00:00:00.00000,数值每增加或减少 1,日
期相应增加或减少 1 天。

支持数值型字符串转换为日期型
将数值型字符串转换为数值型数据。对于浮点数,截断小数点后面的数字,只
保留整数部分,然后按照上一条规则进行处理。
示例 1:返回字符型结果值
SELECT DECODE(1,1,’aa’,2,456,3,’789’,000)from dual;
返回结果为:aa
该语句返回的结果值的数据类型为字符型,与第一个 then_expr 值(‘aa’)的类
型一致。
示例 2:返回数值型结果值
SELECT DECODE(400,100,1+2,300,’aa’,66)from dual;
返回结果为:66.0000000000000
该语句最终返回的结果值的数据类型为 decimal 。
示例 3:返回日期型结果值

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1360
SELECT DECODE(3,100,today,2,’aa’,3,sysdate,6)from dual;
返回结果为:2018-08-30 16:00:48.00000
SELECT DECODE(4,100,today,2,’aa’,3,sysdate,1)from dual;
返回结果为:1900-01-01 00:00:0.00000
该语句最终返回的结果值的数据类型为日期型,与第一个 then_expr 值(today)
的类型一致。并将符合条件的返回值 1 转换为日期1900-01-01 00:00:0.00000。
常量表达式
返回固定的值的某些表达式称为常量表达式。这些包括读取系统时钟的变量函数
运算符,但在字面常量也是有效的上下文中才是有效的。
在这些表达式之中有下列运算符(或系统常量)),在运行时确定其返回的值:

CURRENT 从系统时钟返回当前的时间和日期。

CURRENT_ROLE 返回角色的名称(如果有的话),为当前用户启用其
权限。

CURRENT_USER 是 USER 的同义词。

DEFAULT_ROLE 返回角色的名称(如果有的话),是当前用户的缺省
角色。

DBSERVERNAME 返回当前数据库服务器的名称。

SITENAME 是 DBSERVERNAME 的同义词。

SYSDATE 从系统时钟读取 DATETIME 值,像 CURRENT 运算符一
样,但有不同的缺省精度。

TODAY 从系统时钟返回当前的日历日期。

USER 返回当前用户的登录名称(也称为授权标识符)。
除了这些运算符,术语常量表达式还指括起来的字符串、文字值或带有运算对象
的 UNITS 运算符。
常量表达式段有下列语法。
常量表达式

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

元素
描述
限制
语法
literal
Boolean
BOOLEAN 值的文字表示
必须为 t (TRUE) 或
f (FALSE)
引用字符串
literal
opaque
type
opaque 数据类型的值的
文字表示
必须被 opaque 类型
的输入支持函数所识

由 UDT 开发者
定义
num
指定时间单位的数量。
请参阅 UNITS 运算符。
如果 num 不是整
数,则截断小数部分
精确数值
owner
序列的所有者的名称
必须拥有序列
所有者名称

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1362
元素
描述
限制
语法
precision
返回的 DATETIME 表达
式的精度
在 Windows™ 系统
上,秒的最大范围是
FRACTION(3)。
DATETIME 字段
限定符
sequence
序列的名称
在当前数据库中必须
存在
标识符
synonym
序列的名称的同义词
在当前数据库中必须
存在
标识符
time_unit
指定时间单位的关键
字:YEAR、MONTH、
DAY、HOUR、MINUTE、
SECOND 或 FRACTION
必须为左边的关键字
之一。不区分大小
写,但不可括在引号

请参阅
Restrictions
列。
引用的字符串
下列示例展示作为表达式的引用的字符串:
SELECT 'The first name is ', fname FROM customer;
INSERT INTO manufact VALUES ('SPS', 'SuperSport');
UPDATE cust_calls SET res_dtime = '2007-1-1 10:45'
WHERE customer_num = 120 AND call_code = 'B';
要获取更多信息,请参阅 引用字符串。

精确数值
精确数值指定数值值。
下列示例展示作为表达式的精确数值:
INSERT INTO items VALUES (4, 35, 52, 'HRO', 12, 4.00);
INSERT INTO acreage VALUES (4, 5.2e4);
SELECT unit_price + 5 FROM stock;
SELECT -1 * balance FROM accounts;
要获取更多信息,请参阅 精确数值。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1363
USER 或 CURRENT_USER 运算符
USER 运算符返回包含正在运行该进程的当前用户的登录名称(也称为授权标识
符)的字符串。CURRENT_USER 运算符是 USER 运算符的同义词。
下列语句展示您可以如何使用 USER 运算符:
INSERT INTO cust_calls VALUES
(221,CURRENT,USER,'B','Decimal point off', NULL, NULL);
SELECT * FROM cust_calls WHERE user_id = USER;
UPDATE cust_calls SET user_id = USER WHERE customer_num = 220;
USER 不更改用户 ID 的字母大小写。如果您在表达式中使用 USER 且当前用
户为 Robertm,则 USER 运算符返回 Robertm,而不是 robertm 或
ROBERTM。
如果您指定 USER 作为缺省的列值,则 column 必须为类型 CHAR、
VARCHAR、NCHAR、NVARCHAR 或 LVARCHAR。
如果您指定 USER 作为列的缺省值,则 column 的大小应不小于 32 字节。如
果该列长度太小以至于不能存储缺省值,则在诸如 INSERT 或 ALTER TABLE
这样的操作期间,您会面临出错的风险。
在符合 ANSI 的数据库中,如果您不将 owner 名称括在引号中,则将表所有者
的名称存储为大写字母。如果您使用 USER 运算符作为条件的一部分,则您必须
确保存储 user 名称的方法与 USER 运算符返回的内容在字母大小写方面相匹
配。
CURRENT_ROLE 运算符
CURRENT_ROLE 运算符返回包含正在运行会话的用户的当前启用的角色的名
称的字符串。或使用 SET ROLE 语句在会话中显式地设置了此 role ,或当当前
用户连接到数据库时,隐式地设置为缺省的角色。如果该用户不持有角色,或如
果未授予当前启用的用户角色,则 CURRENT_ROLE 返回 NULL 值。如果尚
未授予了用户角色,但已将缺省角色授予了 PUBLIC,且已显式地或隐式地启用
了此缺省角色,则 CURRENT_ROLE 返回此缺省角色的名称。
下一语句展示您可以如何使用 CURRENT_ROLE 运算符:
select CURRENT_ROLE FROM systables WHERE tabid = 1;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1364
CURRENT_ROLE 运算符不更改角色的标识符的字母大小写。如果您在表达式
中使用 CURRENT_ROLE,且当前角色为 Czarina,则 CURRENT_ROLE 运
算符返回 Czarina,而不是 czarina。
如果您指定 CURRENT_ROLE 作为列的缺省值,则该列必须有 CHAR、
VARCHAR、LVARCHAR、NCHAR 或 NVARCHAR 数据类型。因为角色的名
称是授权标识符,因此如果列长度小于 32 字节,则可能发生截断。
DEFAULT_ROLE 运算符
DEFAULT_ROLE 运算符求值为包含已授予了正在运行会话的用户的缺省角色的
名称的字符串。此缺省角色无需当前已经启用,但自从最近的 GRANT DEFAULT
ROLE 语句在 TO 子句引用的该用户或 PUBLIC 以来,它必须未被调用。
如果没有为当前用户显式地定义缺省角色,但 PUBLIC 有缺省角色,则
DEFAULT_ROLE 返回 PUBLIC 的缺省角色。
如果用户没有缺省角色,或如果最近将缺省角色显式地授予了该用户,或随后通
过 REVOKE DEFAULT ROLE 语句作为 PUBLIC 调用了,则
DEFAULT_ROLE 返回 NULL 值。如果用户尚未被单个地授予了缺省角色,但
已将缺省角色授予了 PUBLIC,则 DEFAULT_ROLE 运算符返回此缺省角色的
名称。然而,如果当前未为用户也未为 PUBLIC 定义缺省角色,则
DEFAULT_ROLE 返回 NULL。
SET ROLE 语句对 DEFAULT_ROLE 运算符不起作用,但如果 SET ROLE 已
激活了某其他角色,或如果 SET ROLE 指定了 NULL 或 NONE 作为用户的当
前角色,则用户没必要获得缺省角色的任何访问权限。
下一语句展示您可以如何使用 DEFAULT_ROLE 运算符:
select DEFAULT_ROLE from systables where tabid = 1;
DEFAULT_ROLE 不更改角色的标识符的字母大小写。
如果您指定 DEFAULT_ROLE 作为列的缺省值,则该列必须有 CHAR、
VARCHAR、LVARCHAR、NCHAR 或 NVARCHAR 数据类型。由于角色的名
称是授权标识符,因此如果列宽小于 32 字节,则可能发生截断。(要了解授权
标识符的语法,请参阅 所有者名称。)

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1365
DBSERVERNAME 和 SITENAME 运算符
DBSERVERNAME 运算符返回数据库服务器的 SQL 标识符,如同当前数据库
所在的 GBase 8s 实例的 ONCONFIG 文件中 DBSERVERNAME 参数所定义的
那样,或如同 GBASEDBTSERVER 环境变量中所指定的那样。SITENAME 是
DBSERVERNAME 运算符的关键字同义词。
您可使用 DBSERVERNAME 运算符来指定表的位置,将信息放到表内,或从表
抽取信息。您可将 DBSERVERNAME 插入到简单字符字段内或使用它作为列的
缺省值。
如果指定 DBSERVERNAME 作为 CREATE TABLE 或 ALTER TABLE 语句中
的缺省列值,则该列必须为 CHAR、VARCHAR、LVARCHAR、NCHAR 或
NVARCHAR 数据类型。
如果您指定 DBSERVERNAME 或 SITENAME 作为列的缺省值,则该列的大
小应至少为 128 字节长。如果列的长度太小以至于不能存储缺省值,则在
INSERT 和 ALTER TABLE 操作期间,您会面临得到错误消息的风险。
下列示例在 DML 语句中使用 DBSERVERNAME 或 SITENAME。

第一个 SELECT 语句返回 customer 表所在的数据库服务器实例的名
称。(因为查询不受 WHERE 子句的限制,所以它为表中每行返回相同
的 DBSERVERNAME 值。如果您在 projection 子句中包括 DISTINCT
关键字,则数据库仅返回 DBSERVERNAME 一次。)

第二个语句将包含当前数据库服务器的名称的行添加到表。

第三个语句返回在 host_tab.site_col 列中有当前数据库服务器的名称的
所有行。

最后的语句将当前数据库服务器的名称更改为其 customer_num 的
SERIAL 值为 120 的行中 customer.company 列的值:
SELECT DBSERVERNAME FROM customer;
INSERT INTO host_tab VALUES ('1', SITENAME);
SELECT * FROM host_tab WHERE site_col = DBSERVERNAME;
UPDATE customer SET company = SITENAME WHERE customer_num =
120;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1366
TODAY 运算符
使用 TODAY 运算符来返回系统日期作为 DATE 数据类型。如果您指定
TODAY 作为缺省的列值,则该列必须为 DATE 列。
下列示例展示您可以在 INSERT、UPDATE 或 SELECT 语句中如何使用 TODAY 运算
符:
UPDATE orders (order_date) SET order_date = TODAY WHERE order_num =
1005;
INSERT INTO orders VALUES (0, TODAY, 120, NULL, N, '1AUE217', NULL,
NULL, NULL, NULL);
SELECT * FROM orders WHERE ship_date = TODAY;
要获取设置非缺省的时区的代码示例,请参阅 CURRENT 运算符。
CURRENT 运算符
CURRENT 运算符返回带有今日的日期和时间的 DATETIME 值,展示当前时
刻。
如果您未指定 DATETIME 限定符,则缺省的限定符为 YEAR TO
FRACTION(3)。当数据库服务器从操作系统获取当前时间时,USEOSTIME 配置
参数指定它是否使用亚秒精度。要获取更多关于 USEOSTIME 配置参数的信息,
请参阅您的 GBase 8s 管理员参考手册。
您可在字面 DATETIME 为有效的任何上下文中使用 CURRENT。(请参阅 文字的
DATETIME)。如果您指定 CURRENT 作为列的缺省值,则它必须为 DATETIME 列且
CURRENT 的限定符必须与列限定符相匹配,如下列示例所示:
CREATE TABLE new_acct (col1 INT, col2 DATETIME YEAR TO DAY
DEFAULT CURRENT YEAR TO DAY);
始终在当前数据库所在的数据库服务器中为 CURRENT 求值。如果当期数据库
在远程数据库服务器中,则从远程主机返回值。
SQL 不是过程的语言,且 CURRENT 可能不以在语句中它的位置的词典次序执
行。在 SQL 语句的执行中,您不应使用 CURRENT 来标记开始、终止、特定
的点。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1367
如果您在单个语句中使用 CURRENT 运算符超过一次,则可能由 CURRENT 的
每一实例返回相同的值。您不可依靠 CURRENT 来在它每次执行时返回不同的
值。
当指定 CURRENT 的 SQL 语句启动执行时,该返回值基于系统时钟且是固定
的。例如,从 EXECUTE FUNCTION(或 EXECUTE PROCEDURE)语句调用的
SPL 函数之内,对 CURRENT 的任何调用都返回当 SPL 函数启动时系统时钟
的值。
在 UNIX™ 和 Linux™ 系统上,通过 CURRENT 运算符返回的值的精度由它的
DATETIME 限定符决定,精度范围可从单个时间单位(诸如 MONTH TO
MONTH)直到 YEAR TO FRACTION (5)。然而,在 Windows™ 上的系统时钟
仅返回亚秒精度。即使您在 DATETIME 限定符中指定 "FRACTION(5)",
Windows 上的 CURRENT 运算符也不支持高于 "FRACTION(3)" 的精度。
如果您的平台不提供以亚秒精度的当前时间返回的系统调用,则 CURRENT 为
FRACTION 字段返回零。
在下列示例中,第一个语句使用 WHERE 条件中的 CURRENT。第二个语句使用
CURRENT 作为 DAY 函数的参数。最有的查询选择其 call_dtime 值在从 2007 年
初到当前时刻的范围内的行:
DELETE FROM cust_calls WHERE res_dtime < CURRENT YEAR TO MINUTE;
SELECT * FROM orders WHERE DAY(ord_date) < DAY(CURRENT);
SELECT * FROM cust_calls WHERE call_dtime BETWEEN '2007-1-1 00:00:00'
AND CURRENT;
要获取更多信息,请参阅 DATETIME 字段限定符。
SYSDATE 运算符
SYSDATE 运算符从系统时钟返回当前的 DATETIME 值。SYSDATE 与
CURRENT 运算符是相同的,除了 SYSDATE 的缺省精度是 YEAR TO
FRACTION(5),而 CURRENT 的缺省精度是 YEAR TO FRACTION(3)。
在不支持 seconds 范围大于 FRACTION(3) 的 Windows™ 平台上,SYSDATE
实际上是 CURRENT 运算符的同义词。
您可在 CURRENT 运算符有效的任何上下文中使用 SYSDATE。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1368
在下列示例中的 SQL 语句使用 SYSDATE 运算符来为数据库的两个 DATETIME 列
指定缺省值,并将新行插入到该表内:
CREATE TABLE tab1 (
id SERIAL,
value CHAR(20),
time1 DATETIME YEAR TO FRACTION(5) DEFAULT SYSDATE,
time2 DATETIME YEAR TO SECOND DEFAULT SYSDATE YEAR
TO SECOND
);
INSERT INTO tab1 VALUES (0, 'description', SYSDATE, SYSDATE);
下列查询访问在前面的示例中创建了的表:
SELECT SYSDATE AS sysdate, * FROM tab1;
当发出 INSERT 和 SELECT 语句时,结果对日期和时间是灵敏的,但在 2007
年 9 月 23 日该查询可能返回这些值:
sysdate 2007-09-23 21:30:23.00000
id 1
value description
time1 2007-09-23 21:29:27.00000
time2 2007-09-23 21:29:27
下一查询访问同一表,使用 WHERE 子句中的 SYSDATE 作为 DAY 函数的一个参
数:
SELECT *, DAY(time1) AS day FROM tab1
WHERE DAY(time1) = DAY(SYSDATE);
在 2007 年 9 月 23 日,该查询可能返回这些值:
id 1
value description
time1 2007-09-23 21:29:27.00000
time2 2007-09-23 21:29:27
day 23
仅 GBase 8s 支持 SYSDATE。除了它的名称和它的缺省精度之外,在本文档中
CURRENT 运算符的描述也适用于 SYSDATE 运算符。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1369
文字的 DATETIME
文字的 DATETIME 指定 DATETIME 数据类型的值,包括它的限定的时间单
位。
下列示例展示作为表达式的文字的 DATETIME:
SELECT DATETIME (2007-12-6) YEAR TO DAY FROM customer;
UPDATE cust_calls SET res_dtime = DATETIME (2008-07-07 10:40)
YEAR TO MINUTE
WHERE customer_num = 110
AND call_dtime = DATETIME (2008-07-07 10:24) YEAR TO MINUTE;
SELECT * FROM cust_calls
WHERE call_dtime
= DATETIME (2008-12-25 00:00:00) YEAR TO SECOND;
要获取更多信息,请参阅 文字的 DATETIME。
文字的 INTERVAL
文字的 INTERVAL 指定 INTERVAL 数据类型的值,包括它的限定的时间单
位。
下列每一示例使用文字的 INTERVAL 作为表达式:
INSERT INTO manufact VALUES ('CAT', 'Catwalk Sports',
INTERVAL (16) DAY TO DAY);
SELECT lead_time + INTERVAL (5) DAY TO DAY FROM manufact;
第二个示例将五天添加到从 manufact 表选择的每一 lead_time 的值。
要获取更多信息,请参阅 文字的 INTERVAL。
UNITS 运算符
UNITS 运算符指定其精度仅包括一个时间单位的 INTERVAL 值。您可在
INTERVAL 或 DATETIME 值中增加或减少一个时间单位的算术表达式中使用
UNITS。
如果 num 运算对象不是整数,则当数据库服务器为该表达式求值时,将它截断
到与指定的值相同的(或更接近于零的)完整数。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1370
在下列示例中,第一个 SELECT 语句使用 UNITS 运算符来选择所有增加了五天
的 manufacturer.lead_time 值。第二个 SELECT 语句找到放置了超过 30 天的
所有呼叫。
如果 WHERE 子句中的表达式返回一大于 99(最大的天数)的值,则查询失败。
最后的语句为 ANZE 制造商增加两天的交付时间:
SELECT lead_time + 5 UNITS DAY FROM manufact;
SELECT * FROM cust_calls WHERE (TODAY - call_dtime) > 30 UNITS DAY;
UPDATE manufact SET lead_time = 2 UNITS DAY + lead_time
WHERE manu_code = 'ANZ';
NEXTVAL 和 CURRVAL 运算符
您可在 SQL 语句中使用 NEXTVAL 或 CURRVAL 运算符来访问序列的值。
您必须以在同一数据库中存在的序列对象的名称(或同义词)来限定 NEXTVAL
或 CURRVAL,使用格式 sequence.NEXTVAL 或 sequence.CURRVAL。表达
式还可通过 owner 名称来限定 sequence,就像在 zelaine.myseq.CURRVAL 中
那样。您可指定 sequence 的标识符或有效的同义词,如果存在的话。
在符合 ANSI 的数据库中,如果您不是所有者,则您必须以其所有者的名称
(owner.sequence)来限定 sequence 的名称。
要随同序列使用 NEXTVAL 或 CURRVAL,您必须在该序列上有 Select 权限
或在数据库上有 DBA 权限。要获取更多关于序列级权限的信息,请参阅
GRANT 语句 语句。
示例
在下列示例中,假设当前没有其他用户正在访问该序列,且用户依顺序执行这些
语句。
这些示例基于下列序列对象和表:
CREATE SEQUENCE seq_2
INCREMENT BY 1 START WITH 1
MAXVALUE 30 MINVALUE 0
NOCYCLE CACHE 10 ORDER;
CREATE TABLE tab1 (col1 int, col2 int);
INSERT INTO tab1 VALUES (0, 0);

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1371
您可在 INSERT 语句的 Values 子句中使用 NEXTVAL(或 CURRVAL),如下列示
例所示:
INSERT INTO tab1 (col1, col2)
VALUES (seq_2.NEXTVAL, seq_2.NEXTVAL);
在前面的示例中,数据库服务器将增加的值(或该序列的第一个值,其为 1)插
入到表的 col1 和 col2 列内。
您可在 UPDATE 语句的 SET 子句中使用 NEXTVAL(或 CURRVAL),如下列示例所
示:
UPDATE tab1
SET col2 = seq_2.NEXTVAL
WHERE col1 = 1;
在前面的示例中,seq_2 序列的增加的值(其为 2)替代 col2 中 col1 等于 1
的值。
下列示例展示您可如何使用 SELECT 语句的 Projection 子句中的 NEXTVAL 和
CURRVAL:
SELECT seq_2.CURRVAL, seq_2.NEXTVAL FROM tab1;
在前面的示例中,数据库服务器从 CURRVAL 和 NEXTVAL 表达式返回增加
的值的两行,3 和 4。对于 tab1 的第一行,数据库服务器为 CURRVAL 和
NEXTVAL 返回增加的值 3;对于 tab1 的第二行,它返回增加的值 4。
使用 NEXTVAL
要首次访问序列,在您可引用 sequence.CURRVAL 之前,你必须引用
sequence.NEXTVAL。第一个对 NEXTVAL 的引用返回该序列的初始值。对
NEXTVAL 的每一后续的引用,都按照定义的 step 来增加该序列的值,并返回
该序列的新的增加的值。
在单个 SQL 语句之内,您可对给定的序列仅增加一次。即使您在单个语句之内
指定 sequence.NEXTVAL 多次,该序列也仅增加一次,因此,在同一 SQL 语
句中 sequence.NEXTVAL 的每次发生都返回相同的值。
除了在同一语句之内多次发生的情况之外,每个 sequence.NEXTVAL 表达式增
加该 sequence,不管您随后是提交还是回滚当前事务。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1372
如果您在最终回滚了的事务中指定 sequence.NEXTVAL,则可能跳过某些序列编
号。
使用 CURRVAL
任何对 CURRVAL 的引用都返回指定序列的当前值,这是您最后对 NEXTVAL
引用返回的值。在您以 NEXTVAL 创建新值之后,您可继续使用 CURRVAL
来访问那值,不管另一用户是否增加该序列。
如果在 SQL 语句中同时发生 sequence.CURRVAL 和 sequence.NEXTVAL,则
该序列仅增加一次。在此情况下,每一 sequence.CURRVAL 和
sequence.NEXTVAL 表达式返回相同的值,不管 sequence.CURRVAL 和
sequence.NEXTVAL 在语句内的顺序。
对序列的并发访问
序列总是生成数据库内的唯一值,即使当多个用户并发地引用同一序列,也觉察
不到等待或锁定。当多个用户使用 NEXTVAL 来增加序列时,每一用户生成其
他用户不可见的唯一值。
当多个用户并发地增加同一序列时,每一用户看到的值发生差异。例如,一个用
户可能从序列生成一系列值,诸如 1、4、6 和 8,而另一用户从同一序列对象
并发地生成值 2、3、5 和 7。
对序列运算符的限制
NEXTVAL 和 CURRVAL 仅在 SQL 语句中有效,在 SPL 语句中不是直接有效的。
(但可在 SPL 例程中使用使用 NEXTVAL 和 CURRVAL 的 SQL 语句。)下列限制
适用于 SQL 语句中的这些运算符:

您必须有对序列的 Select 权限。

在 CREATE TABLE 或 ALTER TABLE 语句中,您不可在下列上下文中
指定 NEXTVAL 或 CURRVAL:
o
在列定义的 Default 子句中
o
在检查约束的定义中。

在 SELECT 语句中,您不可在下列上下文中指定 NEXTVAL 或
CURRVAL:

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1373
o
当使用 DISTINCT 关键字时,在 projection 列表中
o
在 WHERE、GROUP BY 或 ORDER BY 子句中
o
在子查询中
o
当 UNION 运算符组合 SELECT 语句时。

在这些上下文中,你也不可指定 NEXTVAL 或 CURRVAL:
o
在分片表达式中
o
在对另一数据库中的远程序列对象的引用中。
文字的 Row
在 Literal Row 部分中描述命名的或未命名的 ROW 数据类型的值的文字表示的
语法。下列示例展示作为表达式的文字的 row:
INSERT INTO employee VALUES
(ROW('103 Baker St', 'San Francisco',
'CA', 94500));

UPDATE rectangles
SET rect = ROW(8, 3, 7, 20)
WHERE area = 140;

EXEC SQL update table(:a_row)
set x=0, y=0, length=10, width=20;

SELECT row_col FROM tab_b
WHERE ROW(17, 'abc') IN (row_col);
要了解求值为 ROW 数据类型的字段值的表达式的语法,请参阅 ROW 构造函
数。
文字的集合
GBase 8s 支持内建的或用户定义的数据类型的值的文字表示的表达式。下列示例
展示作为表达式的文字的集合:
INSERT INTO tab_a (set_col) VALUES ("SET{6, 9, 3, 12, 4}");
INSERT INTO TABLE(a_set) VALUES (9765);

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1374
UPDATE table1 SET set_col = "LIST{3}";
SELECT set_col FROM table1 WHERE SET{17} IN (set_col);
要获取更多信息,请参阅 文字的集合。要了解元素值的语法,请参阅 集合构造
函数。
构造函数表达式
构造函数是数据库服务器用来创建特定的数据类型的实例的函数。数据库服务器
支持 ROW 构造函数和集合构造函数。
构造函数表达式

ROW 构造函数
您使用 ROW 构造函数来生成 ROW 类型列的值。
假设您创建下列命名的 ROW 类型以及包含命名的 ROW 类型 row_t 和未命名的
ROW 类型的表:
CREATE ROW TYPE row_t ( x INT, y INT);
CREATE TABLE new_tab
(
col1 row_t,
col2 ROW( a CHAR(2), b INT)
);
当您定义列作为命名的 ROW 类型或未命名的 ROW 类型时,您必须使用 ROW
构造函数来生成 ROW 类型列的值。要为命名的 ROW 类型或未命名的 ROW
类型创建值,您必须完成下列步骤:

以 ROW 关键字开始该表达式。

为每一 ROW 类型的字段指定值。

将以逗号分隔的字段值的列表括在圆括号内。
每一字段的值的格式必须与将它指定到的那个 ROW 字段的数据类型相兼容。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1375
您可使用任何类型的表达式作为带有 ROW 构造函数的值,包括文字、函数和变
量。下列示例展示使用不同类型的带有 ROW 构造函数的表达式来指定值:
ROW(5, 6.77, 'HMO')
ROW(col1.lname, 45000)
ROW('john davis', TODAY)
ROW(USER, SITENAME)
下列语句使用带有 ROW 构造函数的字面的数值和引用的字符串来将值插入到
new_tab 表的 col1 和 col2 内:
INSERT INTO new_tab
VALUES
(
ROW(32, 65)::row_t,
ROW('CA', 34)
);
当您使用 ROW 构造函数来生成命名的 ROW 类型的值时,您必须显式地将
ROW 强制转型为适当的命名的 ROW 类型。 强制转型有必要生成命名的 ROW
类型的值。要将 ROW 值强制转型为命名的 ROW 类型,您可使用强制转型运算
符(:: )或 CAST AS 关键字,如下例所示:
ROW(4,5)::row_t
CAST (ROW(3,4) AS row_t)
您可使用 ROW 构造函数来在 INSERT、UPDATE 和 SELECT 语句中生成
ROW 类型值。在下一示例中,SELECT 语句的 WHERE 子句指定强制转型为类
型 person_t 的一个 ROW 类型值:
SELECT * FROM person_tab
WHERE col1 = ROW('charlie','hunter')::person_t;
要获取更多关于在 INSERT 和 UPDATE 语句中使用 ROW 构造函数的信息,
请参阅本文档中的 INSERT 和 UPDATE 语句。要获取关于命名的 ROW 类型
的信息,请参阅 CREATE ROW TYPE 语句。要获取关于未命名的 ROW 类型,
请参阅 GBase 8s SQL 参考指南 中的 ROW 数据类型的讨论。要了解关于命名的
ROW 类型和未命名的 ROW 类型的面向任务的信息,请参阅 GBase 8s 数据库
设计和实现指南。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1376
集合构造函数
使用集合构造函数来为集合列指定值。
集合构造函数

您可在 SELECT 语句的 WHERE 子句中以及 INSERT 语句的 VALUES 子句中
使用集合构造函数。您还可将集合构造函数传递给 UDR。
此表区分您可构造的集合的类型。
关键字
描述
SET
表明带有下列性质的集合元素:

该集合必须包含唯一的值。

元素有与他们相关联的特定的顺序。
MULTISET 表明带有下列性质的元素的集合:

该集合可包含重复的值。

元素没有与他们相关联的特定的顺序。
LIST
表明带有下列性质的元素的集合:

该集合可包含重复的值。

元素有顺序位置。
集合的元素类型可为任何内建的或扩展的数据类型。您可随同集合构造函数使用
任何类型的表达式,包括文字、函数和变量。
当您使用带有表达式的列表的集合构造函数时,数据库服务器将每一表达式求值
为它等同的文字,并使用文字的值来构造该集合。
您可以一系列大括号( { } )指定空集合。
集合的元素不可为 NULL。如果集合元素求值为 NULL 值,则数据库服务器返
回错误。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1377
每一表达式的元素类型必须全都是完全相同的数据类型。要实现这一点,将整个
集合构造函数表达式强制转型为集合类型,或将个别的元素表达式强制转型为同
一类型。如果数据库服务器不可确定集合类型与元素类型是同类的,则集合构造
函数返回错误。在主变量的情况下,在客户端声明主变量的元素类型的绑定时刻
作出此决定。
当集合的有些元素是 VARCHAR 数据类型但其他的长度不长于 255 字节时,可
发生对此限制的例外。在此,集合构造函数可将 CHAR(n) 类型指定给所有元
素,n 是以字节计的最长的元素的长度。(但是,请参阅 集合数据类型 了解基
于此例外的示例,用户通过显式的强制转型为 LVARCHAR 数据类型来避免固定
长度的 CHAR 元素。)
集合构造函数的示例
下列示例展示您可以不同的表达式构造集合,如果结果值是同一数据类型的话:
CREATE FUNCTION f (a int) RETURNS int;
RETURN a+1;
END FUNCTION;
CREATE TABLE tab1 (x SET(INT NOT NULL));
INSERT INTO tab1 VALUES
(
SET{10,
1+2+3,
f(10)-f(2),
SQRT(100) +POW(2,3),
(SELECT tabid FROM systables WHERE tabname = 'sysusers'),
'T'::BOOLEAN::INT}
);
SELECT * FROM tab1 WHERE
x=SET{10,
1+2+3,
f(10)-f(2),
SQRT(100) +POW(2,3),
(SELECT tabid FROM systables WHERE tabname = 'sysusers'),
'T'::BOOLEAN::INT}
};

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1378
这假设存在从 BOOLEAN 到 INT 的强制转型。(要了解对指定集合值的更限制
性的语法,请参阅 文字的集合。)
NULL 关键字
在您可指定值的大部分上下文中,NULL 关键字是有效的。然而,它指定的内容
没有任何值(或未知的或遗失的值)。
NULL 关键字

在 SQL 内,关键字 NULL 是访问 NULL 值的唯一语法机制。NULL 不等同于
零,也不等同于任何特定的值。在升序的 ORDER BY 操作中,NULL 值排在任
何非 NULL 值之前;在降序排序中,NULL 值跟在任何非 NULL 值之后。在
GROUP BY 操作中,所有 NULL 值都组在一起。(如果它们包括遗失的值或未
知的值,则这样的分组可能在逻辑上是各种各样的。)
在表达式的语法上下文中,关键字 NULL 是全局的符号,意味着它的引用作用域
是全局的。
每种数据类型,不论内建或用户定义的,都可以代表 NULL 值。本版本 GBase
8s 支持以下两种形式的 NULL 查询:

在投影列表中直接包含 NULL 关键字,无需强制转型。

在投影列表中包含 NULL::datatype 形式的强制转型表达式,其中
datatype 是数据库服务器已知的任何数据类型。
GBase 8s 在一般表达式中支持已归类的 NULL 关键字。在某些情境下单独的
NULL 将导致 -201 语法错误。因此,如果 NULL 定义为列名称或过程名称,那
么它必须以通过表别名被引用。否则,将返回 -201 语法错误。以下示例和结果
可总结该行为:
create table tab1 (a int, null int);
create table tab2 (a int, b int);
表 1. NULL 行为

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1379
语句
结果
select null from tab1 where a = 1
-201 语法错误
select * from tab1 where null = a
-201 语法错误
select * from tab1 where tab1.null = a
有效的语法
select * from tab1 where a = null
-201 语法错误
select * from tab2 where a = null
-201 语法错误
select * from tab2 where null = a
-201 语法错误
select * from tab2 where null = a
-201 语法错误
select NULL::int from tab1
有效的语法
select NULL from tab1
有效的语法
select NULL::int from tab1
有效的语法
select 1 + NULL::int from tab1
有效的语法
select 1 + NULL::int from tab2
有效的语法
select NULL::int + 1 from tab1
有效的语法
GBase 8s 禁止重新定义 NULL,因为允许这样定义会限制 NULL 关键字的全局
作用域。为此,任何限制全局作用域或重新定义关键字 NULL 的作用域的机制都
会在语法上禁用涉及 NULL 值的任何强制转型表达式。您必须确保关键字
NULL 的发生在所有表达式上下文中收到它的全局作用域。
例如,请考虑下列 SQL 代码:
CREATE TABLE newtable
(
null int
);

SELECT null, null::int FROM newtable;
CREATE TABLE 语句是有效的,因为列标识符具有限定到表定义的引用的作用
域;仅可在表的作用域内访问它们。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1380
然而,在该示例中的 SELECT 语句引起一些语法的多义性。出现在 projection
列表中的标识符 null 引用全局的关键字 NULL 吗?它引用在 CREATE TABLE 语
句中声明了的列标识符 null 吗?

如果将标识符 null 解释作为列名称,则带有 NULL 关键字的强制转型
表达式的全局作用域将会受限。

如果将标识符 null 解释作为 NULL 关键字,则 SELECT 语句必须为
null 的发生生成语法错误,因为 NULL 关键字仅可作为强制转型表达式
出现在 projection 列表中。
下列形式的 SELECT 语句是有效的,因为以表名称限定 newtable 的 NULL
列:
SELECT newtable.null, null::int FROM newtable;
在有名为 null 的变量的 SPL 例程的上下文中,会出现更多语法的多义性。示例
如下:
CREATE FUNCTION nulltest() RETURNING INT;
DEFINE a INT;
DEFINE null INT;
DEFINE b INT;
LET a = 5;
LET null = 7;
LET b = null;
RETURN b;
END FUNCTION;

EXECUTE FUNCTION nulltest();
当在 DB-Access 中执行前面的函数时,在 LET 语句的表达式中,创建标识符
null 作为关键字 NULL。该函数返回 NULL 值,而不是 7。
使用 null 作为 SPL 例程的变量会限制在 SPL 例程体中对 NULL 值的使用。因
此,前面的 SPL 代码是无效的,并导致 GBase 8s 返回下列错误:
-947 Declaration of an SPL variable named 'null' conflicts with SQL NULL
value.
在 ESQL/C 中,如果有 SELECT 语句会返回 NULL 值的可能性,则您应使用
指示符变量。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1381
函数表达式
函数表达式可从内建的 SQL 函数或从用户定义的函数返回一个或多个值,如下
图所示。
函数表达式

下列示例展示函数表达式:
EXTEND (call_dtime, YEAR TO SECOND)
HEX (LENGTH(123))
MDY (12, 7, 1900 + cur_yr)

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1382
TAN (radians)
DATE (365/2)
ABS (-32)
LENGTH ('abc') + LENGTH (pvar)
EXP (3)
HEX (customer_num)
MOD (10,3)
代数函数
代数函数采用一个或多个数值数据类型的参数。除了支持的数值参数之外,CEIL
和 FLOOR 函数还可采用可转换为 DECIMAL 值的字符串参数,且 ROUND 和
TRUNC 函数还可采用 DATE 或 DATETIME 参数。
代数函数

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

元素
描述
限制
语法
base
要升至 exponent 中指
定的幂的值
必须返回实数值 表达式
date_expression
求值为(或强制转型
为)DATE 值的表达式
必须返回 DATE

表达式

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1384
元素
描述
限制
语法
datetime_expression
求值为(或强制转型
为)DATETIME 值的表
达式
必须返回
DATETIME 值
表达式
dividend
要被 divisor 除的值 实数值
表达式
divisor
用来除 dividend 的值
非零的实数值
表达式
exponent
base 要升到的幂
实数值
表达式
factor
在返回的值中以零替换
的有效数字位数。默认
值为四舍五入的或截断
的第一个参数的整数部
分。
取值范围为 +32
至 -32 的整
数。正值或无符
号值适用于小数
点的右边,负值
适用于左边。
精确数

index
要抽取的根。缺省值为
2。
非零的实数值
表达式
num_expression
求值为(或强制转型
为)数值值的表达式
实数值
表达式
radicand
要返回其根的值
实数值
表达式
sqrt_radicand
带有实平方根的数值
非负的实数值
表达式
ABS 函数
ABS 函数返回它的数值参数的绝对值,返回的数据类型与它的参数相同。下列示
例中的查询返回所有以现金(+)或作为商店信用卡(-)支付了的 ship_charge
大于 $20 的所有订单。
SELECT order_num, customer_num, ship_charge
FROM orders WHERE ABS(ship_charge) > 20;
CEIL 函数
CEIL 函数将数值表达式,或可转换为 DECIMAL 数据类型的字符串作为它的参
数,并返回大于或等于它的单个参数的最小整数的 DECIMAL(32) 表示。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1385
下列查询返回 33 作为大于或等于 CEIL 参数 32.3 的最小整数:
SELECT CEIL(32.3) FROM systables WHERE tabid = 1;
下一示例返回 -32 作为大于或等于 CEIL 参数 -32.3 的最小整数:
SELECT CEIL(-32.3) FROM systables WHERE tabid = 1;
FLOOR 函数
FLOOR 函数将数值表达式,或可转换为 DECIMAL 数据类型的字符串作为它的
参数,并返回小于或等于它的单个参数的最大整数的 DECIMAL(32) 表示。
下列查询返回 32 作为小于或等于 FLOOR 参数 32.3 的最大整数:
SELECT FLOOR(32.3) FROM systables WHERE tabid = 1;
下一示例返回 -33 作为小于或等于 FLOOR 参数 -32.3 的最大整数:
SELECT FLOOR(-32.3) FROM systables WHERE tabid = 1;
这些示例说明当 FLOOR 和 CEIL 函数有非零小数部分的相同参数时,它们如何提
供差值为 1 的上界和下界。对于整数参数,FLOOR 和 CEIL 返回与它们参数相同
的 DECIMAL(32) 表示。
GREATEST 函数
GREATEST 函数返回表达式的列表中的最大值。
此函数的参数必须是求值为相兼容的数据类型的以逗号分隔的表达式。
这是 GREATEST 函数的语法:
GREATEST 函数

元素
描述
限制
语法
expression
可比较其值的表
达式
数据类型不可为集合或大对
象。
表达式

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1386
这些参数必须是相兼容的数据类型。不支持复合的数据类型,或 BYTE、TEXT、
BLOB、CLOB 对象,或基于任何这些数据类型的 DISTINCT 类型的参数。您指
定作为 GREATEST 函数的参数的任何用户定义的数据类型必须执行
greaterthan( ) 函数。
如果必要,数据库服务器将指定的 expression 参数转换为返回的值的数据类型。
由 expression 的所有运算对象确定此返回数据类型,可兼容性规则与 CASE 表
达式一致。
GREATEST 函数的返回值是它的最大参数值。如果一个或多个参数求值为
NULL,则结果为 NULL。如果 GREATEST 是用于比较 DATE 或 DATETIME
值,则返回值是最近的日期。
假设表 T1 包含三列 C1、C2 和 C3,其值为 1、7 和 4。下列查询返回值 7:
SELECT GREATEST (C1, C2, C3) FROM T1;
然而,如果列 C3 有 NULL 值,而不是 4,则同一查询返回 NULL 值。
LEAST 函数
LEAST 函数返回一组值中的最小值。
LEAST 函数

参数必须是相兼容的,且每一参数都必须是表达式,表达式的返回值的数据类型
不可为复合的类型、BYTES、TEXT、BLOB、CLOB,或基于任何这些类型的用
户定义的类型。用户定义的类型必须实现对函数 lessthan() 的支持,以便使用
LEAST 函数。如有必要,将选择的参数转换为结果的数据类型。由所有的运算对
象确定结果数据类型,且可兼容性规则与 CASE 表达式保持一致。
该函数的结果是最小的参数值。如果至少一个参数可为空,则结果为空。如果
LEAST 用于比较日期,则返回值是最早的日期。
假设表 T1 包含三列 C1、C2 和 C3,取值为 1、7 和 4。查询返回值 1。
SELECT LEAST (C1, C2, C3) FROM T1

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1387
如果列 C3 有值 NULL 而不是 4,则同一查询返回 NULL 值。
MOD 函数
MOD 函数以两个实数值运算对象作为参数,并返回第一个参数(被除数)的整
数部分除以第二个参数(除数)的整数部分的整数商的余数。返回的值为 INT 数
据类型(或对于 INT 范围之外的余数,为 INT8)。丢弃商和余数的任何小数部
分。除数 不可为 0。因此,MOD (x,y) 返回 y (modulo x)。请确保收到该
结果的任何变量都是可存储返回的值的数据类型。
此示例测试的是当前日期是否在 30 天记账周期之内:
SELECT MOD(TODAY - MDY(1,1,YEAR(TODAY)),30) FROM orders;
POW 函数
POW 函数求得它的第一个数值参数 base 的第二个数据值参数 exponent 的幂。
返回的值是 FLOAT 数据类型。
下列示例从 circles 表返回所有行,其中 radius 列值表示小于 1,000 平方单
位的面积,使用范围为 4 的 pi 的近似值:
SELECT * FROM circles WHERE (3.1416 * POW(radius,2)) < 1000;
函数标识符 POWER® 是 POW 的同义词。
要使用自然对数的基数 e,请参阅 EXP 函数。
ROOT 函数
ROOT 函数从它的第一个数值表达式参数 radicand 抽取正实数根值,返回为
FLOAT 数据类型。
如果您指定第二个数值参数作为 index(不可为零),则返回值的 index 幂等于
(在四舍五入误差范围内)radicand 参数。如果仅提供 radicand 参数,则 2 是
缺省的 index 值。您不可指定零作为 index 的值。
在下列示例中的第一个 SELECT 语句,使用缺省的 index 值 2,返回文字数值 9
的正平方根。第二个示例返回文字数值 64 的立方根。
SELECT ROOT(9) FROM angles; -- 9 的平方根
SELECT ROOT(64,3) FROM angles; -- 64 的立方根

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1388
调用仅带有单个参数的 ROOT 等同于调用 SQRT 函数。
SQRT 函数
SQRT 函数返回它的参数的正值平方根,该参数必须为非负的数值表达式。
下列示例为 angles 表的每一行返回 9 的平方根:
SELECT SQRT(9) FROM angles;
SQRT 函数等同于 ROOT(x),ROOT 函数的第二个参数的缺省值 2 指定该指
数。
ROUND 函数
ROUND 函数可降低它的第一个数值、MONEY、DATE 或 DATETIME 参数的
精度,并返回四舍五入了的值。如果第一个参数不是数值、MONEY 值或时间
点,则必须将它强制转型为数值的、MONEY、DATE 或 DATETIME 数据类
型。
下图展示 ROUND 和 TRUNC 代数函数的语法,它们支持相同的语法。然而,由于
它们的语义不同,它们可从相同的参数列表返回不同的值。 仅 ROUND 可返回大
于它的第一个参数的绝对值。
ROUND 和 TRUNC 代数函数


GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1389
元素
描述
限制
语法
date_expression
求值为(或强制转型
为)DATE 值的表达式
必须返回 DATE

表达式
datetime_expression
求值为(或强制转型
为)DATETIME 值的表
达式
必须返回
DATETIME 值
表达式
factor
在返回的值中以零替代
的有效数字的数目。缺
省的是返回四舍五入的
或截断的第一个参数的
整数部分。
取值范围为 +32
至 -32 的整
数。正值或无符
号值适用于小数
点的右边,而负
值适用于左边。
精确数

num_expression
求值为(或强制转型
为)数值值的表达式
实数
表达式
用法
ROUND 函数与 TRUNC 函数相似,其语法如上所示。然而,ROUND 的不同之处在于
它如何处理精度之内小于最小有效数字或时间单位的它的第一个参数的任何部
分,它的显式的或缺省的第二个参数指定该精度。

如果此部分的绝对值等于或大于该精度内最小单位的一半,则那个数字或
时间单位的值为由 ROUND 返回的值中增加 1。然而,如果这部分小于
一个单位的一半,则丢弃它,仅返回指定的或缺省的精度之内第一个参数
的数值或时间单位。
也就是说,如果第一个参数大于零,则

ROUND 函数舍去在第二个参数的精度之内小于最小有效数字或
时间的一半单位的它的第一个参数的任何部分,

但向上舍入等于或大于半个单位的第一个参数的任何部分。
例如,ROUND(3.5,0) = 4 且 ROUND(3.4,0) = 3。
但如果第一个参数小于零,则

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

ROUND 函数向上舍入在第二个参数的精度之内的小于最小有效
数字或时间单位的半个单位的它的第一个参数的任何部分,

但舍去等于或大于半个单位的第一个参数的任何部分。
例如,ROUND(-3.5,0) = -4 而 ROUND(-3.4,0) = -3。

相反地,TRUNC 函数以零替代数值表达式的小于指定精度的任何数值。
对于 DATE 或 DATETIME 表达式,TRUNC 替换小于指定格式字符串
的任何时间单位,以 1 替换 month 或 day 时间单位,或以零替换小于
day 的时间单位。
ROUND 函数可接受可选的第二个参数,其指定返回的值的精度。第二个参数的
语法和语义依赖于第一个字符是否为数值表达式、DATETIME 表达式或 DATE
表达式。
对数值和 MONEY 值的四舍五入

当第一个参数是数值表达式时,返回的值是 DECIMAL,且第二个参数可
为取值范围从 -32 至 +32 (包含 -32 和 +32)的整数,指定返回的值
的最后有效数字(相对于小数点)的位置。当第一个参数是数值时,如果
您省略 factor 规范,则 ROUND 返回舍入到个位或单位位置的第一个参
数的整数值。
正的数字值指定舍入到小数点的右边;负的数值值指定舍入到小数点的左
边,如 图 1 所示:
图: 负的、零和正的舍入因子的示例


下列示例使用带有列表达式作为它的第一个参数且没有第二个参数的
ROUND 函数,因此,数值表达式被舍入到范围零。此查询返回订单号和其
总价(四舍五入到缺省的个位)等于 $124.00 的项的四舍五入的总价。
SELECT order_num , ROUND(total_price) FROM items
WHERE ROUND(total_price) = 124.00;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1391
如果您使用 MONEY 数据类型作为 ROUND 函数的参数,且四舍五入到显式
的或缺省的个位,则返回的值以 .00 表示小数部分。下列示例中的
SELECT 语句四舍五入 125.46 和 MONEY 列值。该查询返回 125 和
items 表中每一行的 xxx.00 形式的四舍五入的价格。
SELECT ROUND(125.46), ROUND(total_price) FROM items;
DATE 和 DATETIME 值的四舍五入
 当 ROUND 的第一个参数为 DATETIME 表达式时,返回的值是
DATETIME YEAR TO MINUTE 数据类型,且第二个参数必须为在返回
的值中指定最小有效时间单位的引用的字符串。如果您省略第二个参
数,则缺省的格式字符串为 'DD',以四舍五入到 00:00 的小时和分钟
指定最近的一天。下列格式字符串作为第二个参数是有效的:
表 1. ROUND 函数的 DATETIME 参数的格式字符串
格式字符串
对返回的 DATETIME 值的影响
'YEAR'
舍入到最近一年之初,以六月 30 日之后的日期舍入到下
一年。month、day、hour 和 minute 值舍入为 -01-01
00:00。
'MONTH'
舍入到最近一月之初。将 15 日以后的日期舍入到下一
月。day、hour 和 minute 值舍入为 01 00:00。
'DD'
舍入到最近一天之初(00:00 = midnight)。将中午
12:00 之后的 DATETIME 舍入到下一天。
'DAY'
舍入到最近的星期天之初。周三、周四、周五或周六的日
期舍入到下一星期天。
'HH'
舍入到最近一小时之初。以 minute:second 晚于 29:59
的时间值舍入到下一小时。分钟舍入为零。
'MI'
舍入到最近一分钟之初。以 second 晚于 30 的时间值舍
入到下一分钟。
如果您在初始的 DATETIME 表达式参数之后省略格式字符串规范,则返回的值
是将第一个参数舍入到最近一天的值,就如同您已指定了 'DD' 作为格式字符
串。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1392
下列示例在 SELECT 语句中使用带有返回 DATETIME YEAR TO FRACTION(5)
值的列表达式的 ROUND 函数。在这些查询中,表 mytab 仅有单个行,且在那
行中,mytab.col_dt 的值是 2012-12-07 14:30:12.12300。
下列查询指定 'YEAR' 作为 DATETIME 格式字符串:
SELECT ROUND(col_dt, 'YEAR') FROM mytab;
返回的值为 2013-01-01 00:00。
下一查询与前面的查询相似,但将返回的值强制转型为 DATE 数据类型:
SELECT ROUND(col_dt, 'YEAR')::DATE FROM mytab;
返回的值为 01/01/2013。
此示例指定 'MONTH' 作为 DATETIME 格式字符串:
SELECT ROUND(col_dt, 'MONTH') FROM mytab;
返回的值为 2012-12-01 00:00。
此示例将 DATETIME 表达式舍入到 YEAR TO HOUR 精度:
SELECT ROUND(col_dt, 'HH') FROM mytab;
返回的值为 2012-12-07 15:00。

如果第二个参数是在返回的值中指定最小时间单位的引用字符串,则当第一
个参数为 DATE 表达式时,返回的值也是 DATE 数据类型。这些是与舍入
DATETIME 值相同的格式字符串,除了 'HH' 和 'MI' 不是有效的 DATE
值之外。对于舍入 DATE 参数,没有缺省的格式字符串。
要返回格式化的 DATE 值,您必须指定下列引用字符串之一作为 ROUND 函数
的第二个参数:
表 2. ROUND 函数的 DATE 参数的格式字符串
格式字符串
对返回的 DATE 值的影响
'YEAR'
四舍五入到最近一年之初。一月 30 日之后的日期舍入到
下一年。month 和 day 值均舍入为 01。
'MONTH'
四舍五入到最近一月之初。15 日之后的日期舍入到下一
月。返回的 day 值为 01。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1393
格式字符串
对返回的 DATE 值的影响
'DD'
返回第一个 date_expression 参数的 DATE 值。
'DAY'
将该值舍入到最近的星期天。如果第一个参数为星期天,
则返回那个日期。周三、周四、周五和周六的日期舍入到
下一星期天。
当第一个参数为 DATE 数据类型时,如果您未指定格式字符串作为第二个参数,
则缺省情况下没有格式字符串生效。不发出错误,但将第一个参数作为求值为整
数的数值表达式来处理,而不作为 DATE 值。 GBase 8s 在内部将 DATE 值存
储为从 1899 年 12 月 31 日以来的整数计数。对于 21 世纪中的日期,等同于
DATE 值的整数是 5 位整数,取值范围大约在 37,000 与 74,000 之间。
例如,查询 SELECT ROUND(TODAY) FROM systables 不为 DATE 表达式
提供格式字符串,且如果在 2012 年 4 月 1 日发出该查询,则返回整数
40999。
如果您应用数值格式规范作为第二个参数,则非负的数值对 DATE 值不起作用,
但下列示例将返回值的最后两个数字舍入为零:
SELECT ROUND(TODAY, -2) FROM systables;
在 2012 年 4 月 1 日,上述查询会返回整数值 40900。
在下一天,2012 年 4 月 2 日,同一查询会返回整数值 41000。
对于像 41000 这样的整数格式日期是有用的应用,您可使用 'YEAR'、
'MONTH'、'DAY' 或 'DD' 格式字符串作为 ROUND 函数的第二个参数来防止将
DATE 参数处理成 一个数值表达式。在 2012 年 4 月 1 日,下列查询返回
DATE 值 04/01/2012,如果 MDY4/ 是 DBDATE 环境变量设置的话:
SELECT ROUND(TODAY, 'DD') FROM systables WHERE tabid = 1;
在下列示例中,在 2012 年 4 月 3 日(星期二)发出一查询:
SELECT ROUND(TODAY, 'DAY') FROM mytab;
返回的值为 03/31/2012,当前的日期四舍五入到最近的星期天。
如果您正在使用主变量来在动态的 SQL 中存储四舍五入了的时间点值,且在准
备时刻不知道第一个参数的数据类型,则 GBase 8s 假设 ROUND 函数的第一个参

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1394
数是 DATETIME 数据类型,并返回 DATETIME YEAR TO MINUTE 四舍五入
的值。在执行时刻,则准备该语句之后,如果为该主变量提供 DATE 值,则发出
错误 -9750。要防止发生此错误,您可通过使用强制转型为主变量指定数据类
型,如此程序片断中所示。
sprintf(query1, ",
"select round( ?::date, 'DAY') 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;
要了解可为内建的按时间顺序排列的数据类型指定显示和数据条目格式的 GBase
8s 环境变量之中的优先顺序,请参阅主题 DATE 和 DATETIME 格式规范的优
先顺序。
TRUNC 函数
通过返回截断的值,TRUNC 函数可降低它的第一个数值的、DATE 或
DATETIME 参数的精度。如果第一个参数既不是数值也不是时间点,则必须将它
强制转型为数值、DATE 或 DATETIME 数据类型。
通过返回截断的值,TRUNC 函数可降低它的第一个数值的、DATE 或
DATETIME 参数的精度。如果第一个参数既不是数值也不是时间点,则必须将它
强制转型为数值、DATE 或 DATETIME 数据类型。
TRUNC 函数与 ROUND 函数相似,但它截断(而不是舍入到最近的整数)第一个参
数中小于它的第二个参数指定的精度之内的最小有效数字或时间单位的任何部
分。

对于数值表达式,TRUNC 以零替换小于指定精度的任何数字。

对于 DATE 或 DATETIME 表达式,TRUNC 替换小于格式规范的任何时
间单位,以 1 替换 month 或 day 时间单位,或以 0 替换小于 day 的时
间单位。
TRUNC 函数可接受指定返回的值的精度的可选的第二个参数。

当第一个参数为数值的表达式时,第二个参数必须为取值范围从 -32 至 +32
(包含-32 和 +32)的整数,指定返回的值的最后有效数字(相对于小数

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1395
点)的位置。当第一个参数为数值时,如果您省略 factor 规范,则 TRUNC
返回截断到个位或单位位置的第一个参数的值。
正的数字值指定截断到小数点的右边;负的数字值指定截断到左边,如下图
所示。
图: 负的、零和正的截断因子的示例

下列示例在 SELECT 语句中以返回数值值的列表达式调用 TRUNC 函数。此语
句显示订单号以及其总价(截断到缺省的个位小数位置)等于 $124.00 的项
的被截断的总价。
SELECT order_num , TRUNC(total_price) FROM items
WHERE TRUNC(total_price) = 124.00;
如果在一个指定个位的 TRUNC 函数调用中,如果 MONEY 数据类型是参数,
则在返回的值中小数部分成为 .00。例如,下列 SELECT 语句截断 125.46
和 MONEY 列值。它为 items 表中的每一行返回 125 以及形如 xxx.00 的截
断的价格。
SELECT TRUNC(125.46), TRUNC(total_price) FROM items;

当 TRUNC 的第一个参数为 DATETIME 表达式时,第二个参数必须为指定
返回值中最小有效时间单位的引用的字符串。仅下列格式的字符串是有效的
第二个参数:
表 1. TRUNC 函数的 DATETIME 参数的格式字符串
格式字符串
对返回的值的影响
'YEAR'
截断到年初。month、day、hour 和 minute 值截断到
01-01 00:00。
'MONTH'
截断到该月的第一天之初。hour 和 minute 值截断到
00:00。
'DD'
阶段到同一天之初(00:00 = 午夜)。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1396
格式字符串
对返回的值的影响
'DAY'
如果第一个参数是星期天,则返回那天的午夜
(00:00)。对于该星期的任何其他天,返回前一个星期
天的午夜。
'HH'
截断到该小时之初。minute 值截断为零。
'MI'
截断到最近的分钟之初。对于所有这些格式字符串,丢弃
小于 minute 的时间单位。
如果您在初始的 DATETIME 表达式参数之后省略格式字符串规范,则返回的
值是将第一个参数截断到天的值,就如同您指定了 'DD' 作为格式字符串一
样。
下列示例在 SELECT 语句中以返回 DATETIME YEAR TO FRACTION(5) 值的列
表达式调用 TRUNC 函数。在这些示例中,表 mytab 仅有单个行,且在那行
中 mytab.col_dt 的值是 2006-12-07 14:30:12.12300。
此查询指定 'YEAR' 作为 DATETIME 格式字符串:
SELECT TRUNC(col_dt, 'YEAR') FROM mytab;
返回的值为 2006-01-01 00:00。
下一查询与前一查询相似,但将截断的值强制转型为 DATE 数据类型:
SELECT TRUNC(col_dt, 'YEAR')::DATE FROM mytab;
返回的值为 01/01/2006。
此示例指定 'MONTH' 作为 DATETIME 格式字符串:
SELECT TRUNC(col_dt, 'MONTH') FROM mytab;
返回的值为 2006-12-01 00:00。
下列示例将 DATETIME 表达式截断到 YEAR TO HOUR 精度:
SELECT TRUNC(col_dt, 'HH') FROM mytab;
返回的值为 2006-12-07 14:00。

当第一个参数为 DATE 表达式时,第二个参数通常应为指定返回的值中最小
时间单位的引用的字符串。 除了 'HH' 和 'MI' 不是有效的日期之外,这些

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1397
是与截断 DATETIME 值相同的格式字符串,且对于截断 DATAE 表达式参
数,没有缺省的格式字符串。
要返回格式化的 DATE 值,您必须使用下列引用的字符串之一作为 TRUNC 函
数的第二个参数:
表 2. TRUNC 函数的 DATE 参数的格式字符串
格式字符串
对返回的值的影响
'YEAR'
截断到该年之初。month 和 day 值都为 01。
'MONTH'
截断到该月之初。day 值为 01。
'DD'
返回第一个 date_expression 参数的 DATE 值。
'DAY'
如果第一个参数是星期天,则返回那天。对于该星期的任
何其他天,返回前一星期天的日期。
当第一个元素为 DATE 数据类型时,如果您未指定格式字符串作为第二个参数,
则没有格式字符串作为缺省值生效。不发出错误,但将第一个参数作为求值为整
数的数值表达式处理,而不是作为 DATE 值。 GBase 8s 将 DATE 值作为自从
1899 年 12 月 31 日以来的整数天数在内部存储。
例如,查询 SELECT ROUND(TODAY) FROM systables 未为 DATE 表达式
提供格式字符串,如果在 2008 年 4 月 1 日提交该查询,则返回整数 39538。
如果您应用数值的格式规范作为第二个参数,则非负的数值对 DATE 值不起作
用,但下列示例将返回的值的最后两位数值舍入为零:
SELECT TRUNC(TODAY, -2) FROM systables;
对于类似于 39500 这样的整数日期不适用的应用,请使用 'YEAR'、'MONTH'、
'DAY' 或 'DD' 格式字符串作为 TRUNC 函数的第二个参数,来防止将 DATE 表
达式作为数值表达式来处理。在 2008 年 4 月 1 日,如果 MDY4/ 是 DBDATE 环
境变量的设置,下列查询返回 DATE 值 04/01/2008:
SELECT TRUNC(TODAY, 'DD') FROM systables;
如果您正在使用主变量来在动态的 SQL 中存储截断的时间点值,且在准备时刻
不知道第一个参数的数据类型,则 GBase 8s 假设 DATETIME 数据类型是
TRUNC 函数的第一个参数,并返回 DATETIME YEAR TO MINUTE 截断的值。
在执行时刻,在准备该语句之后,如果为主变量提供 DATE 值,则发出错误 -

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1398
9750。要防止发生此错误,您可通过使用强制转型为主变量指定数据类型,如此
程序片断中所示:
sprintf(query2, "%s",
"select trunc( ?::date, 'DAY') from mytab");
EXEC SQL prepare selectq from :query2;
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;
要了解 GBase 8s 环境变量之中的优先顺序,这些环境变量可为内建的按时间排
序的数据类型指定显示和数据条目格式,请参阅主题 DATE 和 DATETIME 格式
规范的优先顺序.
请注意,TRUNC 函数名称是基于英文单词 "truncate",这与在 SQL 的
TRUNCATE 语句中它的含义不同。TRUNC 以另一个更小精度或相同精度的值
替代它的第一个参数的值。TRUNCATE 语句从数据库表删除所有行,而不删除
表模式。
CARDINALITY 函数
CARDINALITY 函数返回集合列(SET、MULTISET、LIST)中元素的数目。
CARDINALITY 函数有下列语法。
CARDINALITY 函数

元素
描述
限制
语法
collection_col
现有的集合列
必须声明为集合数据
类型
标识符
collection_var
主或程序集合变量
必须声明为集合数据
类型
特定于语言
假设 set_col SET 列包含下列值:
{3, 7, 9, 16, 0}

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1399
下列 SELECT 语句返回 5 作为 set_col 列中元素的数目:
SELECT CARDINALITY(set_col) FROM table1;
如果集合包含重复的元素,CARDINALITY 为每一个别的元素计数。
SQLCODE 函数(SPL)
SQLCODE 函数不用参数,但将当前 SPL 例程已执行了的最近执行的(不论静
态的还是动态的)SQL 语句的 sqlca.sqlcode 值返回到它的调用上下文。仅在游
标的上下文中使用 SQLCODE。
SQLCODE

您可在 SPL 例程内的表达式中使用 SQLCODE 来标识动态游标的状态。在错误
处理中以及在诸如确定查询或函数调用是否尚未返回行的上下文中,或当游标已
达到了活动集的最后行时,或当 SPL 程序控制应从循环中退出时要标识其他条
件,此内建的函数是有用的。
下列 SPL 程序片断说明使用 SQLCODE 来检测 WHILE 循环内游标的活动集
的末尾。
CREATE PROCEDURE ...
...
DEFINE myc1 ...
...
PREPARE p FOR "SELECT c1 FROM t1";
DECLARE cur FROM s;
OPEN cur;

FETCH cur INTO myc1;
WHILE (SQLCODE != 100)
FETCH cur INTO myc1;
-- process myc1
...
END WHILE;
END PROCEDURE;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1400
在以 ESQL/C 编写的 UDR 中不需要 SQLCODE,其通过“动态的 SQL”的 GET
DIAGNOSTICS 语句以及有其他机制直接访问“SQL 通信区域”(SQLCA)。如
果内建的 SQLCODE 函数的调用上下文不在 SPL 例程中,则数据库服务器发出
错误。
DBINFO 函数
下图展示 DBINFO 函数的语法。
DBINFO 函数

元素
描述
限制
语法
column
table 中的列名称
在 table 中必须存在
标识符
expression
求值为 tblspace_num
的表达式
可包含列名称、SPL 变
量、主变量或子查询,但
必须返回数值值
表达式

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1401
元素
描述
限制
语法
parameter
指定返回 version 字
符串的哪一部分的引
用的字符串
要了解有效的 parameter
值,请参阅 使用
'version' 选项
请参阅
限制
栏。
table
要显示 dbspace 名称
或包含 UTC 值的整数
column 列的表。
必须与查询的 FROM 子句
中表的名称相匹配
标识符
tblspace_num
表的 tblspace 号
(分区号)
在数据库的 systables
表的 partnum 列中必须
存在
精确数

utc_value
要转换为 DATETIME
等价的 UTC 值
必须为数值表达式,求值
为从 1970-01-01
00:00:00+00:00 以来的秒

表达式,
精确数

DBINFO 选项
DBINFO 函数实际上是返回关于数据库的不同类型信息的函数集。要
调用每一函数,请在 DBINFO 关键字之后指定特定的选项。您可在
SQL 语句之内和 UDR 之内的任何地方使用任何 DBINFO 选项。
下表展示数据库的类别以及 GBase 8s 可通过有效的 DBINFO 选项检索的数据库
服务器信息。

参数栏展示以圆括号限定的每一有效的 DBINFO 选项的参数列表。

返回的信息栏展示参数选项检索的数据库信息的类型。

页栏展示您可找到关于参数选项的更多信息的位置。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1402
参数
返回的信息

('dbhostname')
客户端应用连接到的数据
库服务器的主机名称
使用 'dbhostname' 选

('dbname')
客户端应用连接到的数据
库的标识符
使用 'dbname' 选项
('dbspace'
tblspace_num)
与 tblspace 编号相对应
的 dbspace 的名称
使用 ('dbspace',
tblspace_num) 选项
('get_tz')
会话的时区,$TZ,如同通
过客户端作为字符串指定
的那样。
使用 'get_tz' 选项
('serial8')
插入在表中的最后的
SERIAL8 值
使用 'serial8' 和
'bigserial' 选项
('bigserial')
插入在表中的最后的
BIGSERIAL 值
使用 'serial8' 和
'bigserial' 选项
('sessionid')
当前会话的会话 ID 编号
使用 'sessionid' 选

('cdrsession')
线程是否正在执行
Enterprise Replication
操作
使用 'cdrsession' 选

('sqlca.sqlerrd1')
插入在表中的最后的
SERIAL 值
使用
'sqlca.sqlerrd1' 选

('sqlca.sqlerrd2')
通过 SELECT、INSERT、
DELETE、UPDATE、EXECUTE
PROCEDURE 和 EXECUTE
FUNCTION 语句处理的行的
数目
使用
'sqlca.sqlerrd2' 选


GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1403
('utc_current')
当开始执行 SQL 语句时,
当前的 UTC 时间值(作为
一个从 1970-01-01
00:00:00+00:00 以来的秒
的整数值)。
使用 'utc_current'
选项
('utc_to_datetime',
table.column)
对应于包含 UTC 时间值
(作为一个从 1970-01-01
00:00:00+00:00 以来的秒
的整数值)的指定的整数
列的 DATETIME 值。
使用
'utc_to_datetime' 选

('utc_to_datetime',
utc_value)
对应于指定的 UTC 时间值
(作为一个从 1970-01-01
00:00:00+00:00 以来的秒
的整数值)的 DATETIME
值。
使用
'utc_to_datetime' 选

('version',
'parameter')
客户端应用连接到的数据
库服务器的类型及其发行
版本。(如果 parameter
没有为版本信息指定格
式,则调用 DBINFO 失败
并报错。)
使用 'version' 选项
使用 ('dbspace', tblspace_num) 选项
'dbspace' 选项返回包含对应于 tblspace 编号的 dbspace 的名称的字符串。您必
须提供附加的参数,或 tblspace_num,或求值为 tblspace_num 的表达式。下列
示例使用 'dbspace' 选项。首先,它查询 systables 系统目录表来确定表客户
的 tblspace_num,然后它执行该函数来确定 dbspace 名称。
SELECT tabname, partnum FROM systables
where tabname = 'customer';
如果查询返回一个分区编号 1048892,则您将那个值插入到第二个参数内来找到
包含 customer 表的那个 dbspace,如下例所示:
SELECT DBINFO ('dbspace', 1048892) FROM systables
where tabname = 'customer';

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1404
如果您想要知道其 dbspace 名称的表是分片的,则你必须查询
sysfragments 系统目录表来找到每一表分片的 tblspace 编号。然后您
必须在单独的 DBINFO 查询中提供每一 tblspace 编号来找到跨分片的
表的所有 dbspace。
使用 'sqlca.sqlerrd1' 选项
'sqlca.sqlerrd1' 返回提供插入到表内的最后的 serial 值的单个整数。要
确保有效的结果,请紧跟在将带有 serial 值的单个行插入到表内的单
SELECT 语句之后使用此选项。
提示: 要获取插入到表内的最后的 SERIAL8 值的值,请使用 DBINFO 的
'serial8' 选项。要获取更多信息,请参阅 使用 'serial8' 和 'bigserial' 选
项。
下列示例使用 'sqlca.sqlerrd1' 选项:
EXEC SQL create table fst_tab (ordernum serial, partnum int);
EXEC SQL create table sec_tab (ordernum serial);
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 values (dbinfo('sqlca.sqlerrd1'));
此示例将包含主键 serial 值的一行插入到 fst_tab 表内,然后使用
DBINFO 函数来将同一 serial 值插入到 sec_tab 表内。DBINFO 函数
返回的值是被插入到 fst_tab 内的最后一行的 serial 值。
由于 SQLCA 结构不记录通过触发器插入的 serial 值,因此您不可以
'sqlca.sqlerrd1'、'bigserial' 或 'serial8' 选项调用 DBINFO 函数来返回触
发器的活动插入的 serial 值。
要获取更多关于“SQL 通信区域”(SQLCA)数据结构的信息
(sqlca.sqlerrd1 在其内是一个字段),请参阅 GBase 8s SQL 教程指
南。
使用 'sqlca.sqlerrd2' 选项

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1405
'sqlca.sqlerrd2' 选项返回提供 SELECT、INSERT、DELETE、
UPDATE、EXECUTE PROCEDURE 和 EXECUTE FUNCTION 语句处
理了的行的数目的单个整数。要确保有效的结果,请在 SELECT、
EXECUTE PROCEDURE 和 EXECUTE FUNCTION 语句已执行完成之
后使用此选项。此外,当您在游标内使用此选项时,要确保有效的结
果,请确保在关闭游标之前取回所有行。
下列示例展示 SPL 例程,该例程使用 'sqlca.sqlerrd2' 选项来确定从表删除
的行的数目:
CREATE FUNCTION del_rows (pnumb INT)
RETURNING INT;

DEFINE nrows INT;

DELETE FROM fst_tab WHERE part_number = pnumb;
LET nrows = DBINFO('sqlca.sqlerrd2');
RETURN nrows;
END FUNCTION;
要获取更多关于“SQL 通信区域”(SQLCA)数据结构的信息
(sqlca.sqlerrd2 在其内是一个字段),请参阅 GBase 8s SQL 教程指
南。
使用 'sessionid' 选项
DBINFO 函数的 'sessionid' 选项返回您的当前会话的会话 ID。当客户端应用连
接到数据库服务器时,数据库服务器启动与客户端的会话,并为该客户端指定一
会话 ID。该会话 ID 用作客户端与数据库服务器之间给定连接的唯一的标识符。
数据库服务器在称为会话控制块的共享内存中的数据结构中存储该会话 ID 的
值。给定会话的会话控制块还包括用户 ID、客户端的进程 ID、主机计算机的名
称和各种状态标志。
当您指定 'sessionid' 选项时,数据库服务器从会话控制块检索您的当前会话的会
话 ID,并将此值作为整数返回给您。sysmaster 数据库中的某些“系统监视接口”
(SMI)表包括会话 ID 的列,因此您可使用 DBINFO 函数获取了的会话 ID

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1406
来从这些 SMI 表抽取关于您自己的会话的信息。要获取关于会话控制块的更多
信息,请参阅 GBase 8s 管理员指南。要获取关于 sysmaster 数据库和 SMI 表
的更多信息,请参阅 GBase 8s 管理员参考手册。
在下列示例中,用户在 SELECT 语句中指定 DBINFO 函数来获取当前会话 ID 的
值。用户产生针对 systables 系统目录表的查询,并使用 WHERE 子句来将查
询结果限定为单个行。
SELECT DBINFO('sessionid') AS my_sessionid
FROM systables
WHERE tabname = 'systables';
在前面的示例中,SELECT 语句针对 systables 系统目录表查询。然而,您可通
过针对任何系统目录表或数据库中的用户表进行查询,获取当前会话的会话 ID。
例如,您可输入下列查询来获取您的当前会话的会话 ID:
SELECT DBINFO('sessionid') AS user_sessionid
FROM customer
WHERE customer_num = 101;
您不仅可在 SQL 语句中使用 DBINFO 'sessionid' 选项,还可在 SPL 例程中使
用。 下列示例展示返回当前会话 ID 的值的 SPL 函数来调用程序或例程:
CREATE FUNCTION get_sess()
RETURNING INT;
RETURN DBINFO('sessionid');
END FUNCTION;
使用 'cdrsession' 选项
DBINFO() 函数的 'cdrsession' 选项检测是否执行 INSERT、UPDATE
或 DELETE 语句作为复制的事务的一部分。
您可能想要升级触发器、存储过程或用户定义的例程来采取不同的活
动,这依赖于是否执行事务作为 Enterprise Replication 的一部分。如果
线程执行的数据库操作是 Enterprise Replication apply 或 sync 线程,则
DBINFO() 函数的 'cdrsession' 选项返回 1;否则,该函数返回 0。
下列示例展示使用 'cdrsession' 选项的 SPL 函数,来确定线程是否正在
执行 Enterprise Replication 操作:

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1407
CREATE FUNCTION iscdr ()
RETURNING int;

DEFINE iscdrthread int;
SELECT DBINFO('cdrsession') into iscdrthread
from systables where tabid = 1;
RETURN iscdrthread;
END FUNCTION
使用 'dbname' 选项
您可使用 'dbname' 选项来检索当前数据库的名称。此选项返回客户端
会话当前连接到的数据库的标识符。
在下列示例中,用户在 SELECT 语句中输入 DBINFO 的 'dbname' 选项来检索
DB-Access 连接到的数据库的名称:
SELECT DBINFO('dbname')
FROM systables
WHERE tabid = 1;
下表展示此查询的结果。
(constant)
stores_demo
使用 'dbhostname' 选项
您可使用 'dbhostname' 选项来检索数据库客户端连接到的数据库服务
器的主机名称。
此选项检索数据库服务器正运行在其上的计算机的物理计算机名称。
在下列示例中,用户在 SELECT 语句中的 DBINFO 的 'dbhostname' 选项来检索
DB-Access 连接到的数据库服务器的主机名称:
SELECT DBINFO('dbhostname')
FROM systables
WHERE tabid = 1;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1408
下列表格展示此查询的结果。
(constant)
rd_lab1
使用 'version' 选项
您可使用 DBINFO 函数的 'version' 选项来从消息日志检索关于针对
客户端应用正在运行的数据库服务器的类型和发布版本的信息。
您必须在 'version' 选项之后包括 'parameter' 规范来表明您想要检索的
版本字符串的哪一部分。
如果在 'version' 之后,您指定 'full' 作为 parameter 值,则 DBINFO 返回
完整的版本字符串,其与 oninit 实用程序的 -V 选项显示的值相同。 下列表格
罗列 DBINFO 的所有有效的 parameter 参数,其可检索关于数据库服务器的版本
信息:

参数栏展示每一有效的 DBINFO ( 'version', 'parameter') 组合的以圆括号
限定的参数列表。

返回的版本字符串的部分栏展示每一参数列表返回的版本字符串的哪一部
分。

返回的值的示例栏展示 Arguments 选项的每一 parameter 值返回的示
例。
每一示例返回完整的版本字符串 GBase 8s Version 11.50.UC6 的一部分。
参数
返回的版本字符串的部分
返回的值的示例
('version',
'server-type')
数据库服务器的类型
GBase 8s
('version',
'major')
当前数据库服务器版本的主要版本号 11
('version',
'minor')
当前数据库服务器版本的次要版本号 50

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1409
参数
返回的版本字符串的部分
返回的值的示例
('version',
'os')
在版本字符串内的操作系统标识符:
T = 32 位 Windows™ 平台
U = 运行在 32 位操作系统上的
UNIX™ 32 位
H = 运行在 64 位操作系统上的
UNIX 32 位
F = 所有 64 位平台
U
('version',
'level')
当前数据库服务器版本的临时发布级

C6
('version',
'full')
会由 oninit -V 返回的完整的版本
字符串
GBase 8s, Version

当您安装 GBase 8s JDBC Driver 时,安装程序在安装了 JDBC 驱动程序的目录中,创建
卸载包。卸载 GBase 8s JDBC Driver 会从计算机完全移除驱动程序及其全部组件。

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 15 -
下列部分描述如何在所有平台上卸载 GBase 8s JDBC Driver。
提示: 如果您在其中安装了 GBase 8s JDBC Driver 的 在其路径名称中包括
空格,则当执行卸载命令时,请将整个路径名称括在引号中。