DB2資料庫應用遷移常見問題 To DATE

2021-09-08 07:30:03 字數 2693 閱讀 1637

做過db2資料庫應用遷移的工程師,了解ibmmtk工具在遷移過程中所能完成任務,但這個工具並不能幫你完成所有的遷移工作,還有大量的遷移工作需要我們借助自己的經驗和方法來完成,下面是一些在db2資料庫移植過程中常見的問題簡單總結。這裡我只是針對oracle遷移到db2的常見問題描述。

1 db2與oracle常用資料型別之間的對應關係

oracle 資料型別

db2 udb 資料型別

注意事項

char(n)

varchar2(n)

char(n)

varchar(n)

1 <= n <= 254,若n>255使用varchar(n)

n <= 32672,若n>32672使用clob(n)

blob

clob

blob(n)

clob(n)

若n<=2gb,則使用blob(n)

若n<=2gb,則使用clob(n)

number

float /

real /

double

在實際使用中在oracle裡並不是用於非精確的資料,要根據實際情況參照decimal(p,s),decimal(p)轉換

number(p)

number(p,s)

smallint/

integer/

bigint/

decimal(p,s)

smallint, if 1 <= p <= 4

integer, if 5 <= p <= 9

bigint, if 10 <= p <= 18

date

date

time

timestamp

如果只使用mm/dd/yyyy,選擇date

如果只使用hh:mm:ss,選擇time

如果要使用日期和時間,選擇時間戳型別

可以使用oracle中的to_char()函式來取date的字串來分別與db2的date, time,timestamp相匹配

2. oracle的**轉換處理

上表列舉了db2與oracle資料型別之間的對應關係,除了在建立表結構時需要注意這兩種資料庫之間的型別轉換之外,在程式遷移過程中還需要注意的一點是:oracle支援資料型別之間的**轉化,但db2是不支援資料這個特性的,因此在使用sql進行資料查詢或更新時必須配置欄位的型別。

例如:在表中employee 欄位empno 定義為數字型別

select * from employee where empno='1010';

該語句在oracle資料庫環境可執行通過,但在db2下報錯sqlcode: -408, sqlstate: 42821。修正為

select * from employee where empno=1010;

如果在程式中使用變數,可以使用cast關鍵字進行資料型別轉換工作。語法如下:

select * from employee where empno =cast(v_name as bigint)

select * from employee where empno =cast(v_name as varchar(10))

db2也有to_char 和 to_date函式,但只能提供固定的轉換格式,如下

to_char (timestamp_expression,'yyy-mm-dd hh24:mi:ss')

to_date (string_expression, 'yyy-mm-dd hh24:mi:ss')

4. 空值處理

oracle空值處理通過 nvl 函式實現,db2中通過coalesce函式實現。在db2 v9.5中已經實現了 nvl 函式。

在oracle中,對於null資料的處理比較靈活,在與null值進行比較和拼接時與db2的結果完全不同,例如:

select 'abc' || c1 from t1 (c1 is null)   oracle得到 abc 的結果

在db2中為null,要想得到 abc 的結果,按照如下語法修改,

select 'abc『 || coalesce(c1,'') from t1

還有在oracle中 select * from table where id = null 這種語法是允許的,在db2中不可。但需要說明的是在oracle中雖然select * from table where id = null是可以通過語法檢查,但與select * from table where id is null語句得到結果集是不同的,所以在移植時要考慮真實的業務意義,在翻譯成db2的語法。

另外有些應用有如下用法

select * from table where ('' is null or id is null) and ('' is null or name = '')  and num = '0'

在db2中可翻譯為:

select * from table where (cast(null as varchar(10)) is null or id is null) and (cast(null as varchar(10)) is null or name is null)  and num = '0'

DB2資料庫學習之常見問題處理

1 db2 資料庫啟動報錯 資料庫例項管理器非正常專狀態關閉 執行以下語句 ipcs q grep db2inst1 awk xargs i ipcrm q ipcs s grep db2inst1 awk xargs i ipcrm s ipcs m grep db2inst1 awk xargs...

DB2 常見問題處理

1.db2 資料表掛起解決辦法 情況1 db2 drop column 後,會把表掛起,在命令列中連線到資料後,db2 reorg table 表名 可以使表解除掛起狀態 情況2 如果是應用對錶操作導致,可以執行下面一句 db2 set integrity for 表名 check immediat...

db2跨平台資料庫遷移

現在我們要把這個資料庫遷移到不同的作業系統 比如從aix到linux 我們應該怎麼辦呢?因為作業系統不同,所以使用backup restore命令顯然是不行了。那麼是不是可以使用db2move命令呢?也不行,首先db2move命令沒有辦法遷移索引 外來鍵約束 觸發器,更不能遷移含自增欄位資料的表。那...