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) values('JLCC00001',12),('GZGY00001',20) 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--