返回首页

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

更新日期:2024年09月11日

UG
0
0
0
bond0
处理方法
执行route del 删除和route add 新增更换路由得以处理,
同时建议系统维护厂商将
正确路由和网关写入配置文件让其长期有效。
修改命令:
route del -net 10.174.64.0 netmask 255.255.255.0 dev bond0
route del default gw 10.174.64.254
route add default gw 10.174.18.1
示例
#route
Kernel IP routing table
Destination Gateway Genmask
Flags
Metric
Ref
Use
Iface

使用 CREATE DISTINCT TYPE 语句创建新的 distinct 数据类型。
该语句是 SQL ANSI/ISO 标准的扩展。
语法

元素
描述
限制
语法
distinct_type 在这里为新的
distinct 数据类
型声明的名称
在兼容 ANSI 的数据库中,所有
者和数据类型的组合在数据库中
必须是唯一的。在不兼容 ANSI
数据
类型

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 222
元素
描述
限制
语法
的数据库中,名称在数据库中的
数据类型名称中必须是唯一的
source_type
新类型所基于的
现有类型名称
必须为内置数据类型或用
CREATE DISTINCT TYPE 、
CREATE OPAQUE TYPE 或 CREATE
ROW TYPE 语句创建的类型
数据
类型
用法
Distinct 类型是基于内置数据类型或现有不透明数据类型,指定的 ROW 数据类
型或者其它 Distinct 数据类型的数据类型。Distinct 数据类型是强归类的。虽然
Distinct 类型与其源类型对数据有相同的物理表示法,但两种类型的值在没有从一
种类型到另一种类型的显式强制转型的情况下无法进行比较。
要创建 Distinct 数据类型,您必须拥有数据库上的 Resource 权限。任何拥有
Resource 权限的用户均可从内置数据类型之一创建 Distinct 类型,而该用户是
用户 gbasedbt 所拥有的。
重要: 不能在 SERIAL 、BIGSERIAL 或 SERIAL8 数据类型上创建 Distinct 类
型。
要从不透明类型、指定的 ROW 类型或另一 Distinct 类型创建 Distinct 类型,您
必须是该数据类型的所有者或在该数据类型上拥有 Usage 权限。
缺省情况下,一旦定义了 Distinct 类型,之一该 Distinct 类型的所有者和 DBA
可以使用它。然而,Distinct 类型的所有者可向其他用户授权对该 Distinct 类型
的 Usage 权限。
Distinct 类型与其源类型有相同的存储结构。以下语句创建了基于内置 DATE 数
据类型的 Distinct 类型 birthday:
CREATE DISTINCT TYPE birthday AS DATE;
虽然 GBase 8s 使用对 Distinct 类型以及它的源类型使用相同的存储格式,但
Distinct 类型与其源类型不能在一个操作中进行比较,除非一个类型显式强制转型
到另一个类型。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 223
如果您包含了 IF NOT EXISTS 关键字,当指定名称的 Distinct 数据类型已经在
当前数据库中注册过时,则数据库服务器不采取任何操作(而不是向应用程序发
送异常)。
对 Distinct 类型的权限
要创建 Distinct 类型,您必须拥有该数据库上的 Resource 权限。当创建 Distinct
类型时,只有您,即所有者对此类型拥有 Usage 权限。使用 GRANT 或
REVOKE 语句向其它数据库用户授权或调用 Usage 权限。
要找出特定类型上存在哪些特权,请在 sysxtdtypes 系统目录表中检查所有者名
称,并在 sysxtdtypeauth 系统目录表中检查可能已经授予的其它数据类型特权。
有关系统目录表的更多信息,请参阅 GBase 8s SQL 参考指南 。
DB-Access 实用程序也可显示对 Distinct 类型的特权。
支持函数和强制转型
当您创建 Distinct 类型时, GBase 8s 自动定义两种显式强制转型:

从 Distinct 类型到其源类型的强制转型

从源类型到 Distinct 类型的强制转型
因为这两个数据类型具有相同的表示法(相同的长度和对齐方式),所以实现这
些强制转型不需要支持函数。
您可在 Distinct 类型与其源类型之间创建隐式强制转型。要创建隐式强制转型,
请使用 Table Options 子句来指定外部数据的格式。然而,您必须首先删除
Distinct 类型与其源类型之间的缺省显式强制转型。
在源类型上定义的所有支持函数的强制转型可用于 Distinct 类型。然而,对
Distinct 类型定义的强制转型和支持函数对源类型不可用。请使用 Table Options
子句指定外部数据的格式。
操纵 Distinct 类型
当将 Distinct 类型与其源类型进行比较或操纵它们的数据时,在以下情况中您必
须显式地将一种类型强制转型为其它类型:

使用其它类型的值插入或更改一种类型的列

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

使用关系运算符来加、减、乘、除、比较或以其它方式操纵两个值,一个
源类型的值和一个 Distinct 类型的值
例如,假设您创建了 Distinct 类型 dist_type ,它基于 NUMERIC 数据类型。
然后您创建了带有两列的表,一个属于 dist_type 类型,一个属于 NUMERIC
类型。
CREATE DISTINCT TYPE dist_type AS NUMERIC;
CREATE TABLE t(col1 dist_type, col2 NUMERIC);
要直接将 Distinct 类型与其源类型进行比较或者将源类型的值分配到 Distinct 类
型的列上,您必须将一种类型强制转型到其它类型,如以下示例所示:
INSERT INTO tab (col1) VALUES (3.5::dist_type);

SELECT col1, col2
FROM t WHERE (col1::NUMERIC) > col2;

SELECT col1, col2, (col1 + col2::dist_type) sum_col
FROM tab;
有关在本地数据库外的表内存取 DISTINCT 数据类型的查询和其它分布 DML
操作的信息,请参阅 分布式操作中的 DISTINCT 类型 。

语法格式
SELECT ...UNION [ALL | DISTINCT]SELECT ...
[UNION [ALL | DISTINCT]
SELECT ...]
使用说明
UNION 用来将多个SELECT 语句的结果合并到一个结果集中。
在每个SELECT 语句对应位置上的选择列,应该有相同的类型。
(例如,第一个语
句选出的第一列应该与其它语句选出的第一列的类型相同)

第一个SELECT 语句
中用到的列名称被作为返回结果的列名称。
SELECT 语句是一般的查询语句,但是有以下约束:

不同的数据类型,不能使用UNION 和UNION ALL,例如:数值型,字符型,
日期和时间型之间不能使用UNION 和UNION ALL,但是DATETIME 和
TIMESTAMP 类型可以使用UNION 和UNION ALL,
其它的日期和时间类型则
不行。

如果UNION 和UNION ALL 两边的数据类型为CHAR 类型,进行UNION 和
UNION ALL 操作时,结果返回VARCHAR 类型。

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 727
例如:SELECT CHAR(10) UNION SELECT CHAR(255) 的结果集为
VARCHAR(255)。

UNION 和UNION ALL 结果由小的数据类型向大的数据类型转换,如:INT ->
BIGINT -> DECIMAL -> DOUBLE。
例如:SELECT INT UNION SELECT DOUBLE 的结果集为DOUBLE 型。

NULL 可以和任何类型做UNION 和UNION ALL。
例如:SELECT NULL UNION SELECT 1;

如果只是使用UNION,那么将返回无重复记录的结果集,此时,UNION 等同
于UNION DISTINCT。如果使用UNION ALL,将会返回所有SELECT 后的结
果集,这个结果集会存在重复的记录。

如果在多个SELECT 的UNION 查询中,同时存在UNION [DISTINCT]和
UNION ALL,
那么UNION ALL 会被忽略,
最终返回UNION [DISTINCT]后的
结果集(过滤掉重复的记录行)。

如果希望使用ORDER BY 或LIMIT 子句来分类或限制整个UNION 结果,可
以给单独的SELECT 语句加上括号或者把ORDER BY 或LIMIT 置于最后。
示例

示例1:ELECT 语句中使用ORDER BY 子句分类UNION 结果。
gbase> CREATE TABLE student (stu_no int, stu_name varchar(200),stu_sex int);
Query OK, 0 rows affected

gbase> INSERT INTO student VALUES(4,'King',1),(5,'Smith',1);
Query OK, 2 rows affected
Records: 2 Duplicates: 0 Warnings: 0

gbase> SELECT stu_name FROM student WHERE stu_name LIKE 'S%'
UNION
SELECT stu_name FROM student WHERE stu_name LIKE '%K%'
ORDER BY stu_name LIMIT 10;
+----------+
| stu_name |
+----------+
| King |
| Smith |
+----------+
2 rows in set
这种ORDER BY 不能使用包括表名的列引用(如,table_name.col_name 格式
的名字)。相对的,可以在第一个SELECT 语句中提供一个列的别名并在
ORDER BY 中引用这个别名。

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 728

示例2:对于单独的SELECT 应用ORDER BY 或LIMIT 时,将子句插入到封
装SELECT 的圆括号中。
gbase> (SELECT c_name FROM ssbm.customer WHERE c_name LIKE '%00002%' ORDER BY
c_name LIMIT 10)
UNION
(SELECT c_name FROM ssbm.customer WHERE
c_name LIKE '%00003%'ORDER
BY
c_name
LIMIT 10);
+--------------------+
| c_name |
+--------------------+
| Customer#000000002 |
| Customer#000000020 |
| Customer#000000021 |
| Customer#000000022 |
| Customer#000000023 |
| Customer#000000024 |
| Customer#000000025 |
| Customer#000000026 |
| Customer#000000027 |
| Customer#000000028 |
| Customer#000000003 |
| Customer#000000030 |
| Customer#000000031 |
| Customer#000000032 |
| Customer#000000033 |
| Customer#000000034 |
| Customer#000000035 |
| Customer#000000036 |
| Customer#000000037 |
| Customer#000000038 |
+--------------------+
20 rows in set
圆括号中的SELECT 语句的ORDER BY 只有与LIMIT 结合才起作用。否则,
ORDER BY 将被优化掉,防止语法二义性。

示例3:UNION 结果集中列的长度和类型需要考虑到从所有SELECT 语句中
查出的值。
第一个SELECT 查出的值比第二个的SELECT 的值短。
gbase> SELECT REPEAT('a',1) UNION SELECT REPEAT('b',10);
+---------------+
| REPEAT('a',1) |
+---------------+
| a |

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 729
| bbbbbbbbbb |
+---------------+
2 rows in set

示例4:
系统报告错误信息,
是因为LIMIT 1 会产生二义性,
执行器不知道LIMIT
1 是UNION 后执行,
还是SELECT c_name FROM ssbm.customer LIMIT 1 后再
UNION SELECT c_custkey FROM ssbm.customer。
gbase>
SELECT
c_custkey
FROM
ssbm.customer
UNION
SELECT
c_name
FROM
ssbm.customer
LIMIT 1;
ERROR 1733 (HY000): GBase general error: UNION/INTERSECT/MINUS of non-matching
columns: LONGLONG UNION/INTERSECT/MINUS VARCHAR

示例5:DATETIME 和TIMESTAMP 类型的UNION。
gbase> CREATE TABLE t_student (sno int, sname varchar(100),sdate datetime);
Query OK, 0 rows affected

gbase> INSERT INTO t_student VALUES(1,'Tom',NOW()),(2,'Jim',NOW());
Query OK, 2 rows affected
Records: 2 Duplicates: 0 Warnings: 0

gbase> SELECT * FROM t_student;
+------+-------+---------------------+
| sno | sname | sdate |
+------+-------+---------------------+
| 1 | Tom | 2013-10-14 17:56:19 |
| 2 | Jim | 2013-10-14 17:56:19 |
+------+-------+---------------------+
2 rows in set

gbase> CREATE TABLE t_Result (sno int, sresult decimal(10,2),sdate timestamp);
Query OK, 0 rows affected

gbase> INSERT INTO t_result VALUES(1,99.5,NOW()),(2,100,NOW());
Query OK, 2 rows affected
Records: 2 Duplicates: 0 Warnings: 0

gbase> SELECT * FROM t_result;
+------+---------+---------------------+
| sno | sresult | sdate |
+------+---------+---------------------+
| 1 | 99.50 | 2013-10-14 17:57:15 |
| 2 | 100.00 | 2013-10-14 17:57:15 |
+------+---------+---------------------+
2 rows in set


GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 730
gbase> SELECT sno,sdate FROM t_student UNION SELECT sno,sdate FROM t_result;
+------+---------------------+
| sno | sdate |
+------+---------------------+
| 1 | 2013-10-14 17:56:19 |
| 2 | 2013-10-14 17:56:19 |
| 1 | 2013-10-14 17:57:15 |
| 2 | 2013-10-14 17:57:15 |
+------+---------------------+
4 rows in set

示例6:CHAR 和CHAR 类型的UNION。
gbase> USE test;
Query OK, 0 rows affected

gbase> CREATE TABLE t1(a char(10));
Query OK, 0 rows affected

gbase> CREATE TABLE t2(a char(255));
Query OK, 0 rows affected

gbase> CREATE TABLE ta AS SELECT * FROM t1 UNION SELECT * FROM t2;
Query OK, 0 rows affected

gbase> DESC ta;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| a | varchar(255) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
1 row in set