暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ORACLE向GBase迁移指南

原创 wanghongyu 2022-03-31
1333
ORACLE向GBase迁移指南

 


 

 录

 

1前言

2数据库迁移

2.1数据类型迁移

2.1.1综述

2.1.2二进制数据类型迁移

2.1.2.1 BFILE类型

2.1.2.2 BLOB类型

2.1.2.3 RAW(size)类型

2.1.2.4 LONG RAW类型

2.1.3 字符数据类型

2.1.3.1 CLOB类型

2.1.3.2 LONG类型

2.1.3.3 NCHAR(length)类型

2.1.3.4 NCLOB

2.1.3.5 CHAR(length [BYTE | CHAR])

2.1.3.6 NVARCHAR2(length)

2.1.3.7 ROWID

2.1.3.8 UROWID[(length)]

2.1.3.9 VARCHAR2(length [BYTE | CHAR])

2.1.4 数字数据类型

2.1.4.1 BINARY_DOUBLE

2.1.4.2  BINARY_FLOAT

2.1.4.3 NUMBER(p,s)

2.1.5 时间类型

2.1.5.1 DATE

2.2.5.2 INTERVAL DAY[(precision)] TO SECOND[(fractional_precision)]

2.2.5.3 INTERVAL YEAR[(precision)] TO MONTH

2.2.5.4 TIMESTAMP[(precision)]

2.2.5.5 TIMESTAMP[(precision)] WITH TIME ZONE

2.2.5.6 TIMESTAMP[(precision)] WITH LOCAL TIME ZONE

2.2 谓词的迁移

2.2.1 综述

2.2.2逻辑操作符

2.2.2.1 表达式1 AND 表达式2

2.2.2.2 NOT 表达式

2.2.2.3 表达式1 OR 表达式2

2.2.3比较操作符

2.2.3.1 表达式1 = 表达式2

2.2.3.2 表达式1 <> 表达式2

2.2.3.3 表达式1 < 表达式2

2.2.3.4 表达式1 <= 表达式2

2.2.3.5 表达式1 > 表达式2

2.2.3.6 表达式1 >= 表达式2

2.2.3.7 表达式1 比较运算符 ANY 表达式2

2.2.3.8 表达式1比较运算符 ALL 表达式2

2.2.4 存在操作符

2.2.4.1 EXISTS (子查询)

2.2.4.2 NOT EXISTS (subquery)

2.2.5 浮点操作符

2.2.5.1 数字表达式 IS INFINITE

2.2.5.2 数字表达式 IS NOT INFINITE

2.2.5.3 数字表达式 IS NAN

2.2.5.4 数字表达式 IS NOT NAN

2.2.6 In 操作符

2.2.6.1 表达式 IN {值列表 | (子查询)}

2.2.6.2表达式 NOT IN {值列表 | (子查询)}

2.2.7 判断/成员操作符

2.2.7.1 嵌套表 IS A SET

2.2.7.2嵌套表 IS NOT A SET

2.2.7.3 [dimension_column IS] ANY

2.2.7.4 嵌套表 IS EMPTY

2.2.7.5嵌套表 IS NOT EMPTY

2.2.7.6 表达式 IS OF [type1] ({[ONLY schema.] type2} [, ...])

2.2.7.7表达式 IS NOT OF [type1] ({[ONLY schema.] type2} [, ...])

2.2.7.8 cell IS PRESENT

2.2.7.9 表达式  MEMBER [OF] 嵌套表

2.2.7.10 表达式 NOT MEMBER [OF] 嵌套表

2.2.7.11 嵌套表1 SUBMULTISET [OF] 嵌套表2

2.2.7.12 nested_table1 NOT SUBMULTISET [OF] nested_table2

2.2.8 Null 操作符

2.2.8.1 表达式 IS NULL

2.2.8.2表达式 IS NOT NULL

2.2.9 模式匹配操作符

2.2.9.1 字符串表达式 LIKE 模式 [ESCAPE 例外字符串]

2.2.9.2 字符串表达式 NOT LIKE 模式 [ESCAPE 例外字符串]

2.2.9.3 字符串表达式 LIKEC 模式 [ESCAPE 例外字符串]

2.2.9.4 字符串表达式 NOT LIKEC 模式 [ESCAPE 例外字符串]

2.2.9.5 字符串表达式 NOT LIKE2 模式 [ESCAPE例外字符串]

2.2.9.6 字符串表达式 NOT LIKE2 模式 [ESCAPE例外字符串]

2.2.9.7 字符串表达式  LIKE4 模式 [ESCAPE例外字符串]

2.2.9.8字符串表达式 NOT LIKE4 模式 [ESCAPE例外字符串]

2.2.9.9 REGEXP_LIKE(字符串表达式, 模式 [, 匹配参数])

2.2.10 范围表达式

2.2.10.1 表达式1 BETWEEN表达式2 AND表达式3

2.2.10.2 表达式1 NOT BETWEEN表达式2 AND表达式3

2.2.11 XML 操作符

2.2.11.1 EQUALS_PATH(, 路径 [, integer])

2.2.11.2 UNDER_PATH( [, 级别] , 路径 [, integer])

2.2.12 谓词优先级

2.3 操作符

2.3.1 综述

2.3.2 大纲

2.2.3 算术操作符

2.2.3.1 +

2.2.3.2 –

2.2.3.3 *

2.2.3.4 /

2.2.4 连接操作符

2.2.4.1 ||

2.2.5 分级查询操作符

2.2.5.1 CONNECT_BY_ROOT

2.2.5.2 PRIOR

2.2.6 Multiset 操作符

2.2.6.1 MULTISET EXCEPT ALL

2.2.6.2 MULTISET EXCEPT DISTINCT

2.2.6.3 MULTISET INTERSECT ALL

2.2.6.4 MULTISET INTERSECT DISTINCT

2.2.6.5 MULTISET UNION ALL

2.2.6.6 MULTISET UNION DISTINCT

2.2.7 集合操作符

2.2.7.1 INTERSECT

2.2.7.2 MINUS

2.2.7.3 UNION

2.2.7.4 UNION ALL

2.2.8 操作符优先级

3 迁移示例

3.1 迁移准备

3.1.1 Oracle 待迁数据

3.2 迁移

3.2.1运行 GBase 的迁移工具。

3.2.2 建立Oracle 连接

3.2.3 配置Oracle连接

3.3.4 配置GBase 连接

3.3.5 建立迁移任务

4 存储过程的迁移

4.1 创建语法

4.2 参数的默认值

4.3 定义临时变量

4.4 if 语句

4.5 while 语句

4.6 游标

 


1. 前言

本迁移指南面向数据库开发人员,目标是为基于ORACLE数据库的应用系统向GBase数据库迁移提供指导性的、快速的指南。因此在本文档中内容的组织是以面向常规应用,力求覆盖全面为原则,不对这两种数据库的细节内容进行描述,读者可以参考相应的ORACLEGBase的《参考手册》来获取细节信息。

在本指南中将分析、整理基于ORACLE数据库的应用系统向GBase数据库迁移的过程中需要注意的问题和对应的方法。涉及的内容包括数据库迁移应用程序迁移两部分。

数据库迁移是指对数据库对象的迁移,内容包括数据库对象的差异,数据类型迁移,表达式和操作符迁移,SQL语句迁移,内建函数对比,临时表对比,游标对比,存储过程和函数定义对比,视图对比,触发器对比,Secquence(序列)迁移等。

应用程序迁移是针对使用不同的数据库开发接口所实现的应用程序的迁移。包括ODBCJDBCOLE DBADOADO.NET等开发接口。

2. 数据库迁移

2.1. 数据类型迁移

2.1.1. 综述

本节的内容用于指导在将ORACLE的表迁移到GBase的表过程中涉及到的ORACLE标准数据类型如何映射到GBase数据库表中。共包含四大类数据类型:

l 二进制数据类型

l 字符数据类型

l 数字数据类型

l 日期时间数据类型。

ORACLE多种标准数据类型及各类自定义类型,大部分内建类型都可以用Gbase数据库中的数据类型进行替换,但仍然有一些数据类型(如BFILE、ROWID及自定义的数据类型)没有可映射的标准类型,因此需要根据应用系统的实际需求选择合适的GBase标准数据类型进行替换,并且可能需要相应的调整应用系统中涉及这些类型的部分程序。

2.1.2. 二进制数据类型迁移

2.1.2.1. BFILE类型

ORACLE中,BFILE用于存储放在数据库外部的二进制大对象的文件位置。存储的二进制大对象最大尺寸为4GB。

GBase可替代的数据类型: BLOB,但最大尺寸仅为32K。

2.1.2.2. BLOB类型

ORACLE中,BLOB用于存储二进制大对象,例如影音信息。其最大尺寸为4GB。

GBase可替代的数据类型:LONGBLOB,但最大尺寸仅为32K。

2.1.2.3. RAW(size)类型

ORACLE中用于存储固定长度(由size指定长度)的二进制数据,size的最大值为2000Bytes。

GBase可替代的数据类型:

1. 可以用BLOB(size)替代,最大尺寸为32KBytes,但该类型为变长类型。

2. 可以用BINARY(size)替代,它是固定长度类型,但size的最大值为255,因此只能替代size<255的ORACLE RAW(size)类型。

2.1.2.4. LONG RAW类型

ORACLE中用于存储变长的二进制大对象,最大尺寸为2GB,ORACLE推荐用BLOB来代替该类型。

GBase可替代的数据类型: BLOB,但最大尺寸仅为32K。

2.1.3. 字符数据类型

2.1.3.1.  CLOB类型

ORACLE中用于存储单字节字符的字符串大对象,支持各种定长、变长字符集。最大尺寸为4GB。

GBase可替代的数据类型:

TEXT,但最大尺寸仅为32K。

2.1.3.2. LONG类型

保存可变长度的字符串大对象,最大尺寸为2GB。ORACLE推荐用CLOB或NCLOB类型替代该类型。

GBase可替代的数据类型: TEXT,但最大尺寸为32KB。

2.1.3.3. NCHAR(length)类型

存储固定长度的Unicode字符。在ORACLE中NATIONAL CHAR(length)、NATIONAL CHARACTER(length)是该类型的同义词。最大尺寸为2000Bytes。

GBase可替代的数据类型:

1. length的长度<=255字节时,可以使用GBase的NCHAR(size)替代(size<255)。

2. length大于255时,可以使用GBase的NVARCHAR(size)替代,size<65535。但这种类型为变长列类型。

ORACLE的NCHAR(255)存储的中文文字个数和GBase的NCHAR(255)可存储的中文文字个数是否相同,也就是说要确定是否是按照相同的存储机制存储双字节文字的,要注意系统默认字符集的影响,以确定合理的迁移类型)

2.1.3.4. NCLOB

用于存储Unicode字符集的文本大对象,存储变长字符集的数据(Unicode)。最大尺寸为4GB。

GBase可替代的数据类型:

使用utf8字符集的TEXT,最大尺寸为32KB。

2.1.3.5. CHAR(length)

存储固定长度的字符。在Oracle中存储的是数据库字符集的字符。是CHARACTER(length)的同义词。最大尺寸2000Bytes。

GBase可替代的数据类型:

1. length的长度<=255字节时,可以使用GBase的CHAR(size)替代(size<255)。

2. length大于255时,可以使用GBase的VARCHAR(size)替代,size<65535。但这种类型为变长列类型。

2.1.3.6. NVARCHAR2(length)

存储变长字符的字符串,等于字符的长度,数据储存在Unicode字符集中。最大长度4000bytes。同义词有NATIONAL CHARACTER  VARYING(length), NATIONAL CHAR  VARYING(length), NCHAR VARYING(length)

GBase可替代的数据类型:

使用 utf8 字符集的VARCHAR(length)

2.1.3.7. ROWID

存储用于标识表中一行数据唯一地址的使用Base 64编码的字符串。ROWID 是一个伪列,你可以使用 SELECT ROWID FROM <table> 来得到它。你可以用ROWID类型来定义一个列,但这是很罕见的,通常ROWID数据类型使用在存储过程中,返回一个行的ROWID。关于rowid的具体含义可以查阅oracle的手册。

GBase可替代的数据类型:

严格来讲:无

但在GBase中,每张表也有一个伪列:rowid,为从0开始的行的编号,也是对表中每一行的唯一表述。因此如果不是使用rowid作为特殊的运算,那么可以使用rowid替换oracle中的rowid。

2.1.3.8. VARCHAR2(length [BYTE | CHAR])

存储变长字符集的字符串,可以按Byte或字符个数来定义长度。最大长度4000Bytes或字符数。同义词有CHAR VARYING(length), CHARACTER VARYING(length), VARCHAR(length)

GBase可替代的数据类型:

VARCHAR(length)

2.1.4. 数字数据类型

2.1.4.1. BINARY_DOUBLE

存储64位的浮点数。

GBase可替代的数据类型:

DOUBLE PRECISION

2.1.4.2. BINARY_FLOAT

存储32位的浮点数。

GBase可替代的数据类型:

FLOAT

2.1.4.3. NUMBER(p,s)

在一定的精度和范围下存储数字。精度(p)在1-38位10进制的数字,范围(s)可以是 -84 到 127 。这个数字数据可以是任意的固点或浮点数字。如果 p或 s 被指定,那么这个数是一个经过处理的浮点数。如果传入不正确的数字,可能会发生舍入错误。同义词有 DECIMAL, DOUBLE  PRECISION, FLOAT, INT, INTEGER, NUMERIC, REAL, SMALLINT

GBase可替代的数据类型:

DECIMAL, DOUBLE PRECISION, FLOAT, INT, INTEGER, NUMERIC, REAL, SMALLINT 依赖于精度、范围、和实际需求。

2.1.4.4. DECIMAL(p,s)

标准的 SQL 数据类型,是 Oracle NUMBER(p,s) 同义词。GBase可以使用 DECIMAL(p,s) 数据类型替代。

2.1.4.5. DOUBLE PRECISION

标准的 SQL 数据类型,是 Oracle  64 位精度NUMBER 同义词。GBase可以使用 DOUBLE PRECISION 数据类型替代。

2.1.4.6. FLOAT[(precision)]

标准的 SQL 数据类型,是 Oracle  64 位精度NUMBER 同义词。GBase可以使用 FLOAT(precision) 数据类型替代。

2.1.4.7. INT, INTEGER

标准的 SQL 数据类型,是 Oracle NUMBER(38) 同义词。GBase可以使用 INT, INTEGER 数据类型替代。但Gbase中int的最大字节为4字节。

2.1.4.8. NUMERIC(p,s)

标准的 SQL 数据类型,是 Oracle NUMBER(p,s) 同义词。GBase可以使用 NUMERIC(p,s) 数据类型替代。

2.1.4.9. REAL

标准的 SQL 数据类型,是 Oracle  64 位精度NUMBER 同义词。GBase可以使用高精度decimal数据类型替代。

2.1.4.10. SMALLINT

标准的 SQL 数据类型,是 Oracle NUMBER(38) 同义词。GBase可以使用 SMALLINT 数据类型替代。

2.1.5. 时间类型

2.1.5.1. DATE

存储日期和时间,范围从公元前 4712 年 1月 1日 到公元 9999 年 12 月 31 日。

GBase可替代的数据类型:

DATETIME 要注意的是 GBase 的时间范围是从公元 1000 年 1 月 1 日 到 公元 9999 年 12 月 31 日。

2.1.5.2. INTERVAL DAY[(precision)] TO SECOND[(fractional_precision)]

存储一个由 日、小时、分钟、秒 组成的时间周期,precision 表示了日字段的最大数字范围(数字位数),fractional_precision 表示秒字段的精度。precision 范围是 0 到 9 默认值是2 ,fractional_precision 范围是0 到 9 默认值是 6 。

GBase可替代的数据类型:

2.1.5.3. INTERVAL YEAR[(precision)] TO MONTH

存储一个由月和年组成的时间周期,precision 表示了年字段的最大数字范围(数字位数)。 precision 的范围是 0 到 9 默认值是2 。

GBase可替代的数据类型:

2.1.5.4. TIMESTAMP[(precision)]

存储日期值,包括年、月、天、小时、分、秒,precision 表示了秒字段的数字位数。precision 字段的范围是 0 到 9 默认值是 6 。

GBase可替代的数据类型:

TIMESTAMP 要注意的是 GBase 时间类型只精确到秒,其范围是公元 1970 年 1 月 1 日 0时 0 分 1 秒到 公元 2038 年 01 月 19 日 03 时 14分 07 秒。

2.1.5.5. TIMESTAMP[(precision)] WITH TIME ZONE

存储带时区的时间 TIMESTAMP 值。

GBase可替代的数据类型:

TIMESTAMP,但时区信息无法保存。

2.1.5.6. TIMESTAMP[(precision)] WITH LOCAL TIME ZONE

这个类型与 TIMESTAMP 类型相类似,但是会进行规范化,在其中存入数据库的时区。

GBase可替代的数据类型:

TIMESTAMP,但时区信息无法保存。

2.2. 谓词的迁移 

2.2.1. 综述

Oracle 和 GBase 都可以很好的支持 SELECT 、 UPDATE、DELETE 声明中的 WHERE 字句和 HAVING 字句。Oracle 支持 START WITH  CONNECT BY 子句,GBase 不支持。其中REGEXP_LIKE(string_表达式, pattern)可以使用 GBase 的expr REGEXPpattern表达式来代替,但 REGEXP_LIKE(string_表达式, pattern, match_parameter)等特殊的函数或谓词就不被GBASE支持。

对于这些谓词我们从下面几个方面来进行介绍:

条件比较操作符、存在条件谓词、浮点谓词、内部条件谓词、is/member、空条件谓词、模式匹配谓词、范围条件、 XML 条件。

2.2.2. 逻辑谓词

逻辑谓词是结合两个条件,返回一个结果。Oracle有3个逻辑谓词。每一个逻辑谓词都 GBase 都有相同的条件与之对应,在迁移时不用改变。

2.2.2.1. 表达式1 AND 表达式2

如果两个条件都返回 true 则此表达式返回 true 。如果有一个条件为 null 则返回 false

GBase替代: AND

2.2.2.2. NOT 表达式

否定表达式的结果,如果表达式为 false 则返回 true,如果表达式为 null 则返回 UNKNOWN 。

GBase替代: NOT

2.2.2.3. 表达式1 OR 表达式2

如果任意一个表达式结果为 true 则返回 true,如果一个表达式为 null 则返回 UNKNOWN 。

GBase替代: NOT

2.2.3. 比较谓词

比较谓词是比较两个表达式。Oracle 支持 8 个比较谓词。对于 GBase 有相同的谓词与之对应,因此在迁移的时候可以不做改变。

2.2.3.1. 表达式1 = 表达式2

如果两个表达式是相等的,则返回 true ,如果有一个表达式为 null 则返回 NUKNOWN ,其余返回 false 。

GBase替代: =

2.2.3.2. 表达式1 <> 表达式2

额外的其他的格式(可能在别的平台使用): != ^= -|=  如果这两个条件不相同,返回 true,如果任意一个条件为 null 返回 UNKNOWN ,其余返回 false。

GBase替代: <> !=

2.2.3.3. 表达式1 < 表达式2

如果条件1 小于 条件 2 则返回 true ,有一个条件为空返回 UNKNOWN ,其余返回 false 。

GBase替代: <

2.2.3.4. 表达式1 <= 表达式2

如果条件1 小于或等于条件2 则返回 true ,如果其中一个为 null 则返回 UNKNOWN ,其余情况返回 false。

GBase替代: <=

2.2.3.5. 表达式1 > 表达式2

如果条件1 大于条件 2 则返回 true ,如果其中一个为 null 则返回 UNKMOWN ,其余情况返回 false 。

GBase替代: >

2.2.3.6. 表达式1 >= 表达式2

如果条件 1 大于或等于条件2 则返回 true ,如果其中一个为 null 则返回 UNKOWN ,其余情况返回 false 。

GBase替代:>=

2.2.3.7. 表达式1 比较运算符 ANY 表达式2 

表达式1 比较运算符 SOME 表达式2 的同义字。ANY关键词的意思是“对于在表达式2返回列中的任一值,如果比较结果为TRUE的话,则返回TRUE”,如果没有任何值与表达式1相比可以得到 true 那么返回 false 或返回空集

比较运算符可以使用下面其中之一:= <> < <= > >=

GBase替代:ANY, SOME, 表达式2 需要是一个子查询

2.2.3.8. 表达式1比较运算符 ALL 表达式2

ALL 关键词的意思是“对于在表达式2返回列中的所有值,如果比较结果为TRUE的话,则返回TRUE”,如果没有任何值与表达式1相比可以得到 true 那么返回 false 或返回空集

比较运算符可以使用下面其中之一:= <> < <= > >=

GBase替代:ALL表达式2 需要是一个子查询

2.2.4. 存在谓词

存在谓词测试子查询中的行,Oracle 支持两个存在谓词。每一个 Oracle 的存在谓词都有一个 GBase 同样的谓词,在迁移时不需要改变。

2.2.4.1. EXISTS (子查询)

如果子查询中至少存在一行,则返回 true ,否则返回 false 。

GBase替代: EXISTS

2.2.4.2. NOT EXISTS (subquery)

如果子查询中不存在行,则返回 true ,否则返回 false 。

GBase替代:NOT EXISTS

2.2.5. 浮点谓词

浮点谓词用来判断表达式的结果是不是无穷大或是不是数字。Oracle 支持 4 个浮点谓词,分别是 INFINITE, IS NOT INFINITE, IS NAN,  IS NOT NAN GBase 不支持这些。

2.2.5.1. 数字表达式 IS INFINITE 

如果这个数字表达式结果是特殊值 +INF  –INF,则返回 true 。如果是 null 返回 UNKNOWN ,其余返回false 。

GBase替代:没有

2.2.5.2. 数字表达式 IS NOT INFINITE 

如果这个数字表达式结果不是特殊值 +INF  –INF,则返回 true 。如果是 null 返回 UNKNOWN ,其余返回false 。

GBase替代:没有

2.2.5.3. 数字表达式 IS NAN

如果这个数字表达式的结果是特殊值 Nan ,则返回 true 。如果是null则返回 UNKNOWN,其余返回 false 。

GBase替代:没有

2.2.5.4. 数字表达式 IS NOT NAN

如果这个数字表达式的结果不是特殊值 Nan ,则返回 true 。如果是null则返回 UNKNOWN,其余返回 false 。

GBase替代:没有

2.2.6. In 谓词

In 谓词测试任何一个值是否可以在集合中找到。Oracle 支持2 个 In 谓词。Oracle 的 In 谓词和 GBase 的相同,在迁移的时候不需要改变。

2.2.6.1. 表达式 IN {值列表 | (子查询)}

如果这个表达式与值列表(或子查询的结果)中任意一个值相同,则返回 true 。任意一个为 NULL 则返回 UNKNOW 。其余返回 false 。

GBase替代:IN

2.2.6.2. 表达式 NOT IN {值列表 | (子查询)}

如果这个表达式与值列表(或子查询的结果)中没有一个值相同,则返回 true 。任意一个为 NULL 则返回 UNKNOW 。其余返回 false 。

GBase替代:NOT IN

2.2.7. 判断/成员谓词

判断/成员谓词可以测试一个值是否是一个特殊的形式。Oracle 支持12 个判断/成员谓词。Oracle的 IS [NOT] A SET, IS ANY, IS [NOT] EMPTY, IS [NOT] OF type, IS PRESENT, [NOT]

MEMBER, [NOT] SUBMULTISET 这些谓词,GBase 都不支持。

2.2.7.1. 嵌套表 IS A SET

如果嵌套表包含唯一的内容,则返回 true ,如果嵌套表没有值返回 UNKNOWN ,其余情况返回false 。

GBase替代: 没有

2.2.7.2. 嵌套表 IS NOT A SET

如果嵌套表包含重复的内容,则返回 true ,如果嵌套表没有值返回 UNKNOWN ,其余情况返回false 。

GBase替代: 没有

2.2.7.3. [dimension_column IS] ANY

这个谓词总是返回 true;只能使用在计算的内部列。IS ANY 会检查dimension_column 所有的值,包含 null 值。IS ANY 使用在 SELECT 声明中 MODEL 子句。

GBase替代: ANY,但含义如下:

ANY关键词必须和一个比较操作符联合使用。ANY关键词的意思是“对于在子查询返回的列中的任一数值,如果比较结果为TRUE的话,则返回TRUE”。 例如:

SELECT s1 FROM t1 WHERE s1 > ANY (SELECT s1 FROM t2);

 

2.2.7.4. 嵌套表 IS EMPTY

如果嵌套表是空的,则返回 true ,如果是 null 则返回 UNKNOWN ,其余返回 false 。

GBase替代: 没有

2.2.7.5. 嵌套表 IS NOT EMPTY

如果嵌套表不是空的,则返回 true ,如果是 null 则返回 UNKNOWN ,其余返回 false 。

GBase替代: 没有

2.2.7.6. 表达式 IS OF [type1] ({[ONLY schema.] type2} [, ...])

如果表达式是指定的类型,则返回 true ,如果是 null 返回 UNKNOWN 其余返回 false 。

GBase替代: 没有

2.2.7.7. 表达式 IS NOT OF [type1] ({[ONLY schema.] type2} [, ...])

如果表达式不是指定的类型,则返回 true ,如果是 null 返回 UNKNOWN 其余返回 false 。

GBase替代: 没有

2.2.7.8. cell IS PRESENT

如果这个在 MODEL 子句中的单元(cell),之前已经执行过了,那么返回 true ,否则返回 false。这个谓词只能使用在 SELECT 声明的 MODEL 子句中。

GBase替代: 没有

2.2.7.9. 表达式  MEMBER [OF] 嵌套表

如果这个表达式是嵌套表的成员,则返回 true ,如果是嵌套表是 null 或 空的则返回 UNKNOWN ,其余返回 false 。

GBase替代: 没有

2.2.7.10. 表达式 NOT MEMBER [OF] 嵌套表

如果这个表达式不是是嵌套表的成员,则返回 true ,如果是嵌套表是 null 或 空的则返回 UNKNOWN ,其余返回 false 。

GBase替代: 没有

2.2.7.11. 嵌套表1 SUBMULTISET [OF] 嵌套表2

如果嵌套表1 是嵌套表2 的子集,则返回 true ,如果任意一个为 null 则返回 UNKNOWN ,其他返回 false 。

GBase替代: 没有

2.2.7.12. nested_table1 NOT SUBMULTISET [OF] nested_table2

如果嵌套表1 不是嵌套表2 的子集,则返回 true ,如果任意一个为 null 则返回 UNKNOWN ,其他返回 false 。

GBase替代: 没有

2.2.8. Null判断谓词

Null 判断谓词用来测试 null 值。Oracle 支持2个 null 谓词。每个 null 谓词 GBase 都有相同的谓词对应,在迁移时不需要改变。

2.2.8.1. 表达式 IS NULL

如果这个表达式的结果是 NULL 则返回 true ,否则返回 false 。

GBase 替代:表达式 IS NULL

2.2.8.2. 表达式 IS NOT NULL

如果这个表达式的结果不是 NULL 则返回 true ,否则返回 false 。

GBase 替代:表达式 IS NOT NULL

2.2.9. 模式匹配谓词

模式匹配谓词用来测试 一个值是否匹配一个指定的模式。Oracle 支持9 个模式匹配谓词。

Oracle  REGEXP_LIKE(string_expression, pattern) 对应 GBase 字符串表达式 REGEXP 模式,对于 Oracle REGEXP_LIKE(string_expression, pattern, match_parameter) 没有相应的 GBase 谓词可以对应。Oracle [NOT] LIKEC, [NOT] LIKE2,  [NOT] LIKE4 不能被 GBase 支持。

2.2.9.1. 字符串表达式 LIKE 模式 [ESCAPE 例外字符串]

如果字符串表达式匹配了模式,则返回 true ,如果任意部分为 null 则返回 UNKNOWN ,其余返回false 。使用当前(输入)的字符集,为所有参数的字符集。

GBase 替代: LIKE

2.2.9.2. 字符串表达式 NOT LIKE 模式 [ESCAPE 例外字符串]

如果字符串表达式不能匹配模式,则返回 true ,如果任意部分为 null 则返回 UNKNOWN ,其余返回false 。使用当前(输入)的字符集,为所有参数的字符集。

GBase 替代: NOT LIKE

2.2.9.3. 字符串表达式 LIKEC 模式 [ESCAPE 例外字符串]

如果字符串表达式匹配模式,则返回 true ,如果任意部分为 null 则返回 UNKNOWN ,其余返回false 。使用 Unicode字符集,为所有参数的字符集。

GBase 替代:没有

2.2.9.4. 字符串表达式 NOT LIKEC 模式 [ESCAPE 例外字符串]

如果字符串表达式不能匹配模式,则返回 true ,如果任意部分为 null 则返回 UNKNOWN ,其余返回false 。使用 Unicode字符集,为所有参数的字符集。

GBase 替代:没有

2.2.9.5. 字符串表达式 NOT LIKE2 模式 [ESCAPE例外字符串]

如果字符串表达式不能匹配模式,则返回 true ,如果任意部分为 null 则返回 UNKNOWN ,其余返回false 。使用 UCS2编码解释所有参数。

GBase 替代:没有

2.2.9.6. 字符串表达式 NOT LIKE2 模式 [ESCAPE例外字符串]

如果字符串表达式不能匹配模式,则返回 true ,如果任意部分为 null 则返回 UNKNOWN ,其余返回false 。使用 UCS2编码解释所有参数。

GBase 替代:没有

2.2.9.7. 字符串表达式  LIKE4 模式 [ESCAPE例外字符串]

如果字符串表达式匹配模式,则返回 true ,如果任意部分为 null 则返回 UNKNOWN ,其余返回false 。使用 UCS4编码解释所有参数。

GBase 替代:没有

2.2.9.8. 字符串表达式 NOT LIKE4 模式 [ESCAPE例外字符串]

如果字符串表达式不能匹配模式,则返回 true ,如果任意部分为 null 则返回 UNKNOWN ,其余返回false 。使用 UCS4编码解释所有参数。

GBase 替代:没有

2.2.9.9. REGEXP_LIKE(字符串表达式, 模式 [, 匹配参数])

如果字符串表达式匹配模式,则返回 true ,如果任意部分为 null 则返回 UNKNOWN ,其余返回false 。REGEXP_LIKE 测试这个字符串表达式是否符合模式所表现的表达式样式,模式必须是正则表达式。匹配参数是一个常数,他指定了匹配的行为。主要有下面几个值:

‘i’ 指定不区分大小写

‘c’ 指定区分大小写

‘n’ 指定在新行之前可以使用句号(.)

‘m’ 指定这个字符串表达式可以是一个多行的字符串

如果省略这些参数,默认的行为是对大小写敏感,句号不会被识别,对于多行的字符串,只能批配第一行。

GBase 替代:字符串表达式 REGEXP 模式,只能匹配没有行为参数的 Oracle 表达式。

2.2.10. 范围表达式

范围表达式测试在一个范围内包含的值,Oracle 支持2个范围表达式。每一个 Oracle 范围表达式都有一个 GBase 相同的范围表达式对应,在迁移时不需要修改。

2.2.10.1. 表达式1 BETWEEN表达式2 AND表达式3

如果表达式1 在指定的表达式值的范围内(例如如果表达式1 在表达式2的范围内或等于表达式2 且小于等于表达式3) 则返回 true ,如果有一个表达式是 null 则返回 UNKNOWN 其余返回false。

GBase 替代: BETWEEN

2.2.10.2. 表达式1 NOT BETWEEN表达式2 AND表达式3

如果表达式1 不在指定的表达式值的范围内则返回 true ,如果有一个表达式是 null 则返回 UNKNOWN 其余返回false。

GBase 替代: NOT BETWEEN

2.2.11. XML操作谓词

XML 谓词可以测试这个 XML 的实例是否在一个指定的位置。Oracle 支持2个 XML 谓词。GBase 不支持这些功能。

2.2.11.1. EQUALS_PATH(, 路径 [, integer])

如果一个 XML 数据库的资源可以在这个 SQL 数据库的路径上发现,则返回 true ,如果有一个参数为 null 则返回 UNKNOWN ,其他返回 false 。

GBase 替代: 没有

2.2.11.2. UNDER_PATH( [, 级别] , 路径 [, integer])

如果在 XML 数据库之下建立的路径的列存在这个资源,则返回 true ,如果任意一个参数为 null ,则返回 UNKNOWN ,其余返回 false 。

CONNECT_BY_ROOT, INTERSECT, MINUS, MULTISET EXCEPT ALL, MULTISET EXCEPT

DISTINCT, MULTISET INTERSECT ALL, MULTISET INTERSECT DISTINCT, MULTISET UNION

ALL, MULTISET UNION DISTINCT, and PRIOR 没有

2.2.12. 谓词优先级

在同一条 SQL 语句中可能存在多个条件和谓词,处理这些条件和谓词数据库系统有相应的顺序。对于条件的执行顺序,遵守从高到低的原则。对于表达式遵循从左向右执行的顺序。括号可以提高表达式的执行权限。Oracle 中圆括号内的表达式先于括号外的表达式执行。GBase 同样遵守这些规则。

下表从高到低的列出了 Oracle 和 GBase 谓词的优先级。

ORACLE

GBase

SQL 操作  

SQL 操作 ,NOT

比较谓词 (= <> < <= > >=)

比较谓词(= <> < <= > >=), IS [NOT]  NULL, LIKE, [NOT] IN, REGEXP

IS [NOT] NULL, LIKE, [NOT]BETWEEN,  [NOT] IN, EXISTS,IS OF type

[NOT] BETWEEN

NOT

AND

AND

OR

OR

 

GBase 的 NOT 谓词优先级很高, Oracle 的 NOT 优先级在很多谓词之下,这样 GBase IS [NOT] NULL, LIKE,  [NOT] IN 的优先级也比 Oracle 的要高。

 

2.3. 操作符

2.3.1. 综述

Oracle 内置的 SQL 操作符与 GBase 基本上都可以对应上。这些操作符可以分为 5 类。算术操作符、连接操作符、分级查询操作符、Multiset 操作符、 集合操作符。

2.3.2. 大纲

Oracle 10g 支持17个操作符,可以使用他们构建表达式。GBase 支持的操作符功能和 Oracle 是一样的。但是有一些例外,例如 Oracle || (连接), 如果 GBase 启动时使用 ansi 选项,则支持 || 作为连接符,其他情况下 || 必须使用 GBase 函数 CONCAT来代替。Oracle 的 CONNECT_BY_ROOT, INTERSECT, MINUS, MULTISET EXCEPT ALL, MULTISET EXCEPT DISTINCT, MULTISET INTERSECT ALL, MULTISET INTERSECT DISTINCT, MULTISET UNION ALL, MULTISET UNION DISTINCT,  PRIOR 操作符不被 GBase 支持。

2.3.3. 算术操作符

每一个 Oracle 的算术操作符都有一个同样的 GBase 操作符对应,在迁移的时候不需要进行修改。

2.3.3.1. +

在一元操作时,需要一个真实的数字或时间的表达式,在二元操作时需要两个数字或时间表达式。

GBase 替代: +

2.3.3.2. 

在一元操作时,需要一个真实的数字或时间的表达式,在二元操作时需要两个数字或时间表达式。

GBase 替代: -

2.3.3.3. *

二元操作符,乘法的数学表达式。

GBase 替代: *

2.3.3.4. /

二元操作符,除法的数学表达式。

GBase 替代: /

2.3.4. 连接操作符

如果 GBase 启动时使用 –ansi 选项,则支持 || 作为连接符,这种情况下在迁移时不需要作改变。在默认的启动模式下,需要将 || 用 CONCAT('string1', 'string2') 来替代。Oracle 同样也有 CONCAT 函数,作用和 GBase 的一样。

2.3.4.1. ||

字符和CLOB值的连接符。

GBase 替代:(--ansi 模式): ||

GBase 替代:(默认模式): CONCAT('string1', 'string2'),使用concat函数是正确的、完备的替换方式。

2.3.5. 分级查询操作符

Oracle CONNECT_BY_ROOT PRIOR 不被 GBase 支持。Oracle 没有其他的分级查询操作符。

但借助存储过程和递归调用,可以勉强实现这个功能。请参考附件

2.3.5.1. CONNECT_BY_ROOT

一元操作符,只在分级查询中有效。在使用有限制的列时。Oracle 返回跟行的数据为列值。

GBase 替代: 没有

2.3.5.2. PRIOR

只在分级查询中有效。在比较列值时,Oracle 使用他父行的值。

GBase 替代: 没有

2.3.6. Multiset 操作符

Oracle MULTISET EXCEPT, MULTISET INTERSECT,  MULTISET  UNION 不被 GBase 支持。

2.3.6.1. MULTISET EXCEPT ALL

联合两个嵌套表。返回一个嵌套表,这个表包含所有第一个嵌套表中不在第二个嵌套表中的数据(包含重复数据)。

GBase 替代: 没有

2.3.6.2. MULTISET EXCEPT DISTINCT

联合两个嵌套表。返回一个嵌套表,这个表包含所有第一个嵌套表中不在第二个嵌套表中的数据(不包含重复数据)。

GBase 替代: 没有

2.3.6.3. MULTISET INTERSECT ALL

联合两个嵌套表。返回一个嵌套表,这个表由二个嵌套表中所有的数据组成(包含重复数据)。

GBase 替代: 没有

2.3.6.4. MULTISET INTERSECT DISTINCT

联合两个嵌套表。返回一个嵌套表,这个表由二个嵌套表中所有的数据组成(不包含重复数据)。

GBase 替代: 没有

2.3.6.5. MULTISET UNION ALL

联合两个嵌套表。返回一个嵌套表,这个表包含任意一个嵌套表中所有的数据(包含重复数据)。

GBase 替代: 没有

2.3.6.6. MULTISET UNION DISTINCT

联合两个嵌套表。返回一个嵌套表,这个表包含任意一个嵌套表中所有的数据(不包含重复数据)。

GBase 替代: 没有

2.3.7. 集合操作符

Oracle 的INTERSECT  MINUS 操作符不被 GBase 支持。其他操作符 GBase 和 Oracle 的一样,在迁移的过程中不需要修改。

2.3.7.1. INTERSECT

联合两个 SELECT 查询,返回两个查询中所有不重复的行。

GBase 替代: INTERSECT

2.3.7.2. MINUS

联合两个 SELECT 查询,返回所有在第一个查询中存在但是不再第二个查询中的行。

GBase 替代: MINUS

2.3.7.3. UNION

联合两个 SELECT 查询,返回任意查询中存在的行(不重复)。

GBase 替代: UNION

2.3.7.4. UNION ALL

联合两个 SELECT 查询,返回两个查询中存在的所有行。

GBase 替代: UNION ALL

2.3.8. 操作符优先级

在一个 SQL 表达式中如果存在多个操作符,数据库系统会按一定的顺序来执行他。Oracle 在执行对操作符的使用采取优先级从高到低的原则。同级操作符,遵循从左向右原则。圆括号中的操作优先与括号外的操作。GBase 同样遵守这些规则。

下表从高到低列出了 Oracle 和 GBase 的操作符优先级。在这个表中没有包括 INTERSECT, MINUS, UNION ,联合操作都相当与原子数据值。在Oracle 中所有的集合操作符都拥有相同的优先级。

Oracle

GBase

一元 +,  一元 - , PRIOR,CONNECT_BY_ROOT  

一元 +,一元 -  

*, /

*, /

二元 +,二元 -, ||

二元 +,二元 -

SQL 谓词

SQL谓词

 

2.4. 函数

2.4.1. 普通函数

 

2.4.2. 聚合函数

Oracle 9i 支持 26 个聚合函数,其中 11 个可以被 GBase 替换,其余的不能直接被 GBase 支持。

GBase 可以替换的聚合函数:AVGBIT_ADDBIT_ORBIT_XORCOUNTMAXMINSTDSTDDEV STDDEV_POP STDDEV_SAMPSUMVAR_POPVAR_SAMPVARIANCE

2.4.2.1. AVG

返回组中值的平均值。

语法:AVG( [ALL | DISTINCT] expr ) [ OVER ( analytic_clause ) ]

GBase 替换:AVG[DISTINCT/ALL] exprOVER[PARTITION BY ] [ORDER BY [ASC/DESC] ]

示例:

数据库

Oracle

GBase

语句

SELECT AVG(salary) "Average" FROM employees;

SELECT AVG(salary) "Average" FROM employees;

结果

6461.68224299065

6461.6822429907

2.4.2.2. CORR

返回一对表达式的相关系数,它是如下的缩写:

COVAR_POP(expr1,expr2)/STDDEV_POP(expr1)*STDDEV_POP(expr2))

从统计上讲,相关性是变量之间关联的强度,变量之间的关联意味着在某种程度上一个变量的值可由其它的值进行预测。通过返回一个-1~1之间的一个数, 相关系数给出了关联的强度,0表示不相关。

GBase 替换: 无

2.4.2.3. COUNT

对一组内发生的事情进行累积计数,如果指定*或一些非空常数,count将对所有行计数,如果指定一个表达式,count返回表达式非空赋值的计数,当有相同值出现时,这些相等的值都会被纳入被计算的值;可以使用DISTINCT来记录去掉一组中完全相同的数据后出现的行数。

语法:COUNT( [ DISTINCT | ALL ] expr ) [ OVER ( analytic_clause )]

GBase 替换:COUNT(*/[DISTINCT] col ) OVER([PARTITION BY col_name1,col_name2,…]  [ORDER BY col_name1 [ASC/DESC], col_name2 [ASC/DESC],…] )

示例:

数据库

Oracle

GBase

语句

SELECT COUNT(*) "Total" FROM employees;

SELECT COUNT(*) Total FROM employees;

结果

107

107

2.4.2.4. COVAR_POP

返回一对表达式的总体协方差。它是下面这个公式的简写:(SUM(expr1 * expr2) - SUM(expr1) * SUM(expr2) / n) / (n-1)

语法:COVAR_POP( expr1 , expr2 ) [OVER ( analytic_clause ) ]

GBase 替换:无,可以使用数学函数按公式来计算。

2.4.2.5. COVAR_SAMP

返回一对表达式的样本协方差。它是下面这个公式的简写:(SUM(expr1 * expr2) - SUM(expr1) * SUM(expr2) / n) / (n-1)

语法:COVAR_SAMP( expr1 , expr2 ) [OVER ( analytic_clause ) ]

GBase 替换:无,可以使用数学函数按公式来计算。

2.4.2.6. CUME_DIST

计算一行在组中的相对位置,CUME_DIST总是返回大于0、小于或等于1的数,该数表示该行在N行中的位置。

语法:

CUME_DIST(expr[,expr]...) WITHIN GROUP

  (ORDER BY

    expr [DESC | ASC] [NULLS {FIRST | LAST}]

      [,expr [DESC | ASC] [NULLS {FIRST | LAST}]]...)

GBase 替换: 无

2.4.2.7. DENSE_RANK

根据ORDER BY子句中表达式的值,从查询返回的每一行,计算它们与其它行的相对位置。组内的数据按ORDER BY子句排序,然后给每一行赋一个号,从而形成一个序列,该序列从1开始,往后累加。每次ORDER BY表达式的值发生变化时,该序列也随之增加。有同样值的行得到同样的数字序号(认为null时相等的)。密集的序列返回的是没有间隔的数。

语法:

DENSE_RANK(expr[,expr]...) WITHIN GROUP

  (ORDER BY

  expr [DESC | ASC] [NULLS {FIRST | LAST}]

    [,expr [DESC | ASC] [NULLS {FIRST | LAST}]]...)

GBase 替换:DENSE_RANK( ) over([PARTITION BY col_name1,col_name2,…] ORDER BY col_name1 [ASC/DESC], col_name2 [ASC/DESC],…)

2.4.2.8. GROUP_ID

返回一个唯一数字值用于在GROUP BY 字句中辨别组。

语法:

GROUP_ID()

GBase 替换:无

2.4.2.9. GROUPING

如果当前的汇总记录是利用该字段得出的,grouping函数就会返回1,否则返回0

语法:GROUPING(expr)

GBase 替换:无

2.4.2.10. GROUPING_ID

返回一个数字对应于一行的GROUPING位矢量。GROUPING_ID 必须使用在含有ROLLUP  CUBE  GROUPING 函数的查询语句中。

语法:GROUPING_ID ( expr [, expr]... )

GBase 替换:无

2.4.2.11. MAX

在一个组中的数据窗口中查找表达式的最大值。

语法:MAX ( [ DISTINCT | ALL ] expr ) [OVER ( analytic_clause )]

GBase 替换:MAX ( [ DISTINCT | ALL ] expr ),不支持分析函数部分。

示例:

数据库

Oracle

GBase

语句

SELECT MAX(salary) "Maximum" FROM employees;

SELECT MAX(salary) "Maximum" FROM employees;

结果

24000

24000

2.4.2.12. MIN 

在一个组中的数据窗口中查找表达式的最小值。

语法:MIN ( [ DISTINCT | ALL ] expr ) [OVER ( analytic_clause )]

GBase 替换:MIN ( [ DISTINCT | ALL ] expr ),不支持分析函数部分。

示例:

数据库

Oracle

GBase

语句

SELECT MIN(salary) "Maximum" FROM employees;

SELECT MIN(salary) "Maximum" FROM employees;

结果

2100

2100

2.4.2.13. PERCENTILE_CONT

这个函数是一个反分布函数,它假设了一个连续分布模式。返回一个与输入的分布百分比值相对应的数据值,分布百分比的计算方法见函数PERCENT_RANK,如果没有正好对应的数据值,就通过下面算法来得到值:RN = 1+ (P*(N-1)) 其中P是输入的分布百分比值,N是组内的行数。

语法:

PERCENTILE_CONT ( expr ) WITHIN GROUP ( ORDER BY expr [ DESC | ASC ] )

[OVER ( query_partition_clause )]

GBase 替换:无

2.4.2.14. PERCENTILE_DISC

一个反分布函数,它假设了一个离散分布模式。返回一个与输入的分布百分比值相对应的数据值,分布百分比的计算方法见函数CUME_DIST,如果没有正好对应的数据值,就取大于该分布值的下一个值。

语法:

PERCENTILE_DISC ( expr ) WITHIN GROUP ( ORDER BY expr [ DESC | ASC ] )

[OVER ( query_partition_clause )]

GBase 替代:无

2.4.2.15. PERCENT_RANK

CUME_DIST(累积分配)函数类似,对于一个组中给定的行来说,在计算那行的序号时,先减1,然后除以n-1n为组中所有的行数)。该函数总是返回01(包括1)之间的数。

语法:

PERCENT_RANK ( expr [, expr]... ) WITHIN GROUP

( ORDER BY

  expr [ DESC | ASC ] [NULLS { FIRST | LAST }]

  [, expr [ DESC | ASC ] [NULLS { FIRST | LAST }]]...

)

GBase 替代:无

2.4.2.16. RANK

根据ORDER BY子句中表达式的值,从查询返回的每一行,计算它们与其它行的相对位置。组内的数据按ORDER BY子句排序,然后给每一行赋一个号,从而形成一个序列,该序列从1开始,往后累加。每次ORDER BY表达式的值发生变化时,该序列也随之增加。有同样值的行得到同样的数字序号(认为null时相等的)。然而,如果两行的确得到同样的排序,则序数将随后跳跃。若两行序数为1,则没有序数2,序列将给组中的下一行分配值3DENSE_RANK则没有任何跳跃。

语法:

RANK ( expr [, expr]... ) WITHIN GROUP

( ORDER BY

  expr [ DESC | ASC ] [NULLS { FIRST | LAST }]

  [, expr [ DESC | ASC ] [NULLS { FIRST | LAST }]]...

)

GBase 替换: RANK() OVER([PARTITION BY col_name1,col_name2,]  ORDER BY  col_name1 [ASC/DESC], col_name2 [ASC/DESC],)

2.4.2.17. REGR_ (Linear Regression)

这些线性回归函数适合最小二乘法回归线,有9个不同的回归函数可使用。

REGR_SLOPE:返回斜率,等于COVAR_POP(expr1, expr2) / VAR_POP(expr2)

REGR_INTERCEPT:返回回归线的y截距,等于AVG(expr1) - REGR_SLOPE(expr1, expr2) * AVG(expr2)

REGR_COUNT:返回用于填充回归线的非空数字对的数目

REGR_R2:返回回归线的决定系数,计算式为:

If VAR_POP(expr2) = 0 then return NULL

If VAR_POP(expr1) = 0 and VAR_POP(expr2) != 0 then return 1

If VAR_POP(expr1) > 0 and VAR_POP(expr2 != 0 then

return POWER(CORR(expr1,expr),2)

REGR_AVGX:计算回归线的自变量(expr2)的平均值,去掉了空对(expr1, expr2)后,等于AVG(expr2)

REGR_AVGY:计算回归线的应变量(expr1)的平均值,去掉了空对(expr1, expr2)后,等于AVG(expr1)

REGR_SXX: 返回值等于REGR_COUNT(expr1, expr2) * VAR_POP(expr2)

REGR_SYY: 返回值等于REGR_COUNT(expr1, expr2) * VAR_POP(expr1)

REGR_SXY: 返回值等于REGR_COUNT(expr1, expr2) * COVAR_POP(expr1, expr2)

语法:

{ REGR_SLOPE

| REGR_INTERCEPT

| REGR_COUNT

| REGR_R2

| REGR_AVGX

| REGR_AVGY

| REGR_SXX

| REGR_SYY

| REGR_SXY

}

( expr1 , expr2 ) [OVER ( analytic_clause )]

GBase 替换:无

2.4.2.18. STDDEV

计算当前行关于组的标准偏离。(Standard Deviation),同于STDDEV_SAMP

语法:STDDEV ( [ DISTINCT | ALL ] expr ) [OVER ( analytic_clause )]

GBase 替代: STDDEV_SAMP ( [ DISTINCT | ALL ] expr ),不支持分析函数。需要根据公式组织SQL

示例:

数据库

Oracle

GBase

语句

SELECT STDDEV(salary) "Deviation" FROM employees;

SELECT STDDEV_SAMP(salary) "Deviation" FROM employees;

结果

3909.36574645906

3909.3657464591

2.4.2.19. STDDEV_POP

计算当前行关于组的总体标准偏离。(Standard DeviationPopulation

语法:STDDEV_POP ( [ DISTINCT | ALL ] expr ) [OVER ( analytic_clause )]

GBase 替代: STDDEV STDDEV_POP ( [ DISTINCT | ALL ] expr ),不支持分析函数。

示例:

数据库

Oracle

GBase

语句

SELECT STDDEV_POP(salary) "Deviation" FROM employees;

SELECT STDDEV_POP(salary) "Deviation" FROM employees;

结果

3891.05479920707

3891.0547992071

2.4.2.20. STDDEV_SAMP

计算当前行关于组的标准偏离。(Standard Deviation),同于STDDEV

语法:STDDEV_SAMP ( [ DISTINCT | ALL ] expr ) [OVER ( analytic_clause )]

GBase 替代:STDDEV_ SAMP ( [ DISTINCT | ALL ] expr ),不支持分析函数。

示例:

数据库

Oracle

GBase

语句

SELECT STDDEV_SAMP(salary) "Deviation" FROM employees;

SELECT STDDEV_ SAMP (salary) "Deviation" FROM employees;

结果

3909.36574645906

3909.3657464591

2.4.2.21. SUM

该函数计算组中表达式的累积和。

语法:SUM ( [ DISTINCT | ALL ] expr ) [OVER ( analytic_clause )]

GBase 替换:SUM[DISTINCT/ALL] exprOVER[PARTITION BY ]   [ORDER BY [ASC/DESC] ]

示例:

数据库

Oracle

GBase

语句

SELECT SUM(salary) "Total" FROM employees;

SELECT SUM(salary) "Total" FROM employees;

结果

691400

691400

2.4.2.22. VAR_POP

Variance Population)该函数返回非空集合的总体变量(忽略null),VAR_POP进行如下计算:

(SUM(expr2) - SUM(expr)2 / COUNT(expr)) / COUNT(expr)

语法:VAR_POP ( expr ) [OVER ( analytic_clause )]

GBase 替换:VARIANCE VAR_POP ( expr ) ,不支持分析函数。

示例:

数据库

Oracle

GBase

语句

SELECT VAR_POP(salary) FROM employees;

SELECT VAR_POP(salary) FROM employees;

结果

15140307.4504324

15140307.450432

2.4.2.23. VAR_SAMP

Variance Sample)该函数返回非空集合的样本变量(忽略null),VAR_ SAMP进行如下计算:

(SUM(expr*expr)-SUM(expr)*SUM(expr)/COUNT(expr))/(COUNT(expr)-1)

语法:VAR_SAMP ( expr ) [OVER ( analytic_clause )]

GBase 替换:VAR_ SAMP ( expr ) ,不支持分析函数。

示例:

数据库

Oracle

GBase

语句

SELECT VAR_SAMP(salary) FROM employees;

SELECT VAR_ SAMP (salary) FROM employees;

结果

15283140.5395874

15283140.539587

2.4.2.24. VARIANCE

该函数返回非空集合的样本变量,Oracle计算该变量如下:如果表达式中行数为1,则返回0,如果表达式中行数大于1,则返回VAR_SAMP

语法:

VARIANCE ( [ DISTINCT | ALL ] expr ) [OVER ( analytic_clause )]

GBase 替换:VAR_ SAMP ( expr ) ,不支持分析函数。

示例:

数据库

Oracle

GBase

语句

SELECT VARIANCE(salary) FROM employees;

SELECT VARIANCE(salary) FROM employees;

结果

15283140.5395874

15283140.539587

3. 迁移建议

下面介绍一下迁移过程常用的一些迁移方法。

3.1. rownum

GBase 中使用 limit 子句来限制返回的结果条数,在 Oracle 中使用 rownum 子句。

Oracle

GBase

SELECT * FROM TABLE rownum <=100

SELECT * FROM TABLE LIMIT 100;

GBase limit 子句的语法:

SELECT * FROM TABLE LIMIT start_rows,rows ;

limit 子句中不能直接使用变量,下面这个语句是不可以运行的:

set @rows = 5;

select * from northwind.customers limit @ rows;

需要使用 GBase 的预处理语句来为 limit 子句绑定一个参数,示例如下:

set @rows = 5;

PREPARE STMT FROM 'select * from northwind.customers limit ? ';

EXECUTE STMT USING @rows;

 

另,rownum为对结果集的进行编号,且不能进行大于运算,比如:select * from emp where rownum > 5 将返回空结果集。同样,如果想使用等号运算符,也只能使用rownum=1这种表达式。

另外,rownumGbaserowid意义不同,一般不能进行对等替换。

3.2. 分区聚集函数MUL

可以利用exp(sum(ln))的形式实现。

3.3. DateTime 的默认值

Oracle 中,可以为 DATATIME 类型的列定义默认值 SYSDATE ,在修改此行其他数据时,会自动改变这个 DATATIME 列为当前的服务器时间。GBase 不支持为 DATETIME 类型的字段设置默认值,因此你需要将有 SYSDATE 默认值的 DATETIME 类型改为 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMTP 类型。

要注意的是 GBase 每个表只支持一个可以自动更新的 TIMESTAMP 类型的字段,并且如果一个表中有多个 TIMESTAMP 类型字段,那么第一个 TIMESTAMP 会自动为自动更新类型。

3.4. Oracle 临时表

Oracle中,可以创建以下两种临时表:

1) 会话特有的临时表
CREATE GLOBAL TEMPORARY ( )
ON COMMIT PRESERVE ROWS

2) 事务特有的临时表
CREATE GLOBAL TEMPORARY ( )
ON COMMIT DELETE ROWS

CREATE GLOBAL TEMPORARY TABLE MyTempTable

所建的临时表虽然是存在的,但是如果insert 一条记录然后用别的连接登上去select,记录是空的。

--ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截断表(删除全部行)

--ON COMMIT PRESERVE ROWS 说明临时表是会话指定,当中断会话时ORACLE将截断表。

GBase也有临时表。但是临时表被限制在当前连接中,当连接关闭时,临时表会自动地删除。这就意味着,两个不同的连接可以使用同一个临时表名而不会发生冲突,也不会与同名现有的表冲突(现有表将被隐藏,直到临时表被删除)。

CREATE TEMPORARY TABLE temp1

(id int auto_increment primary key, ClassifiedID int);

<。。。。。。>

DROP TEMPORARY TABLE temp1 ;

3.5. 返回受上一语句影响的行数

Oracle

GBase

使用隐式游标SQL%ROWCOUNT

使用函数 ROW_COUNT()

3.6. 时间操作

Oracle 时间可以直接操作,GBase可以使用 ADDDATE 函数,示例见下表:

Oracle

GBase

SYSDATE - 14

ADDDATE(NOW(),INTERVAL -14 DAY) ;

3.7. 复杂查询语句

在这一节中,介绍一下复杂查询语句的用法和迁移对比。

3.7.1. 使用 DISTINCT 

DISTINCT 可以防止检索出重复的记录。

示例:

数据库

Oracle

GBase

语句

select distinct country_id from locations

select distinct country_id from locations

结果

AU

 BR

 CA

 CH

 .

 .

 .

AU

 BR

 CA

 CH

 .

 .

 .

3.7.2. 使用子查询

GBase 同样在 select 中支持子查询,一般不需要修改。

示例:

数据库

Oracle

GBase

语句

select last_name from employees where department_id in (

select department_id from departments where department_name = 'Executive' )

select last_name from employees where department_id in (

select department_id from departments where department_name = 'Executive' )

结果

King

 Kochhar

 De Haan

King

 Kochhar

 De Haan

3.7.3. 使用GROUP BY

GBase GROUP BY 用法和 Oracle 2000 的很相似,除了不支持的函数外基本上迁移时不用修改。

示例:

数据库

Oracle

GBase

语句

select count(employee_id),department_id from employees group by department_id order by department_id

select count(employee_id),department_id from employees group by department_id order by department_id

结果

1         NULL

 1         10

 2         20

 6         30

 1         40

 45        50

 5         60

 1         70

 34        80

 3         90

 6         100

 2         110

1         NULL

 1         10

 2         20

 6         30

 1         40

 45        50

 5         60

 1         70

 34        80

 3         90

 6         100

 2         110

3.7.4. 使用HAVING 子句

GBase 支持在 GROUPBY 中使用 HAVING 子句,用法和 Oracle 一样。

示例:

数据库

Oracle

GBase

语句

select count(employee_id),department_id from employees group by department_id having count(employee_id) > 5 order by department_id

select count(employee_id),department_id from employees group by department_id having count(employee_id) > 5 order by department_id

结果

  6            30

 45            50

 34            80

  6           100

  6            30

 45            50

 34            80

  6           100

 

3.7.5. 使用 ROLLUP

GROUP BY 子句允许使用 WITH ROLLUP 修饰语将额外的行加到最后的输出中。这些行代表更高层的(或高聚集)求和操作。

示例:

数据库

Oracle

GBase

语句

select nvl(to_char(department_id),'合计'),sum(salary) from employees where department_id is not null group by rollup(department_id)

select ifnull(department_id,'合计'),sum(salary) from employees where department_id is not null group by department_id  with rollup

结果

10                4400

20               19000

30                24900

40                 6500

50               156400

60                28800

70                10000

80               304500

90                58000

100               51600

110               20300

合计             684400

10                4400

20               19000

30                24900

40                 6500

50               156400

60                28800

70                10000

80               304500

90                58000

100               51600

110               20300

合计             684400

3.7.6. 外连接

GBase 支持外连接,且可以兼容 Oracle 的格式,在迁移时一般不用修改。需要注意的是 Oracle 还支持 + 符号方式的外连接,这种方式 GBase 是不支持的,需要改写为标准的外连接方式。

示例:

数据库

Oracle

GBase

语句

select country_name, regions.region_name from countries right join regions on countries.region_id = regions.region_id  where countries.region_id =2

使用 + :

select country_name, regions.region_name

from countries,regions

where countries.region_id = regions.region_id(+) and  countries.region_id =2

select country_name, regions.region_name from countries right join regions on countries.region_id = regions.region_id  where countries.region_id =2

结果

Argentina                   Americas

Brazil                      Americas

Canada                      Americas

Mexico                      Americas

United States of America    Americas

Argentina                   Americas

Brazil                      Americas

Canada                      Americas

Mexico                      Americas

United States of America    Americas

 

3.8. 带子查询的更新

GBase 更新语句可以使用子查询语句,参见下面的示例:

示例:

数据库

Oracle

GBase

建表

create table DeptSalary  ( EmployeeID int, salary  float(20)) ;

create table DeptSalary  ( EmployeeID int, salary  float(20)) ;

插值

insert into DeptSalary values(100,0 ) ;

insert into DeptSalary values(100,0 ) ;

更新

语句

update DeptSalary set salary = (

select sum(salary) from Employees where department_id = 100);

update DeptSalary set salary = (

select sum(salary) from Employees where department_id = 100);

检索

select * from DeptSalary;

select * from DeptSalary;

结果

100    51600

100    51600

 

4. 迁移示例

下面我们将迁移一个实际的 Oracle 实例到 GBase 中。我们使用 GBase 的迁移工具来实现迁移。

4.1. 迁移准备

首先需要安装 Oracle 数据库(安装示例数据库),和GBase 数据库。在GBase 数据库中建立一个数据库用来存放从Oracle 数据库中的迁移来的数据。这里我们建了一个名叫 SCOTT 的数据库(建立数据库请查看GBase手册)。

4.1.1. Oracle 待迁数据

我们迁移 Oracle 的SCOTT 模式下的数据。SCOTT 模式下的数据结构如下:

 

4.2. 迁移

下面我们使用GBase 的迁移工具将SCOTT 模式下的数据迁移到GBase 的数据库SCOTT 中。

4.2.1. 运行 GBase 的迁移工具。

在开始菜单中找到 GBase 迁移工具的快捷方式,点击运行迁移工具。

 

4.2.2. 建立Oracle 连接

首先需要建立与Oracle 的连接,在用户连接菜单上点击右键,出现功能菜单,点击新建常规连接选现。如左图,打开的配置页面如右图。

  

4.2.3. 配置Oracle连接

首先配置Oracle连接。填写连接名称(任意),在数据库类型上选择 Oracle 。

 

服务器填写 Oracle 的服务器地址,用户名填写登陆Oracle 的使用的用户名,默认可以填写 hr 密码填写 hr (这里笔者将 hr 用户的密码改为 hr )。点击数据库选项,弹出SID 输入框。填写相应的 SID 。如下图:

 

如果填写正确,会出现连接成功的提示。如下图:

4.2.4. 配置GBase 连接

和配置Oracle 连接类似,只是在数据库栏选择先前建立的数据库 HR 。

4.2.5. 建立迁移任务

在菜单的迁移任务项上点击右键弹出功能菜单,点击新建迁移任务项。如下图:

 

出现迁移任务主界面,如下图:

选择迁移类型:数据库到数据库,源数据选择Oracle 连接,目标数据库选择GBase数据库连接,点击下一步。出现表选择界面:

将所有的表都移动到右边的待迁移对象框中。

点击下一步,进入确认列映射界面,在这里 GBase 会自动将 Oracle 的列类型映射为 GBase 支持的类型,但是有可能不合适,如果需要修改请在这个界面中修改映射类型。

修改完成后点击下一步,进入到迁移界面,如下图:

点击迁移按钮,GBase 迁移工具将自动完成迁移。迁移完成后,会给出迁移的信息,如下图:

 

由此可以看到,Oracle 的HR 模式已经成功迁移到 GBase 数据库中。

5.  存储过程的迁移

GBase 的迁移工具现在不支持存储过程的迁移,只能手工进行迁移,下面就几个部分来说明一下存储过程的迁移。

5.1. 创建语法

下表介绍了 GBase Oracle 存储过程的创建语法。

数据库

语法

GBase

CREATE PROCEDURE `<databaseName>`.`<procedureName>`

(  [ IN | OUT | INOUT ] [param_name] [type] )

BEGIN 

 /* 语句 */

END

Oracle

 

下面给出一个创建存储过程的示例:

数据库

示例

GBase

CREATE PROCEDURE temp_proc ( p_id int )

BEGIN

declare User_id NUMBER;

select name from user where id = p_id;

END;

Oracle

CREATE PROCEDURE temp_proc (p_id NUMBER)

AS

User_id NUMBER;

BEGIN

select name from user where id = p_id; 

END;

/

5.2. 参数的默认值

GBase ,参数没有默认值,且调用时不可以省略参数,如果参数无值可是输入 null Oracle 可以为参数设默认值,且可以省略有默认值的参数

示例:

数据库

示例

GBase

没有此功能

Oracle

CREATE PROCEDURE temp_proc ( p_id number  := 1)

5.3. 定义临时变量

GBase

DECLARE语句用来定义各种程序的局部项:局部变量, 条件和处理器以及游标,DECLARE只能被用在BEGIN ... END复合语句之间,且必须位于其它语句之前的开始处,游标必须在声明处理器和变量之前被声明,并且条件必须在声明游标或处理器前声明,命名可以任意(不能使用GBase关键字),每个DECLARE必须以;来结束。

Oracle:

直接定义变量。

例:

GBase: DECLARE p_name varchar(32) defualt 'abc';

Oracle: User_id varchar(32) :='abc';

5.4. if 语句

语法格式不同:

GBase: IF search_condition THEN statement_list

[ELSEIF search_condition THEN statement_list] ...

[ELSE statement_list]

END IF

Oracle:IF search_condition THEN statement_list

[ELSIF search_condition THEN statement_list] ...

[ELSE statement_list]

END IF

示例:  

数据库

示例

GBase

if( flag = 0) then

set name = 'aa';

elseif( flag = 1 ) then

set name = 'bb';

else

set name = 'cc';

end if;

Oracle

IF flag = 0 THEN

name := 'aa';

ELSIF flag = 1 then

name := 'bb';

ELSE

name := cc

END IF;

5.5. while 语句

语法:

数据库

语法

GBase

[begin_label:] WHILE search_condition DO

statement_list

END WHILE [end_label]

Oracle

<<label_name>>

WHILE condition LOOP

   sequence_of_statements

END LOOP;

解释:

只要search_condition为真,WHILE语句中的一个或多个语句就被重复执行。 WHILE可以加标号。只有当begin_label 出现时才能有end_label ,并且如果两个都存在,必须相同。

 

对于Oracle使用 EXIT ,GBase使用LEAVE语句,

语法: LEAVE label

这条语句用来退出任何有标号的流控制构造。它可以用在 BEGIN ... END 或循环中。

 

对于跳过 (CONTINUE) ,GBase 使用 ITERATE 语句,Oracle 可以使用 goto 也可以用 if  结构加以限制。

语法: ITERATE label

ITERATE只能出现在LOOP, REPEAT, 和WHILE语句中。ITERATE 意味着“再一次循环。”

示例:

数据库

示例

GBase

while_label:while( i<10 ) do

i++;

if( i%2 >0 ) then

ITERATE while_label;

end if;

set temp_str = concat( temp_str, ',' ,i );

if( i = 8 ) then

   LEAVE while_label;

end if;

end while while_label;

 

Oracle

<<loop_statr>>

WHILE i <= 10 LOOP

i:=i+1;

if mod(i,2) >0  then

goto loop_statr;

end if;

temp_str := temp_str || ',' || to_char(i) ;

if( i = 8 ) then

exit;

end if;

END LOOP;

5.6. 游标

GBase: 存储过程和函数中支持简单的游标。语法就像是嵌入式SQL。游标是未知的,只读的和不能滚动的。未知意味着服务器可能对它的结果表做一个拷贝,也可能不做。

游标必须在声明处理器之前被声明,变量和条件必须在声明游标或处理器之前被声明。

示例:

Oracle

GBase

CREATE OR REPLACE PROCEDURE hr.testProc IS

my_sal hr.employees.salary%TYPE;

my_job hr.employees.job_id%TYPE;

factor INTEGER := 2;

CURSOR c1 IS

SELECT factor*salary FROM hr.employees WHERE job_id = my_job;

BEGIN

 

 

my_job := 'IT_PROG';

OPEN c1;  --打开游标

LOOP

FETCH c1 INTO my_sal;

EXIT WHEN c1%NOTFOUND;

factor := factor + 1;  -- does not affect FETCH

END LOOP;

DBMS_OUTPUT.PUT_LINE(factor);

END;

/

CREATE PROCEDURE testProc()

BEGIN

DECLARE my_sal DOUBLE;

DECLARE my_job varchar(10);

DECLARE factor int DEFAULT 2;

DECLARE done int DEFAULT 0;

DECLARE c1 CURSOR FOR

SELECT factor*salary FROM employees WHERE job_id = my_job;

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

 

set my_job = 'IT_PROG';

OPEN c1;  -- 打开游标

ll:LOOP

FETCH c1 INTO my_sal;

if( done = 1 )then

LEAVE ll; --退出循环

end if;

set factor = factor + 1;  -- does not affect FETCH

END LOOP ll;

select factor;

END

|

 

需要注意的是GBase中判断游标执行到最后,是使用定义一个异常处理来判断的。DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;当游标指针指导最后一个未知,就会触发一个异常,通过捕获这个异常,将变量 done 值变为 1 。

 

5.7. 管道表迁移

这个需要根据不同的场景进行合理的改造。或借助临时表,或得到结果后直接返回字符串,或者借助其他方法。

关于管道表的迁移,没有肯定的改造方法。

5.8. for循环

一般的for循环,可以借助whilerepeat迁移。但如果for使用的是类似shell脚本中for,循环条件为类似枚举类型或结果集,那么就需要根据需要是否变成一个游标代替,或寻找其他方案。

5.9. 异常捕捉

Gbase支持对存储过程中的异常捕捉,形式如下:

Declare {exit|continue } handler for {sqlexception | not found | sqlstate 02000}

sqlstate后面为GBase的错误代码,也就是说可以针对性的捕捉任一异常。

Gbase不支持捕获到异常后使用raise来重新抛出异常。

 

 

 

 

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论