DB2用戶自定義數據類型UDT

DB2用戶自定義類型(User-Defined distinct types,UDT),這裏涉及自定義單值類型,基於DB2內置數據類型。
1、創建
語法如下:
CREATE [distinct] TYPE distinct_type_name AS source_data_type WITH COMPARISONS

source_data_type:指DB2內置數據類型,字符型(char,varchar等),日期時間型(date,time,timestamp等),
                  數值型(integer,double,decimal等),考慮到平臺的兼容性,
                  有些數據類型需要使用其他類型進行替代:
                  float —> double or real:float類型最好使用double或者real數據類型替代。
                  numeric —> decimal
                  long varchar —> varchar,dlob,clob
                  long vargraphic —> vargraphic or dbclob
WITH COMPARISONS:允許系統生成一個轉換函數,在自定義類型和基類型之間進行轉換。
                  因爲用戶自定義單值數據類型不能直接與DB2內置類型進行比較,需要通過轉換函數,
                  默認創建的轉換函數名與類型名distinct_type_name相同。
需要注意的是:
此類型名必須作爲數據庫同一schema下的對象唯一存在,不允許重名。
即使是基於同一個DB2基本類型而創建的UDT,也不能直接進行比較,
  因爲DB2 SQL PL支持強數據類型,不同UDT之間的比較需要進行顯示轉換。
下面這些函數是自動創建的:
  從DB2基本數據類型轉換到UDT的函數:distinct_type_name
  從UDT轉換到基本類型的函數:data_type_name
  若基類型是smallint的話,UDT可以將integer類型轉換爲自定義類型
  若基類型是char的話,UDT可以將varchar類型轉換爲自定義類型
  若基類型是graphic的話,UDT可以將vargraphic類型轉換爲自定義類型

WITH COMPARISONS將不支持LONG VARCHAR,LONG VARGRAPHIC兩種數據類型。
下面創建兩個自定義數據類型:公里(kilometers),英里(miles)
db2 => create type kilometers as integer with comparisons
DB20000I  SQL 命令成功完成。
db2 => create type miles as integer with comparisons
DB20000I  SQL 命令成功完成。

當創建完成這兩個UDT之後,系統將會自動創建如下函數:
miles(integer):將integer數據類型轉換爲miles數據類型
integer(miles):將miles數據類型轉換爲integer數據類型
kilometers(integer):將integer數據類型轉換爲kilometers類型
integer(kilometers):將kilometers類型轉換爲integer類型

2、使用
下面創建一個表,存儲旅遊信息:
create table travel(
id char(9) not null,       --編號
kdistance kilometers,      --距離,單位千米,1千米≈0.6英里
mdistance miles,           --距離,單位英里,1英里≈1.6千米
constraint pk_travel primary key(id)
)
產看錶結構:
db2 => describe table travel
                                數據類型                      列
列名                             模式       數據類型名稱      長     小數位      NULL
------------------------------- --------- ------------------- ---------- ----- ------
ID                              SYSIBM    CHARACTER                    9     0 否
KDISTANCE                       ADMINIST> KILOMETERS                   0     0 是
MDISTANCE                       ADMINIST> MILES                        0     0 是
  3 條記錄已選擇。

添加數據:
db2 => insert into travel(id,kdistance,mdistance) values('JLCC00001',12,0),('GZGY00001',20,0)
DB20000I  SQL 命令成功完成。
db2 => select * from travel
ID        KDISTANCE   MDISTANCE
--------- ----------- -----------
JLCC00001          12           0
GZGY00001          20           0
  2 條記錄已選擇。

更新數據:
db2 => update travel set mdistance=kdistance
DB21034E  該命令被當作 SQL 語句來處理,因爲它是無效的“命令行處理器”命令。
在SQL 處理期間,它返回:SQL0408N  值與其賦值目標的數據類型不兼容。
目標名爲 "MDISTANCE"。SQLSTATE=42821

正確的更新應該,將kilometers類型的數據轉換爲基類型integer,再進行其他處理,如下:
db2 => update travel set mdistance=integer(ceil(integer(kdistance)*0.6))
DB20000I  SQL 命令成功完成。
db2 => select * from travel
ID        KDISTANCE   MDISTANCE
--------- ----------- -----------
JLCC00001          12           8
GZGY00001          20          12
  2 條記錄已選擇。

下面進行不同數據類型之間的比較:
db2 => select * from travel
ID        KDISTANCE   MDISTANCE
--------- ----------- -----------
JLCC00001          12           8
GZGY00001          20          12
SCCD00001          29          34
LNDL00001          45          33
  4 條記錄已選擇。


db2 => select count(*) from travel where mdistance > kdistance
SQL0401N  運算 ">" 的操作數的數據類型不兼容或者不可比較。  SQLSTATE=42818

db2 => ? 42818
SQLSTATE 42818: 運算符或函數的操作數不兼容或者不可比較。

通過將kilometers類型先轉換爲其基類型integer,在轉換爲miles類型,就可以與miles類型的數據進行比較了。
實際上,所有基於自定義單值數據類型的比較操作,都需要將該UDT轉換爲其基類型,在進行比較或者轉換操作。
db2 => select * from travel where mdistance > miles(integer(kdistance))
ID        KDISTANCE   MDISTANCE
--------- ----------- -----------
SCCD00001          29          34
  1 條記錄已選擇。


db2 => select * from travel where mdistance > 20
SQL0401N  運算 ">" 的操作數的數據類型不兼容或者不可比較。  SQLSTATE=42818

db2 => select * from travel where mdistance > integer(20)
SQL0401N  運算 ">" 的操作數的數據類型不兼容或者不可比較。  SQLSTATE=42818

db2 => select * from travel where mdistance > miles(20)
ID        KDISTANCE   MDISTANCE
--------- ----------- -----------
SCCD00001          29          34
LNDL00001          45          33
  2 條記錄已選擇。

總之,同類型之間的數據纔可以進行比較!

3、刪除
drop [distinct] type type_name
刪除自定義數據類型的時候,要注意,不能有列或者其他對象引用這個UDT,否則將會報錯:
SQL0478N  不能對對象類型 "TYPE" 執行 DROP、ALTER、TRANSFER OWNERSHIP 或REVOKE,
因爲它有一個類型爲 "TABLE" 的從屬對象 "ADMINISTRATOR.TRAVEL"。SQLSTATE=42893

db2 => drop type kilometers
DB20000I  SQL 命令成功完成。
db2 => drop type miles
DB20000I  SQL 命令成功完成。


轉載請註明出處:http://blog.csdn.net/bobo12082119/article/details/8770549

--the end--
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章