返回首页

gbase数据、南大通用产品文档:GBase8aGBase Migration Toolkit 工具简介

更新日期:2024年09月11日

GBase Migration Toolkit 迁移工具是GBase 提供的一款可以实现异构数据库进
行数据迁移的工具。
目前可以实现将源数据库
(目前支持的源数据库有:
ACCESS 、
Oracle 、
SQL Server2005、
DM 、
DB2 、
MySQL、
ShenTong、
GBase8sV8.3、
GBase8t、
GBase8s、PostgreSQL 和Teradata)中数据迁移到目标数据库(目前支持的目标数
据库有:GBase8a 、GBase8t 和GBase8sV8.7)。

GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
129
迁移工具是一个C/S 结构的软件,安装简便,只需要获取安装包解压后即可使
用。迁移工具有简单易操作的图形化界面,根据数据迁移需求创建相应任务,并且
可以对迁移任务进行相应的设置,实现多线程并发数据迁移。

GBase 8s数据库中,并没有包的概念,GCI接口仅是用作适配。其本身意义是一个存储过程
和函数定义的集合。包对象访问过程一般是包含两层,但每层的访问过程是一致的(用到
的属性不同) :一是包本身
二是包内某个存储过程或函数

具体访问对象的取值过程如下图:

去除list对象节点外,其他均为DTYPE_PARAM属性,使用GCIAttrGet接口获取。
List对象的每个元组则用GCIParamGet接口获取。

GBase 8s GCI 接口使用指南

南大通用数据技术股份有限公司 19

您可定义变量为作用域中的本地的或全局的。
本部分描述本地变量。在 SPL 例程中,本地
变量:

仅对于该 SPL 例程的持续时间是有效的

每一次执行例程时,重置为它们的初始值或为用户传给该例程的值

不可有缺省值
您可在任一下列数据类型上定义本地变量:

内建的数据类型
(除了 SERIAL、
SERIAL8、
BIGSERIAL、
TEXT 或 BYTE 之外)

在执行该 SPL 例程之前,在数据库中定义的任何扩展的数据类型(row 类型、
opaque、distinct 或集合类型)
本地变量的作用域时在其中声明它的那个语句块。您可以不同的定义在该语句块之外使用
相同的变量名称。
要获取关于定义全局变量的更多信息,请参阅 声明全局变量。

本地变量的作用域
在定义本地变量的那个语句块内以及任何嵌套的语句块内,它是有效的,除非您在该语句
块中重新定义该变量。
在系统中的 SPL 过程的开头,定义并初始化整数变量 x、y 和 z。
图: 定义和初始化变量。
CREATE PROCEDURE scope()
DEFINE x,y,z INT;

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 276 -
LET x = 5;
LET y = 10;
LET z = x + y; --z is 15
BEGIN
DEFINE x, q INT;
DEFINE z CHAR(5);
LET x = 100;
LET q = x + y; -- q = 110
LET z = 'silly'; -- z receives a character value
END
LET y = x; -- y is now 5
LET x = z; -- z is now 15, not 'silly'
END PROCEDURE;
BEGIN 与 END 语句标记在其中定义整数变量 x 和 q 以及 CHAR 变量 z 的嵌套的语句
块。在嵌套的块内,重新定义的变量 x 掩盖原始的变量 x。在标记该嵌套的块结束的 END
语句之后,可再次访问 x 的原始值。

声明内建的数据类型的变量
声明为内建的 SQL 数据类型的变量可持有从那个内建的类型的列检索的值。您可将 SPL
变量声明为大部分内建的类型,
除了 BIGSERIAL、SERIAL 和 SERIAL8 之外,如下图所
示。
图: 内建的类型变量。
DEFINE x INT;
DEFINE y INT8;
DEFINE name CHAR(15);
DEFINE this_day DATETIME YEAR TO DAY;
您可声明适当的整数数据类型(诸如 BIGINT、INT 或 INT8)的 SPL 变量,来存储序列
列或序列对象的值。

声明智能大对象的变量
BLOB 或 CLOB 对象(或包含智能大对象的数据类型)的变量不包含该对象本身,而是
指向该对象的指针。下图展示如何为 BLOB 和 CLOB 对象定义变量。
图: BLOB 或 CLOB 对象的变量。
DEFINE a_blob BLOB;
DEFINE b_clob CLOB;

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 277 -

声明简单大对象的变量
简单大对象(TEXT 或 BYTE 对象)的变量不包含该对象本身,而是执行该对象的指针。
当您对 TEXT 或 BYTE 数据类型定义变量时,您必须在数据类型之前使用关键字
REFERENCES,如下图所示。
图: 在数据类型之前使用 REFERENCES 关键字。
DEFINE t REFERENCES TEXT;
DEFINE b REFERENCES BYTE;

声明集合变量
为了保持从数据库访存的集合,变量必须为类型 SET、MULTISET 或 LIST。
重要: 必须将集合变量定义为本地变量。您不可将集合变量定义为全局变量。
SET、MULTISET 或 LIST 类型的变量是保存在 DEFINE 语句中命名的类型的集合的集合变
量。下图展示如何定义 typed 集合变量。
图: 定义 typed 集合变量。
DEFINE a SET ( INT NOT NULL );

DEFINE b MULTISET ( ROW ( b1 INT,
b2 CHAR(50),
) NOT NULL );

DEFINE c LIST ( SET (DECIMAL NOT NULL) NOT NULL);
您必须始终将集合变量的元素定义为 NOT NULL。在此示例中,定义变量 a 来保存非
NULL 整数的 SET;变量 b 保存非 NULL row 类型的 MULTISET;变量 c 保存非 NULL
十进制值的非 NULL 集合的 LIST。
在变量定义中,您可在任何组合或深度中嵌套复合的类型,来与存储在您的数据库中的数
据类型相匹配。
您不可将一种类型的集合变量分配给另一类型的集合变量。例如,如果您将集合变量定义
为 SET,则您不可将另一 MULTISET 或 LIST 类型的集合变量分配给它。

声明 row 类型变量
Row 类型变量保存命名的和未命名的 row 类型的数据。
您可定义命名的 row 变量或未命
名的 row 变量。假设您定义如下图所示的命名的 row 类型。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 278 -
图: 命名的和未命名的 row 变量。
CREATE ROW TYPE zip_t
(
z_code CHAR(5),
z_suffix CHAR(4)
);

CREATE ROW TYPE address_t
(
street VARCHAR(20),
city VARCHAR(20),
state CHAR(2),
zip zip_t
);

CREATE ROW TYPE employee_t
(
name VARCHAR(30),
address address_t
salary INTEGER
);

CREATE TABLE employee OF TYPE employee_t;
如果您以命名的 row 类型的名称定义变量,则该变量仅可保存那种 row 类型的数据。在
下图中,person 变量仅可保存 employee_t 类型的数据。
图: 定义 person 变量。
DEFINE person employee_t;
要定义保存在未命名的 row 类型中的数据的变量,请跟在 row 类型的字段之后使用
ROW 关键字,如下图所示。
图: 使用后跟 row 类型的字段的 ROW 关键字。
DEFINE manager ROW (name VARCHAR(30),
department VARCHAR(30),
salary INTEGER );
由于仅对未命名的 row 类型的结构等价进行类型检查,因此,以未命名的 row 类型定义
的变量可保存任何未命名的 row 类型的数据,
其有相同的字段数和相同的类型定义。
因此,
变量 manager 可保存下图中任何 row 类型的数据。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 279 -
图: 未命名的 row 类型。
ROW ( name VARCHAR(30),
department VARCHAR(30),
salary INTEGER );

ROW ( french VARCHAR(30),
spanish VARCHAR(30),
number INTEGER );

ROW ( title VARCHAR(30),
musician VARCHAR(30),
price INTEGER );
重要:
在您使用 row 类型变量之前,
您必须使用 LET 语句或 SELECTINTO 语句来初始化该
row 变量。

声明 opaque 类型和 distinct 类型变量
Opaque 类型变量保存从 opaque 数据类型检索的数据。Distinct 类型变量保存从 distinct
数据类型检索的数据。如果您以 opaque 数据类型或 distinct 数据类型定义变量,则该变
量仅可保存那种类型的数据。
如果您定义名为 point 的 opaque 数据类型,和名为 centerpoint 的 distinct 数据类型,则您
可定义 SPL 变量来保存这两类数据,如下图所示。
图: 定义 SPL 变量来保存 opaque 和 distinct 数据类型。
DEFINE a point;
DEFINE b centerpoint;
变量 a 仅可保存类型 point 的数据,b 仅可保存类型 centerpoint 的数据。

使用 LIKE 子句来声明列数据的变量
如果您使用 LIKE 子句,
则数据库服务器定义有相同数据类型的变量作为表或视图中的列。

如果该列包含集合、row 类型或嵌套的复合类型,则该变量具有在该列中定义的复合的或
嵌套的复合类型。
在下图中,变量 loc1 定义 image 表中 locations 列的数据类型。
图: 为 image 表中的 locations 列定义 loc1 数据类型。
DEFINE loc1 LIKE image.locations;


GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 280 -
声明 PROCEDURE 类型变量
在 SPL 例程中,您可定义类型 PROCEDURE 的变量,并将现有的 SPL 例程或外部例程
的名称分配给该变量。定义 PROCEDURE 类型的变量指示该变量是对用户定义的例程的
调用,而不是对同一名称的内建例程的调用。
例如,下图中的语句定义 length 为一个 SPL 过程或 SPL 函数,不作为内建的 LENGTH
函数。
图: 定义 length 作为 SPL 过程。
DEFINE length PROCEDURE;
LET x = length( a,b,c );
此定义在该语句块的作用域内禁用内建的 LENGTH 函数。
如果您已以名称 LENGTH 创建
了 SPL 或外部例程,则您可使用这样的定义。
由于 GBase 8s 支持例程重载,因此,您可以相同的名称定义多个 SPL 例程或外部例程。
如果您从 SPL 例程调用任何例程,则 GBase 8s 基于指定的参数和例程确定规则,确定使
用哪个例程。要获取关于例程重载和例程确定的信息,请参阅《GBase 8s 用户定义的例程
和数据类型开发者指南》。
提示:
如果您以相同的名称创建 SPL 例程作为聚集函数
(SUM、
MAX、
MIN、
AVG、
COUNT)
或使用名称 extend,则您必须以所有者名称来限定该例程。

带有变量的下标
您可随同 CHAR、VARCHAR、NCHAR、NVARCHAR、BYTE 或 TEXT 数据类型的变
量使用下标。下标指示您想要在变量内使用的起始的和终止的字符位置。
下标必须始终为常量。您不可使用变量作为下标。下图展示如何随同 CHAR(15) 变量使用
下标。
图: 带有 CHAR(15) 变量的下标。
DEFINE name CHAR(15);
LET name[4,7] = 'Ream';
SELECT fname[1,3] INTO name[1,3] FROM customer
WHERE lname = 'Ream';
在此示例中,将客户的姓置于 name 的位置 4 与 7 之间。将客户的名的前三个字符检索
到 name 的位置 1 至 3 内。由两个下标定界的变量的该部分称为子字符串。

变量与关键字歧义
如果您声明的变量的名字是 SQL 关键字,则可发生歧义。下列标识符的规则帮助您避免
SPL 变量、SPL 例程名称和内建的函数名称的歧义:

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 281 -

定义了的变量优先级最高。

以 DEFINE 语句中的 PROCEDURE 关键字定义的例程优先于 SQL 函数。

SQL 函数优先于那些存在但未以 DEFINE 语句中的 PROCEDURE 关键字标识
的 SPL 例程。
通常,请避免为变量的名称使用 ANSI 保留字。例如,您不可以名称 count 或 max 定义变
量,因为它们是聚集函数的名称。要了解您应避免用作变量名称的保留的关键字列表,请
参阅《GBase 8s SQL 指南:语法》中的“标识符”段。
要获取关于 SPL 例程名称与 SQL 函数名称之间的歧义的信息,
请参阅
《GBase 8s SQL 指
南:语法》。
变量和列名称
如果您为 SPL 变量使用一个您为列名称使用的同样的标识符,
则数据库服务器假定该标识
符的每一实例都是变量。请以表名称限定列名称,使用点符号表示法,以便将标识符用作
列名称。
在下图中的 SELECT 语句中,customer.lname 是列名称,lname 是变量名称。
图: SELECT 语句中的列名称和变量名称。
CREATE PROCEDURE table_test()

DEFINE lname CHAR(15);
LET lname = 'Miller';

SELECT customer.lname INTO lname FROM customer
WHERE customer_num = 502;
. . .
END PROCEDURE;
变量和 SQL 函数
如果您为 SPL 变量使用与为 SQL 函数一样的标识符,
则数据库服务器假定该表达式的每
一实例都是变量,并不允许使用该 SQL 函数。在定义该变量的代码块内,您不可使用该
SQL 函数。下图中的示例展示在其中定义名为 user 的变量的 SPL 过程内的块。此定义不
允许在 BEGIN END 块中使用 USER 函数。
图: 不允许在 BEGIN END 块中使用 USER 函数的过程。
CREATE PROCEDURE user_test()
DEFINE name CHAR(10);
DEFINE name2 CHAR(10);
LET name = user; -- the SQL function


GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 282 -
BEGIN
DEFINE user CHAR(15); -- disables user function
LET user = 'Miller';
LET name = user; -- assigns 'Miller' to variable name
END
. . .
LET name2 = user; -- SQL function again