程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> DB2用戶自定義數據類型UDT

DB2用戶自定義數據類型UDT

編輯:DB2教程

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--

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved