返回首页

gbase数据、南大通用产品文档:GBase8s简单的CASE 表达

更新日期:2024年09月11日

这个示例将一个简单CASE表达式的值赋给变量appraisal,selector值是 grade。
DECLARE
grade CHAR(1) := 'B';
appraisal VARCHAR2(20);
BEGIN
appraisal :=
CASE grade
WHEN 'A' THEN 'Excellent'
WHEN 'B' THEN 'Very Good'
WHEN 'C' THEN 'Good'
WHEN 'D' THEN 'Fair'
WHEN 'F' THEN 'Poor'
ELSE 'No such grade'
END;
DBMS_OUTPUT.PUT_LINE ('Grade ' || grade || ' is ' || appraisal);
END;

--Result:
--Grade B is Very Good

GBase 8s PL/SQL手册
南大通用数据技术股份有限公司
- 37 -

GBase 8s支持的时间类型数据有时间类型,日期类型,时间戳类型。

在C语言中, 使用GCIDateTime对象表示时, 使用子类型区分。


C
(64位系统
)


SQLT类型

GCIDateTime时间
GCI_DTYPE_TIME
datetime hour to second
SQLT_TIME
GCIDateTime日期
GCI_DTYPE_DATE
Datetime year to day
SQLT_DATE

GBase 8s GCI 接口使用指南

南大通用数据技术股份有限公司 10
GCIDateTime时间戳
GCI_DTYPE_TIMES
TAMP
除去以上类型的其他时
间类型, 例如datetime
year to fraction(5) ,
datetime hour to
fraction(4).
SQLT_TIMESTA
MP

GCI接口在使用时间类型做数据库访问操作时,有如下规则:
GCIDateTime 时间, 包含小时(范围 0~23) ,分钟(范围 0~59) ,秒(范围 0~59),
不包含纳秒。
GCIDateTime 日期,包含年(范围-4712~9999),月(范围 0~11),日(范围 1~31)。
GCIDateTime 时间戳,包含年(范围-4712~9999) ,月(范围 0~11), 日(范围
1~31), 小时(范围 0~23),分钟(范围 0~59), 秒(范围 0~59) ,纳秒(
范 围 0~999999999)
关于纳秒, GBase8s中datetime的fraction类型的位数范围是1~5,最大只保留5位有效数字
, 所以纳秒的低4位会被舍弃。例如,对于datetime year to fraction(5)的数据, 输入值为
9999, 存入数据库的值为0。
Datetime对象类型使用举例:

/* 分配用于存储数据的变量*/
GCIDateTime *tstmpltz = (GCIDateTime *)NULL;
/* Col1 是时间戳 */
GCIText *sqlstmt = (GCIText *)"SELECT col1 FROM foo";
/* 分配Datetime对象句柄 */
status = GCIDescriptorAlloc(envhp,(void **)&tstmpltz, GCI_DTYPE_TIMESTAMP,
0, (void **)0);
....
status = GCIStmtPrepare (stmthp, errhp, sqlstmt, (ub4)strlen ((char *)sqlstmt),
(ub4)GCI_NTV_SYNTAX, (ub4)GCI_DEFAULT);
/* 绑定对象句柄,注意是指针的地址*/
status = GCIDefineByPos(stmthp, &defnp, errhp, 1, &tstmpltz, sizeof(tstmpltz),
SQLT_TIMESTAMP_LTZ, 0, 0, 0, GCI_DEFAULT);
/*执行和获取*/
GCIStmtExecute(svchp, stmthp, errhp, 1, 0,(GCISnapshot *) NULL,
(GCISnapshot *)NULL, GCI_DEFAULT)

您可以在 GBase 8s 上的日志记录数据库中创建日志记录或非日志记录表。两种表类型为
STANDARD(日志记录表)和 RAW(非日志记录表)。缺省标准表如同较早版本中创建
的没有指定特殊关键字的表一样。您既可以创建 STANDARD 也可以创建 RAW 表,并
且可以将表从一个类型更改为另一个类型。
在非日志记录数据库中,STANDARD 和 RAW 表都是非日志记录的。在非日志记录数据
库中,STANDARD 和 RAW 表之间的唯一区别在于 RAW 表不支持主键约束、唯一约
束、引用约束或回滚。然而,可以为这些表建立索引并进行更新。
下表列出了 GBase 8s 中可用类型表的属性。标志值是 systables 的 flags 列中每种表类
型的十六进制值。
表 1. GBase 8s 的表类型

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 168 -
特征
STANDARD
RAW
TEMP
永久



已记录



索引



约束

无引用约束或唯一
约束
允许 NULL 和 NOT
NULL 约束

回滚



可复原

是,如果未更新

可复原

是,如果未更新

可载入



Enterprise
Replication 服务器



高可用性集群中的
主服务器

是,不能更改日志
记录方式

高可用性集群中的
辅助服务器

是,但任何操作都
不可访问

标志值

0x10

标准永久表
STANDARD 表与数据库服务器创建的已记录的数据库中的表相同。STANDARD 表不使
用轻量级追加。所有操作都是一条条地记录的,因此 STANDARD 表可以恢复和回滚。
可备份与复原 STANDARD 表。日志记录使您能够在执行热复原或时间点复原时应用自
上次物理备份起的更新。Enterprise Replication 允许位于 STANDARD 表上。
STANDARD 表是日志记录和非日志记录这两种数据库上的缺省类型。STANDARD 表如
果存储在日志记录数据库中,将被记录;如果存储在非日志记录数据库中,将不被记录。

RAW 表
RAW 表是非日志记录的永久表,类似于非日志记录数据库中的表。支持但不记录 RAW
表中行内的更新、插入和删除操作。可在 RAW 表中定义索引,但是不能在 RAW 表中
定义唯一约束、主键约束或引用约束。不支持将轻量级追加用于加载 RAW 表,但在
High-Performance Loader (HPL) 操作中和指定 INTO TEMP ... WITH NO LOG 的查询中例
外。
无论是存储在日志记录数据库还是非日志记录数据库中,RAW 表都具有相同属性。如果
更新了 RAW 表,那么除非在更新之后执行 0 级备份,否则不能可靠复原数据。如果自
备份后尚未更新过表,那么可以从上次物理备份复原 RAW 表,但是仅备份逻辑日志并

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 169 -
不足以复原 RAW 表。快速恢复可回滚 STANDARD 表上未完成事务,但不会回滚
RAW 表上的未完成事务。
RAW 表适用于初始装入和数据的验证。要装入 RAW 表,可以使用任何装入实用程序,
包括 dbexport、DB-Access 的 LOAD 语句或表达式方式下的 HPL。如果在装入 RAW
表时发生错误或故障,那么得到的数据是发生故障时磁盘上的任何数据。
限制: 不要在事务中使用 RAW 表。在已装入数据后,请首先使用 ALTER TABLE 语
句将表更改为 STANDARD 类型并执行 0 级备份,然后再在事务中使用该表。
限制: 不要在 RAW 或 TEMP 表上使用 Enterprise Replication。
在高可用性集群环境中使用 RAW 表时,有一些限制。因为不记录对 RAW 表所作修
改,并且辅助服务器(包括 HDR、RSS 和 SDS)使用日志记录与主服务器保持同步,所
以将限制对 RAW 表执行某些操作:

在主服务器上,可以创建、删除和访问 RAW 表;但是,不允许将表方式从未记
录更改为已记录,或从已记录更改为未记录。在高可用性集群环境中更改表的方
式会生成错误 -19845。

在辅助服务器(HDR、SDS 或 RSS)上,任何操作都不能访问 RAW 表。尝试
从 SQL 访问 RAW 表会生成错误 -19846。

Temp 表
Temp 表是临时已记录的表,它们将在用户会话关闭、数据库服务器关闭或故障后重新引
导时删除。Temp 表支持索引、约束和回滚。您不能复原、备份或复原 Temp 表。Temp
表支持批量操作(如轻量级追加),快速将行添加到每个表分段的末尾。

表类型的属性
这些主题说明了装入表、快速恢复以及表类型的备份与复原。
将数据装入表
GBase 8s 创建在缺省情况下使用日志记录的 STANDARD 表。数据仓库应用程序可以有
需要花费长时间装入的巨型表。装入非日志记录表比装入日志记录表要快。可使用
CREATE RAW TABLE 语句创建 RAW 表或使用 ALTER TABLE 语句在装入
STANDARD 表之前将该表更改为 RAW 表。在装入表后,请对该表运行 UPDATE
STATISTICS。
有关使用 ALTER TABLE 将表从日志记录更改为非日志记录的更多信息,请参阅
《GBase 8s SQL 指南:语法》。
表类型的快速恢复
下表显示了 GBase 8s 中可用的表类型的快速恢复方案。
表 1. 表类型的快速恢复

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 170 -
表类型
快速恢复行为
Standard
快速恢复成功。所有已落实的日志记录将前滚,而所有未完成的事务将回滚。
RAW
如果自上次修改原始表后已完成检查点,那么所有数据都可恢复。
上一个检查点后的插入、更新和删除将丢失。
RAW 表中未完成的事务将不回滚。
备份与复原 RAW 表
下表说明了 GBase 8s 中可用的表类型的备份方案。
表 1. 在 GBase 8s 上备份表
表类型
是否允许备份?
Standard
是。
Temp
否。
RAW
是。如果更新 RAW 表,必须对其进行备份,这样就可以复原其中的所有数
据。仅备份逻辑日志是不够的。
重要: 在装入 RAW 表或将 RAW 表更改为 STANDARD 类型后,必须执行 0 级备份。
下表显示了这些表类型的复原方案。
表 2. 在 GBase 8s 上复原表
表类型
是否允许复原?
Standard
是。热复原、冷复原和时间点复原都可以起作用。
Temp
否。
RAW
复原 RAW 表时,它只包含上次备份时位于磁盘上的数据。由于未记录 RAW
表,因此任何上次备份以来发生的更改都不会复原。
备份与复原 RAW 表
下表说明了 GBase 8s 中可用的表类型的备份方案。
表 1. 在 GBase 8s 上备份表
表类型
是否允许备份?
Standard
是。
Temp
否。
RAW
是。如果更新 RAW 表,必须对其进行备份,这样就可以复原其中的所有数
据。仅备份逻辑日志是不够的。
重要: 在装入 RAW 表或将 RAW 表更改为 STANDARD 类型后,必须执行 0 级备份。
下表显示了这些表类型的复原方案。
表 2. 在 GBase 8s 上复原表

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 171 -
表类型
是否允许复原?
Standard
是。热复原、冷复原和时间点复原都可以起作用。
Temp
否。
RAW
复原 RAW 表时,它只包含上次备份时位于磁盘上的数据。由于未记录
RAW 表,因此任何上次备份以来发生的更改都不会复原。

临时表
数据库服务器必须为以下两类临时表提供磁盘空间:

使用 SQL 语句(例如 CREATE TEMP TABLE. . . 或(使用 Extended Parallel
Server)SELECT .... INTO SCRATCH)创建的临时表. .

数据库服务器在其处理查询时创建的临时表
请确保您的数据库服务器已为用户创建的和数据库服务器创建的这两种临时表配置了足够
的临时空间。对数据库服务器的一些使用需要与永久存储空间一样多的临时存储空间,或
更多。
在缺省情况下,数据库服务器会将临时表存储在根数据库空间中。如果您决定不在根数据
库空间中存储临时表,那么可以使用 DBSPACETEMP 环境变量或 DBSPACETEMP 配
置参数来指定临时表的数据库空间列表。
创建的临时表
可以使用以下任一 SQL 语句创建临时表:

CREATE TABLE 语句的 TEMP TABLE 选项

SELECT 语句的 INTO TEMP 子句,例如 SELECT * FROM customer INTO
TEMP cust_temp
只有创建了临时表的会话才可以使用该表。 当会话退出时,该表将自动删除。
当您创建临时表时,数据库服务器将使用下列条件:

如果用于填充 TEMP 表的查询未产生任何行,那么数据库服务器将创建一个空的
且未分段的表。

如果查询生成的行未超过 8 KB,那么临时表将只位于一个数据库空间中。

如果生成的行超过 8 KB,那么数据库服务器会创建多个分段并使用循环分段存储
方案进行填充,除非您为该表指定了分段存储方法和位置。
如果使用 CREATE TEMP 和 SELECT...INTO TEMP SQL 语句并且 DBSPACETEMP 已
被设置:

列表中的 LOGGING 数据库空间被用来创建指定或暗示 WITH LOG 子句的表。

列表中的 NON-LOGGING 临时数据库空间被用来创建指定 WITH NO LOG 子句
的表。
当使用了 CREATE TEMP 和 SELECT...INTO TEMP SQL 语句,并且 DBSPACETEMP
还未设置或不包含正确类型的数据库空间时,GBase 8s 会使用数据库的数据库空间来存
储临时表。请参阅《GBase 8s SQL 指南:语法》以获取更多信息。

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 172 -
存储用户创建的临时表的位置
如果应用程序允许您指定临时表的位置,那么您可以指定日志记录空间,也可以指定专门
为临时表创建的非日志记录空间。
有关创建临时数据库空间的信息,请参阅《GBase 8s 管理员参考》中的 onspaces 主题。
如果未指定临时表的位置,那么数据库服务器会将临时表存储在指定为 DBSPACETEMP
配置参数或环境变量的自变量的某一个空间中。数据库服务器将记住上一个用于临时表的
数据库空间的名称。当数据库服务器接收到临时存储空间的另一个请求时,它将使用下一
个可用的数据库空间均匀地将 I/O 分布在临时存储空间中。
有关在您未列出作为 DBSPACETEMP 的自变量的任何列表时数据库存储临时表位置的信
息,请参阅《GBase 8s 管理员参考》 中 DBSPACETEMP 一节。
当您使用应用程序创建临时表时,您可以使用该临时表直到该应用程序退出或执行下列操
作之一为止:

关闭创建该表所在的数据库并打开其他数据库服务器中的数据库

关闭创建该表所在的数据库

显式地删除临时表
数据库服务器创建的临时表
数据库服务器有时会在对数据库运行查询或备份该数据库时创建临时表。
该数据库服务器可能在下列任何情况下创建临时表:

包含 GROUP BY 或 ORDER BY 子句的语句

使用带有 UNIQUE 或 DISTINCT 关键字的聚集函数的语句

使用自动索引或散列连接的 SELECT 语句

复杂 CREATE VIEW 语句

创建滚动游标的 DECLARE 语句

包含相关子查询的语句

包含在 IN 或 ANY 子句中发生的子查询的语句

CREATE INDEX 语句
当启动表创建的进程完成时,数据库服务器会删除其创建的临时表。
如果数据库服务器在没有除去临时表的情况下关闭,那么数据库服务器在下次启动时将除
去这些临时表。要启动数据库服务器而不除去临时表,请运行带 -p 选项的 oninit 命令。
应用程序和分析工具可以定义其中派生表包含与基本表连接的多个视图的查询,可能包括
数百列。数据库服务器会尝试将视图或派生表折叠放入主查询中。无法折叠的任何此类视
图或派生表都会具体化到临时表中。临时表会排除主查询中未引用的所有列。临时表仅使
用在 Projection 子句以及父查询的其他子句(包括 WHERE、HAVING、GROUP BY 和
ON 子句)中引用的列进行创建。
通过从系统生成的临时表中排除主查询中未引用的任何列,这一简化模式可以节省存储资
源,避免在未使用的列中进行不必要的数据 I/O,从而提高查询性能。

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 173 -
但是,在嵌套查询中,只会检查父查询中来自视图和派生表的投影列,而不会检查高于直
接父查询的级别中的投影列。
重要: 除了临时表以外,数据库服务器还使用临时磁盘空间来存储发生备份时覆盖的数据记录的前映
像,以及用于内存中发生的查询处理中的溢出。确保正确设置了 DBSPACETEMP 环境变量或
DBSPACETEMP 配置参数,以指定具有满足您需求的足够空间的数据库空间。如果指定的数据库空间中
空间不足,备份将失败,并且将使用根数据库空间,或者在填满根数据库空间之后,备份将失败。
存储数据库服务器创建的临时表的位置
当数据库服务器创建临时表时,它会将临时表存储在您在 DBSPACETEMP 配置参数或环
境变量中指定的某个数据库空间中。环境变量将取代配置参数。
当您未在 DBSPACETEMP 中指定任何临时数据库空间,或指定的临时数据库空间的空间
不够时,数据库服务器将根据以下规则在标准数据库空间中创建该表:

如果已使用 CREATE TEMP TABLE 创建了临时表,那么数据库服务器会将该表
存储在包含该表的数据库的数据库空间中。

如果用 SELECT 语句的 INTO TEMP 选项创建临时表,那么数据库服务器在根
数据库空间中存储此表。