數據子類型(Data subtype )是指在某系統或軟體的已有數據類型下,為了進一步區分數據類型而對已有數據類型進行劃分後的數據類型。
數據子類型和父類型是對應存在的,父類型是指被劃分的原有實體,一個父類型若存在一個子類型,必然會有另一個子類型也存在。
基本介紹
- 中文名:數據子類型
- 外文名:Data subtype
- 涉及學科:計算機等
- 套用:VBScript等
- 對立:父類型
- 目的:為了進一步區分數據
VBScript,ORACLE subtype 子類型,定義子類型,使用子類型,Ada子類型,創建數據類型和子類型,創建新的數據類型,派生類型,創建子類型,
VBScript
VBScript只有一種數據類型 —— Variant,它是根據上下文來判斷是數字還是字元串。因為Variant是VBScript中唯一的數據類型,所以它也是VBScript中所有函式的返回值的數據類型。為了進一步區分數據類型,它包含如下數據子類型:
子類型 | 描述 |
Empty | 未初始化的Variant。對於數值變數,值為0;對於字元串變數,值為零長度字元串 ("")。 |
Null | 不包含任何有效數據的Variant。 |
Boolean | 包含True或False。 |
Byte | 包含0到255之間的整數。 |
Integer | 包含-32,768到32,767之間的整數。 |
Currency | -922,337,203,685,477.5808到922,337,203,685,477.5807。 |
Long | 包含-2,147,483,648到2,147,483,647之間的整數。 |
Single | 包含單精度浮點數,負數範圍從-3.402823E38到-1.401298E-45,正數範圍從1.401298E-45到3.402823E38。 |
Double | 包含雙精度浮點數,負數範圍從-1.79769313486232E308到-4.94065645841247E-324,正數範圍從4.94065645841247E-324到1.79769313486232E308。 |
Date (Time) | 包含表示日期的數字,日期範圍從公元100年1月1日到公元9999年12月31日。 |
String | 包含變長字元串,最大長度可為20億個字元。 |
Object | 包含對象。 |
Error | 包含錯誤號。 |
Cbool | 變數轉換成布爾值 |
Cbyte | 變數轉換為0到255之間的整數 |
Ccur、Cdbl、Csng | 變數轉換為浮點數值,前者精確到小數點後四位,後兩者要更加精確,範圍大的多 |
Cdate | 變數轉換為日期值 |
Cint、Clng | 變數轉換為整數,後者的範圍比前者要大的多 |
Cstr | 變數轉換為字元串 |
ORACLE subtype 子類型
定義子類型
我們可以在任何PL/SQL塊、子程式或包中定義自己的子類型,語法如下:
SUBTYPE subtype_name IS base_type[(constraint)] [NOT NULL ]; |
subtype_name就是聲明的子類型的名稱,base_type可以是任何標量類型或用戶定義類型,約束只是用於限定基類型的精度和數值範圍,或是最大長度。下面舉幾個例子:
DECLARE SUBTYPE birthdate IS DATE NOT NULL ; -- based on DATE type SUBTYPE counter IS NATURAL ; -- based on NATURAL subtype TYPE namelist IS TABLE OF VARCHAR2 (10); SUBTYPE dutyroster IS namelist; -- based on TABLE type TYPE timerec IS RECORD ( minutes INTEGER , hours INTEGER ); SUBTYPE finishtime IS timerec; -- based on RECORD type SUBTYPE id_num IS emp.empno%TYPE ; -- based on column type |
我們可以使用%TYPE或%ROWTYPE來指定基類型。當%TYPE提供資料庫欄位中的數據類型時,子類型繼承欄位的大小約束(如果有的話)。但是,子類型並不能繼承其他約束,如NOT NULL。
使用子類型
DECLARE SUBTYPE counter IS NATURAL ; ROWS counter; |
下面的例子演示了如何約束用戶自定義子類型:
SUBTYPE accumulator IS NUMBER ; total accumulator(7, 2); |
子類型還可以檢查數值是否越界來提高可靠性。下例中我們把子類型Numeral的範圍限制在-9到9之間。如果程式把這個範圍之外的數值賦給Numeral類型變數,那么PL/SQL就會拋出一個異常。
DECLARE SUBTYPE numeral IS NUMBER (1, 0); x_axis numeral; -- magnitude range is -9 .. 9 y_axis numeral; BEGIN x_axis := 10; -- raises VALUE_ERROR ... END ; |
Ada子類型
創建數據類型和子類型
(Creating Types and Subtypes)
使用變數時,除了以某標識符作為變數的名稱外,還要指定該變數的數據類型。一個數據類型定義了變數可接受的值以及所能執行的操作。比如說,一個數據類型為 Age 的變數 Bill,Age 的取值範圍為 1..100,並只有 + – 這兩種操作,在這裡,對象(object)為名為 Bill 的變數,它的取值在 1..100 之間(包括 1,100),值的變化只能通過+ -這些基本運算符(primitive operation)來實現,而無法通過* /等其它運算符。Ada 中的數據類型,包括預定義類型,都是按照一定的格式在程式包中創建的。下面就介紹創建數據類型的一些基本內容,更多相關內容會在以後見到。
創建新的數據類型
創建一個新類型,需要使用保留字type,is,range。格式如下:
type type_name is range range_specifcation; |
type_name 為新類型的名稱,是一個合法標識符;range_specifcation 表示該類型的取值範圍,表示方式為 First .. Last,如 1..100 , -9 ..10 。
例如創建上面提及的一個新類型 Age :
type Age is range 1 .. 100; |
這樣就有了一個數據類型 Age, 取值範圍 1 .. 100。
有一點要注意:range_specfication 中 First 要大於 Last。 如 type months is range12 .. 0, 實際上 months 是一個空集(null),而不是所期望的 0..12。
不同數據類型之間是不能進行混合運算的,即使取值範圍和運算符一樣。
派生類型
大家可能會發現,如果像上面一樣創建一個截然不同的新類型,還需要定義它的運算符,使用很不方便。因此,往往是派生現有的類型,其格式為:
type type_name is new old_type {range range_specification}; |
type_name 為新類型的名稱,是一個合法標識符;range range_specification 表示該類型的取值範圍,是可選的,沒有的話表示新類型 type_name 的取值範圍和 old_type 一樣。
創建子類型
創建新類型和派生類型的麻煩從上文就可以感受的到,特別是在科學計算這些有很多種小類型的軟體當中,上述兩種方法實在過於繁雜。這時子類型(subtype)就相當有用,子類型的定義格式為:
subtype type_name is old_type {range range_specification}; |
type_name 為新類型的名稱,是一個合法標識符;rangerange_specification 表示該類型的取值範圍,是可選的,沒有的話表示新類型 type_name 的取值範圍和 old_type 一樣。
子類型不僅繼承母類型的屬性,而且和母類型、其它同母類型的子類型可混合使用。