• 1.摘要
  • 2.基本信息
  • 3.VBScript
  • 4.ORACLE subtype 子类型
  • 4.1.定义子类型
  • 4.2.使用子类型
  • 5.Ada子类型
  • 5.1.创建数据类型和子类型
  • 5.2.创建新的数据类型
  • 5.3.派生类型
  • 5.4.创建子类型

数据子类型

数据子类型(Data subtype )是指在某系统或软件的已有数据类型下,为了进一步区分数据类型而对已有数据类型进行划分后的数据类型。

数据子类型和父类型是对应存在的,父类型是指被划分的原有实体,一个父类型若存在一个子类型,必然会有另一个子类型也存在。

基本信息

  • 中文名

    数据子类型

  • 外文名

    Data subtype

  • 涉及学科

    计算机等

  • 应用

    VBScript等

  • 对立

    父类型

  • 目的

    为了进一步区分数据

VBScript

VBScript只有一种数据类型 ——Variant,它是根据上下文来判断是数字还是字符串。因为Variant是VBScript中唯一的数据类型,所以它也是VBScript中所有函数的返回值的数据类型。为了进一步区分数据类型,它包含如下数据子类型:

子类型

描述

Empty

未初始化的Variant。对于数值变量,值为0;对于字符串变量,值为零长度字符串 ("")。

Null

不包含任何有效数据的Variant

Boolean

包含True或False。

Byte

包含0到255之间的整数。

VBScript在定义时只有一种变量类型,在实际使用中需要使用类型转换函数来将变量转换成相应的变量类型。

Cbool

变量转换成布尔值

Cbyte

变量转换为0到255之间的整数

Ccur、Cdbl、Csng

变量转换为浮点数值,前者精确到小数点后四位,后两者要更加精确,范围大的多

Cdate

变量转换为日期值

Cint、Clng

变量转换为整数,后者的范围比前者要大的多

ORACLE subtype 子类型

定义子类型

我们可以在任何PL/SQL块、子程序或包中定义自己的子类型,语法如下:

SUBTYPE subtype_name IS base_type[(constraint)] [NOT NULL ];

subtype_name就是声明的子类型的名称,base_type可以是任何标量类型或用户定义类型,约束只是用于限定基类型的精度和数值范围,或是最大长度。下面举几个例子:

DECLARESUBTYPE birthdate IS DATE NOT NULL ; -- based on DATE typeSUBTYPE counter IS NATURAL ; -- based on NATURAL subtypeTYPE namelist IS TABLE OF VARCHAR2 (10);SUBTYPE dutyroster IS namelist; -- based on TABLE typeTYPE timerec IS RECORD (minutes INTEGER ,hours INTEGER);SUBTYPE finishtime IS timerec; -- based on RECORD typeSUBTYPE id_num IS emp.empno%TYPE ; -- based on column type

我们可以使用%TYPE或%ROWTYPE来指定基类型。当%TYPE提供数据库字段中的数据类型时,子类型继承字段的大小约束(如果有的话)。但是,子类型并不能继承其他约束,如NOT NULL。

使用子类型

一旦我们定义了子类型,我们就可以声明该类型的变量、常量等。下例中,我们声明了Counter类型变量,子类型的名称代表了变量的使用目的:

DECLARESUBTYPE counter IS NATURAL ;ROWS counter;

下面的例子演示了如何约束用户自定义子类型:

DECLARESUBTYPE accumulator IS NUMBER ;total accumulator(7, 2);

子类型还可以检查数值是否越界来提高可靠性。下例中我们把子类型Numeral的范围限制在-9到9之间。如果程序把这个范围之外的数值赋给Numeral类型变量,那么PL/SQL就会抛出一个异常。

DECLARESUBTYPE numeral IS NUMBER (1, 0);x_axis numeral; -- magnitude range is -9 .. 9y_axis numeral;BEGINx_axis := 10; -- raises VALUE_ERROR...END ;