DB2 9 运用启示(733 考试)认证指南,第 8 部门: 低级编程(2)

用户定义的数据标准、并发性思量要素等等
developerWorks








用户定义的数据标准和数据标准转换

什么是用户定义的数据标准?

用户定义的标准(经常简称为 UDT)是凭据其他 DB2 数据标准(比喻 INTEGERCHAR 数据标准)树立的数据标准。UDT 以致可以基于其他 UDT。

UDT 用于树立变量的上下文。它们容许追踪如何在运用序次中运用对象。还可以定义差别数据标准和 UDT 之间的关系。

我们来思量一个俭朴的示例。假定您有一个运用序次用来确定美国和加拿年夜的市肆之间的最佳路线。为了完成这个功用,必需同时运用公制和英制度量的长度。您能够不知道表中存储的数据是以千米还是以英里为单元的。可以运用一个 UDT 树立一个 KM 标准,运用另一个 UDT 树立一个 MILES 标准。议决明晰地运用这些标准,可以明晰地知道表中存储的是哪种度量体式名目的数据。还可以编写一个函数,用来主动地将 KMMILES 标准的数据相加。

图 1. UDT:KM 与 MILES
UDT:KM 与 MILES





回页首



树立 UDT

可以用 CREATE DISTINCT TYPE 语句树立 UDT。该语句的语法如下:

-CREATE DISTINCT TYPE--distinct-type-name--AS----------------->
   --| source-data-type |--WITH COMPARISONS----------------------|


源数据标准可以是 DB2 所运用的任何标准数据标准,然则 XML 除外。

以下是一些示例:

CREATE DISTINCT TYPE km AS INTEGER WITH COMPARISONS
CREATE DISTINCT TYPE miles AS INTEGER WITH COMPARISONS


当成功地树立了 UDT 时,DB2 将主动生成标准相比操作符(=<><<=>>=)。

受权

树立 UDT 的受权 ID 所持有的特权必需至少包孕下列特权之一:

  • SYSADMDBADM 权力
  • 数据库上的 IMPLICIT_SCHEMA 权力(若是差别标准的体式名目名不指向现有的体式名目)
  • 体式名目上的 CREATEIN 特权(若是差别标准的体式名目名指向现有的体式名目)





回页首



运用 UDT

刚打仗 DB2 的启示职员在首次运用 UDT 时经常会形成错误,这是因为 UDT 与惯例数据标准交互的体式名目和相互之间交互的体式名目差别。日常平常,DB2 会主动地进行数据标准的转换,从而容许实行算术或相比操作。然则关于 UDT 则不会如斯。

强逼标准转换

DB2 并不主动地对所无数据标准进行转换。若是数据标准属于统一数据标准组(如 图 2 所示),则转换会主动进行。若是它们不属于统一组,就会出现错误。

图 2. DB2 数据标准组
DB2 数据标准组

例如,以下代码片段在 DB2 中会掉败:

empno = CHAR(6)  {but the data is always numeric}
SQL String: SELECT (empno   1) AS new_emp_no FROM employee


这个语句将掉败,因为无法将整数 “1” 与字符数据相加,即便该数据是一个数字的字符串发挥阐发。





回页首



转换

想要运用差别的 UDT 或数据标准进行相比或实行算术操作,可以运用 CAST 指令将它们转换成统一数据标准。以下是其语法:

CAST--(--objectName--AS--target-data-type--)----|


以下是一个示例:

CAST (empno AS INTEGER)


让我们再看几个示例。首先,树立两个差别的标准和一个运用它们的表:

CREATE DISTINCT TYPE km AS INTEGER WITH COMPARISONS;
CREATE DISTINCT TYPE miles AS INTEGER WITH COMPARISONS;
CREATE TABLE cityInfo (
	cityName   CHAR(20),
	width_k    KM         NOT NULL,
	width_m    MILES      NOT NULL
);


上面的 SQL 语句会成功实行,因为 WHERE 子句中进行相比的数据标准切确地转换为相反的数据标准。这个 SQL 语句将整数 “10” 转换成 KM 标准以便进行相比。

SELECT cityName
FROM cityInfo
WHERE width_k > km(10)


目前,让我们修正上面的语句来仿照一个罕有的错误。上面的语句不会成功,因为 DB2 不知道如何相比 MILESKM 数据标准:

SELECT cityName
FROM cityInfo
WHERE width_k > width_m


然则,上面的语句将成功实行,因为这两种数据标准都被转换成 INTEGER 标准。

SELECT cityName
FROM cityInfo
WHERE CAST(width_k AS INTEGER) > CAST(width_m AS INTEGER)





版权声明: 原创作品,容许转载,转载时请务必以超链接体式名目标明文章 原始来由 、作者信息和本声明。否则将深究司法责任。

原文地址:https://www.cnblogs.com/zgqjymx/p/1972822.html