返回首页

gbase数据、南大通用产品文档:GBase8s不透明数据类型

更新日期:2024年09月11日

不透明数据类型是完全封装的用户定义的数据类型。对于数据库服务器,不透明数据
类型的内部结构是未知的。
除 DISTINCT 类型的用户定义类型 (UDT) 之外,源类型是内置类型的 UDT 为不透
明数据类型。
内置数据类型 BLOB、
BOOLEAN、
CLOB 和 LVARCHAR 是作为不透明数据类型来
实现的。您无法在跨服务器的分布式操作中访问这些内置不透明数据类型,但是您可以在
相同 GBase 8s 实例的其他数据库中进行访问。
您必须为不透明数据类型的数据库服务器提供以下信息:
• 如何在磁盘上存储数据值的数据结构
• 确定如何在磁盘存储格式与用于数据输入和显示的用户格式之间转换的支持函数
• 确定如何为此数据类型构建、使用和处理索引的辅助访问方法
• 使用数据类型的用户函数
• 用于在数据库中注册不透明类型的系统目录条目

GBase 8s SQL 指南:参考
南大通用数据技术股份有限公司 - 128 -

不透明类型的内部结构对数据库服务器不可视,只能通过用户定义的例程存取。不透
明类型的定义存储在 sysxtdtypes 系统目录表中。以下 SQL 语句会维护数据库中不透明
类型的定义:
• CREATE OPAQUE TYPE 语句在数据库中注册了一个新的不透明类型。
• DROP TYPE 语句从数据库中除去先前定义的不透明类型。
有关更多信息,请参阅 OPAQUE 数据类型一节。另请参阅 GBase 8s 用户定义的例
程与数据类型开发者指南。
数据类型强制转型和转换
有时,使用 CREATE TABLE 语句指定给列的数据类型不适用。当需要存储比当前数据
类型所能容纳的值更大的值时,您可以更改列的数据类型。数据库服务器允许您使用下列
方法之一来更改列的数据类型或者将列的值强制转型为另一数据类型:
l
使用 ALTER TABLE 语句来修改列的数据类型。
例如,如果您创建了 SMALLINT 列,后来发现必须存储大于 32,767 的整数,那么必
须更改该列的数据类型才能存储更大的值。可以使用 ALTER TABLE 来将数据类型更改为
INTEGER。该转换会更改当前存在于列中的所有值和可能添加的任何新值的数据类型。
l
使用 CAST
AS 关键字或双冒号 (::) 强制转型运算符来将值强制转型为另一种数据类
型。
强制转型并不会永久地改变值的数据类型;它只是以更方便的形式表示值。将用户定
义的数据类型强制转型为内置类型使客户机程序能够在不知道数据类型的内部结构的情况
下处理这些数据类型。
如果更改数据类型,那么新数据类型必须能够存储所有旧的值。
数据类型转换和强制转型都取决于在 syscasts 系统目录表中注册的强制转型。有关
syscasts 的信息,请参阅 SYSCASTS。
强制转型是内置的或用户定义的。存在强制转型单值和扩展数据类型的准则。有关对
不透明数据类型强制转型的更多信息,请参阅 GBase 8s 用户定义的例程与数据类型开发
者指南。有关对其他扩展数据类型进行强制转型的信息,请参阅《GBase
8s 数据库设计和
实现指南》。
使用内置强制转型
用户 gbasedbt 拥有内置强制转型。他们控制从一种内置数据类型到另一种内置数据
类型的转换。内置强制转型允许数据库服务器尝试以下数据类型转换:
Ø
字符类型至任何其他字符类型
Ø
字符类型至另一种内置类型或从另一种内置类型至字符类型
Ø
数字类型至任何其他数字类型
必要时,数据库服务器自动调用适当的内置强制转型。对于时间数据类型,DATE 与

GBase 8s SQL 指南:参考
南大通用数据技术股份有限公司 - 129 -

DATETIME 数据类型之间的转换需要使用 EXTEND 函数进行显式强制转型,而对于数字与
INTERVAL 之间的转换,需要使用 UNITS 运算符进行显式强制转型。内置强制转型不可用
于将大型(BYTE、BLOB、CLOB 和 TEXT)内置类型转换为其他内置数据类型。
当将列从一种内置数据类型转换为另一种时,数据库服务器将适当的内置强制转型应
用于列中已存在的每个值。
如果新的数据类型不能存储任何生成的值,
那么 ALTER
TABLE 语
句会失败。
例如,如果您尝试将列从 INTEGER 数据类型转换为 SMALLINT 数据类型,并且
INTEGER 列中存在以下值,那么数据库服务器不会更改数据类型,因为 SMALLINT 列不能
容纳大于 32,767 的数字:
400 700 50000 700
如果您尝试将数据从 FLOAT 或 SMALLFLOAT 列传送至 INTEGER、SMALLINT 或
DECIMAL 列,那么会发生相同的情况。在数据类型转换期间可能会发生溢出、下溢或截断
错误。
下面各节描述某些类型的强制转型和转换期间的数据库服务器行为。
数字到数字的转换
当将数据从一种数字数据类型转换为另一种数字数据类型时,偶尔会发现舍入错误。
下表指示哪些数字数据类型转换是可接受的,以及当在某些数字数据类型之间转换时
可能遇到哪些种类的错误。 在表中,使用了以下代码:

OK
无错误
P
可能会出错,这取决于小数的精度
E
可能会出错,这取决于数据值
D
无错误,但可能会丢失较少的有效位
表 1. 可接受的转换和可能的错误
目标类型
SMALL
INT
INTEGER
INT8
SMALL
FLOAT
FLOAT
DECIMAL
SMALLINT
OK
OK
OK
OK
OK
OK
INTEGER
E
OK
OK
E
OK
P
INT8
E
E
OK
D
E
P
SMALLFLOAT
E
E
E
OK
OK
P

GBase 8s SQL 指南:参考
南大通用数据技术股份有限公司 - 130 -

目标类型
SMALL
INT
INTEGER
INT8
SMALL
FLOAT
FLOAT
DECIMAL
FLOAT
E
E
E
D
OK
P
DECIMAL
E
E
E
D
D
P

例如,如果将 FLOAT 值转换为 DECIMAL(4,2),那么数据库服务器在将浮点数存储为
DECIMAL 之前先对它进行舍入。
此转换可能会导致错误,这取决于指定给 DECIMAL 列的精度。
在数字与字符之间转换
可以将字符列(具有诸如 CHAR、NCHAR、NVARCHAR 或 VARCHAR 等数据类型)转换为
数字列。
但是,
如果数据字符串包含数字列中任何无效字符
(例如:
字母 l 而不是数字 1)

那么数据库服务器会返回错误。
还可以将数字列转换为字符列。但是,如果字符列不够大,不足以接收数字,那么数
据库服务器会生成错误。如果数据库服务器生成错误,那么它不能完成 ALTER
TABLE 语句
或强制转型,并使列值保留为字符。您就会接收到错误消息,并且会自动回滚语句(不管
您是否在事务中)。
INTEGER 和 DATE 之间的转换
您可以将整数列(SMALLINT、INTEGER 或 INT8)转换为 DATE 值。数据库服务器将整
数解释为内部格式的 DATE 列的值。您还可以将 DATE 列转换为整数列。数据库服务器将
内部格式的 DATE 列存储为表示儒略日期的整数。
DATE 和 DATETIME 之间的转换
可以将 DATE 列转换为 DATETIME 列。
但是,
如果 DATETIME 列包含的字段比 DATE 列
多,那么数据库服务器要么忽略这些字段,要么用零填充这些字段。以下列表中的说明显
示了如何转换这两种数据类型(假设缺省数据格式为 mm/dd/yyyy):
ü
如果将 DATE 转换为 DATETIME
YEAR
TO
DAY,那么数据库服务器会将现有的 DATE
值转换为 DATETIME 值。例如:值 08/15/2002 变为 2002-08-15。
ü
如果将 DATETIME YEAR TO DAY 转换为 DATE 格式,那么值 2002-08-15 将变为
08/15/2002。
ü
如果将 DATE 转换为 DATETIME
YEAR
TO
SECOND,
那么数据库服务器会将现有 DATE
值转换为 DATETIME 值并用零填充其他的 DATETIME 字段。例如:08/15/2002 变
为 2002-08-15 00:00:00。
ü
如果将 DATETIME YEAR TO SECOND 转换为 DATE,那么数据库服务器会将现有
DATETIME 转换为 DATE 值,但删除小于 DAY 的时间单位的字段。例如:
2002-08-15 12:15:37 变为 08/15/2002。

GBase 8s SQL 指南:参考
南大通用数据技术股份有限公司 - 131 -

使用用户定义的强制转型
创建隐式和显式强制转型的用户拥有这些强制转型。他们控制用户定义的数据类型与
其他数据类型之间的强制转型和转换。用户定义的数据类型的开发者必须创建某些隐式和
显式强制转型以及用来实现这些强制转型的函数。这些强制转型使用户定义的类型可以表
示为客户机可以处理的格式。
有关如何注册和使用隐式和显式强制转型的信息,
请参阅 GBase
8s
SQL 指南:
语法 和
《GBase 8s 数据库设计和实现指南》中的 CREATE CAST 语句。
隐式强制转型
隐式强制转型允许您将用户定义的数据类型转换为内置类型,反之亦然。数据库服务
器在必须对表达式进行求值和比较或传递自变量时自动调用单个隐式强制转型。需要多个
隐式强制转型的操作会失败。
用户可以使用 CAST
AS 关键字或双冒号 (::) 强制转型运算符来显式调用隐式强制转
型。
显式强制转型
与隐式强制转型或内置强制转型不同,数据库服务器决不会自动调用显式强制转型。
用户必须使用 CAST AS 关键字或使用双冒号 ( :: ) 强制转型运算符来显式调用它们。
确定应用哪种强制转型
数据库服务器使用下列规则来确定在特定情况下应用哪种强制转型:
1. 为了比较两种内置类型,数据库服务器自动调用适当的内置强制转型。
2. 数据库服务器仅对每个操作数应用一次隐式强制转型。如果需要两个或更多
强制转型才能将操作数转换为指定类型,那么用户必须显式调用其他强制转
型。
在下面的示例中,将文字值 5.55 隐式强制转型为 DECIMAL,然后将它显式强制转型
为 MONEY,最后强制转型为 yen:
CREATE DISTINCT TYPE yen AS MONEY
. . .
INSERT INTO currency_tab
VALUES (5.55::MONEY::yen)
要将单值类型与其源类型进行比较,用户必须将其中一种类型显式强制转型为另
一种类型。
为了将单值类型与不是其源的类型进行比较,数据库服务器将查找源类型与指定
类型之间的隐式强制转型。
如果这两种强制转型均未注册,
那么用户必须调用单值类型与指定类型之间的显式
强制转型。如果此强制转型未注册,那么数据库服务器自动调用从源类型到指定类型的强

GBase 8s SQL 指南:参考
南大通用数据技术股份有限公司 - 132 -

制转型。
如果没有定义这些强制转型,那么比较会失败。
要将不透明类型与内置类型进行比较,用户必须将不透明类型显式强制转型为数据
库服务器可以理解的数据类型(如 LVARCHAR、SENDRECV、IMPEX 或 IMPEXBIN)。然后,
数据库服务器调用内置强制转型来将结果转换为指定的内置类型。
要比较两种不透明类型,用户必须将其中一种不透明类型显式地强制转型为数据
库服务器可以理解的形式(例如:LVARCHAR、SENDRECV、IMPEX 或 IMPEXBIN),然后
将此类型显式地强制转型为第二种不透明类型。
有关强制转型和 IMPEX、
IMPEXBIN、
LVARCHAR 和 SENDRECV 类型的信息,
请参阅 GBase
8s 用户定义的例程与数据类型开发者指南。
单值类型的强制转型
根据内置类型或现有不透明类型或 ROW 类型来定义单值类型。
虽然单值类型的数据与
源类型的数据具有相同的长度、对齐方式和数据传递方式,但是不能将这两种类型直接进
行比较。要将单值类型与其源类型进行比较,必须将其中一种类型显式强制转型为另一种
类型。
当创建新的单值类型时,数据库服务器会自动注册两种显式强制转型:
从单值类型到其源类型的强制转型
从源类型到单值类型的强制转型
可以创建单值类型与其源类型之间的隐式强制转型。但是,要创建隐式强制转型,首
先必须删除单值类型与其源类型之间的缺省显式强制转型。
还可以使用已对源类型注册的所有强制转型而不必对单值类型进行修改。还可以创建
和注册只适用于单值类型的新强制转型和支持函数。
有关显示如何为单值类型创建强制转型函数以及将函数注册为强制转型的示例,请参
阅《GBase 8s 数据库设计和实现指南》。
可以对哪些扩展数据类型进行强制转型?
下表显示了可以进行强制转型的扩展数据类型组合。
表 2. 扩展数据类型组合
目标类型
不透明
类型
单值类型
命名 ROW
类型
未命名
ROW 类型
集合类型
内置类型
不透明类型
显式或
隐式
显式
显式
无效
无效
显式或隐

3
单值类型
显式
3
显式
显式
无效
无效
显式或隐


GBase 8s SQL 指南:参考
南大通用数据技术股份有限公司 - 133 -

目标类型
不透明
类型
单值类型
命名 ROW
类型
未命名
ROW 类型
集合类型
内置类型
命名 ROW
类型
显式
3
显式
显式
3
显式
1
无效
无效
未命名 ROW
类型
无效
无效
显式
1
隐式
1
无效
无效
集合类型
无效
无效
无效
无效
显式
2
无效
内置类型
显式或
隐式
3
显式或隐

无效
无效
无效
系统定义
(隐式)

1 当两种 ROW 类型在结构上等价,或存在强制转型来处理相应字段类型不同的数据转
换时适用。
2 当存在强制转型来在各个集合类型的元素类型之间进行转换时适用。
3 当存在
用户定义的强制转型来在两种数据类型之间进行转换时适用。
该表只显示了源类型与目标类型之间的强制转型是否可能。在某些情况下,首先必须
创建用户定义的强制转型,然后才能执行两种数据类型之间的转换。在其他情况下,数据
库服务器提供隐式强制转型或必须显式调用的内置强制转型。

集群环境描述:
Coordinator 节点:172.168.83.11,172.168.83.12,172.168.83.13,172.168.83.15
Data 节点:
vc1:172.168.83.11,172.168.83.12,172.168.83.15,172.168.83.16
Vc2:172.168.83.13,172.168.83.14
待缩容的data 节点IP:172.168.83.16

ALTER TABLE…DROP PARTITION
语法格式
ALTER TABLE [vc_name.][database_names.]tbl_name
alter_specification [, alter_specification] ...
alter_specification:
DROP PARTITION partition_names
说明

分区表的分区条件为RANGE 或LIST;

不能删除全部分区,确保至少存在1 个分区;

不能删除子分区。
示例
gbase> show create table pt\G
*************************** 1. row ***************************
Table: pt
Create Table: CREATE TABLE "pt" (
"i" int(11) DEFAULT NULL,

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
983
"c" varchar(10) DEFAULT NULL,
"d" date DEFAULT NULL
) ENGINE=EXPRESS DEFAULT CHARSET=utf8
TABLESPACE='sys_tablespace'
PARTITION BY RANGE (i)
(PARTITION p0 VALUES LESS THAN (10) TABLESPACE = 'sys_tablespace'
ENGINE = EXPRESS,
PARTITION p1 VALUES LESS THAN (20) TABLESPACE = 'sys_tablespace'
ENGINE = EXPRESS,
PARTITION p2 VALUES LESS THAN (30) TABLESPACE = 'sys_tablespace'
ENGINE = EXPRESS,
PARTITION p3 VALUES LESS THAN MAXVALUE TABLESPACE =
'sys_tablespace' ENGINE = EXPRESS)
1 row in set (Elapsed: 00:00:00.00)
gbase> alter table pt drop partition p3;
Query OK, 0 rows affected (Elapsed: 00:00:00.11)
Records: 0
Duplicates: 0
Warnings: 0
gbase> alter table pt drop partition p1;
Query OK, 0 rows affected (Elapsed: 00:00:00.12)
Records: 0
Duplicates: 0
Warnings: 0
gbase> show create table pt\G
*************************** 1. row ***************************
Table: pt
Create Table: CREATE TABLE "pt" (
"i" int(11) DEFAULT NULL,
"c" varchar(10) DEFAULT NULL,
"d" date DEFAULT NULL
) ENGINE=EXPRESS DEFAULT CHARSET=utf8
TABLESPACE='sys_tablespace'
PARTITION BY RANGE (i)
(PARTITION p0 VALUES LESS THAN (10) TABLESPACE = 'sys_tablespace'
ENGINE = EXPRESS,

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
984
PARTITION p2 VALUES LESS THAN (30) TABLESPACE = 'sys_tablespace'
ENGINE = EXPRESS)
1 row in set (Elapsed: 00:00:00.01)
注意

删除分区表分区时,若只有1 个分区时,报错;

删除分区表分区时,若同时删除所有分区,报错;

删除分区表分区时,若是非RANGE 或LIST 分区,报错。