冯岩
作者冯岩2020-09-17 16:41
数据库管理员, 银行

学习小记 - DB2 v11.1 兼容特性

字数 2750阅读 429评论 1赞 2

IBM DB2 自从 v9.7版本引入“兼容特性”以来,经过 10.1、10.5等版本的不断改进,还是进行了些变化,现在把 v11.1版本兼容特性的一些学习笔记分享给大家学习,后续会更新 v11.5的相关内容。

SQL compatibilities

与其他数据库技术不同的是,DB2 可以运行在其他数据库技术中开发的应用程序,并且改动很小。

DB2 注册表变量 DB2_COMPAT_VECTOR 用于激活这种兼容性。

下面是 DB2_COMPAT_VECTOR 支持的其他数据库列表:

  • Oracle (ORA)
  • Sybase (SYB)
  • MySQL (MYS)

例如,要为Oracle设置兼容性,请使用 db2set命令如下:

db2set DB2_COMPAT_VECTOR=ORA
db2stop
db2start

当 DB2_COMPAT_VECTOR=ORA 被设置时,NUMBER、VARCHAR2 和 DATE Oracle数据类型将与 DB2 兼容。

默认自动激活的兼容特性

一些兼容性特性 总是激活 的。

序列引用方法:
可使用 seqname.NEXTVAL 来替换 SQL 标准语法 NEXT VALUE FOR seqname。还可使用 seqname.CURRVAL 来替换 SQL 标准语法 PREVIOUS VALUE FOR seqname。

同义词:
例如,DISTINCT 可替换为 UNIQUE 的,而 MINUS 可以替换 EXCEPT。大多数自动活动的特性提供了 DB2 和 PostgreSQL 或 Netezza之间的应用程序可移植性桥梁。

伪列 ROWID,可用于引用 RID。未限定 ROWID 引用等价于 RID_BIT(),限定 ROWID 引用(例如,EMPLOYEE.ROWID)等价于 RID_BIT(EMPLOYEE)。

Netezza 的兼容性

DB2 11.1 提供了一些特性,使为 Netezza Platform Software(NPS)数据库编写的应用程序能够使用 DB2数据库,而无需重写。

某些 NPS 兼容性功能(例如, “等同的数据类型名称” 和 DATASLICEID 伪列 )始终处于活动状态。

要激活完全成熟的NPS兼容性特性,包括可选特性,请将 SQL_COMPAT 全局变量设置为 NPS:

SET SQL_COMPAT='NPS'

NPS 可选兼容性

下面分别详细说明 Netezza的可选兼容性特性:

双点表示法

在 NPS 兼容性方式下操作时,可以使用双点表示法来指定数据库对象。

格式: ..,NPS 说明: .。

TRANSLATE 标量函数语法

TRANSLATE 标量函数的语法取决于是否在使用 NPS 兼容性方式。

如果设置了 SQL_COMPAT='NPS',那么 TRANSLATE 标量函数的语法为:

TRANSLATE--(--char-string-exp--,--from-string-exp--,--to-string-exp--)-><

示例:translate('12345','143', 'ax') ,结果: a2x5

如果未启用 NPS兼容性,那么 TRANSLATE 标量函数的语法为:

TRANSLATE--(--char-string-exp-----,--to-string-exp--,--from-string-exp----)-><

运算符

在表达式中使用哪些符号表示运算符取决于是否使用了 NPS 兼容性方式。

  • 当 SQL_COMPAT='NPS' 时,运算符 ^ 和 “ ** ” 均解释为 “指数运算符” ,而运算符 # 解释为 “按位 XOR” 。
  • 否则,运算符 ^ 解释为 “按位 XOR” ,运算符 “ ** ” 解释为 “指数运算符” ,而运算符 # 没有任何含义(请参阅表达式)。

根据 SELECT 子句列进行分组

在 NPS 兼容性方式下操作时,可以在对查询结果进行分组时指定 SELECT 子句列的 “顺序位置” 或 “显示名”。

示例:

SELECT c1 AS a,

c2+c3 AS b,

COUNT(*) AS c

FROM t1 GROUP BY 1,2;

表达式引用列别名

在 NPS 兼容性方式下操作时,表达式可以引用选择列表中设置的列别名。

示例:

下列示例说明了如何在表达式中使用选择列表中设置的列别名(a 和 b):

SELECT c1 AS a, a+3 AS b FROM t1;

SELECT c1 AS a, ABS(a) AS b FROM t1 GROUP BY a, b HAVING c1 < 0;

SELECT c1+c3 AS a, CASE WHEN a < 5 THEN a ELSE NULL END AS b FROM t1;

以 NZPLSQL 编写的例程

除了 SQL PL语言之外,还可以使用 NZPLSQL语言

NZPLSQL 例程的局限性

以 NZPLSQL 编写的例程有以下几个限制:

  1. 例程必须为其每个参数精确定义一个别名。
  2. 例程不能包含 参数列表 或 可变参数。
  3. 例程必须返回二进制整数值、布尔值或 null 值。如果该例程返回非整数或非布尔值,那么它必须使用 return;(或 return null;)语句。

另外,对下列语法关键字的使用进行了限制:

  • ARRAY:例程不能包含数组变量。
  • AUTOCOMMIT:例程不能使用下列 SQL 子句:    BEGIN AUTOCOMMIT ON    AUTOCOMMIT ON blocks
  • FOR:除了可以在 FOR 语句中使用记录类型之外,例程不能使用 记录类型 。
  • IN EXECUTE: 如果例程使用 FOR...IN EXECUTE 语句对查询结果执行迭代,那么它必须使用 结构化记录 。
  • INTERVAL:例程不能使用 INTERVAL 数据类型 。
  • LAST_OID:例程不能使用 LAST_OID 子句。
  • RAISE:例程不能对 RAISE 使用 DEBUG 级别。
  • REFTABLE: 返回类型 不能是 REFTABLE。
  • RUN AS:例程不能包含 RUN AS 语句。
  • SELECT: 仅当 SELECT 语句包含 FROM 子句时,例程才能包含该语句。
  • TIMETZ:例程不能使用 TIMETZ 数据类型 。
  • TRANSACTION_ABORTED:例程不能发出 TRANSACTION_ABORTED 异常。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

2

添加新评论1 条评论

#KiKibj项目经理, 金融业
2020-09-17 20:40
学习了,DB2 还有这种兼容特性,如果每种数据库都有的话,就天下大同哈~

冯岩@KiKibj 要是所有数据库都有的话,应用迁移就会轻松不少哈~~

2020-09-18 08:59
Ctrl+Enter 发表

分布式关系型数据库选型优先顺序调查

发表您的选型观点,参与即得50金币。