全面解析IBM DB2數(shù)據(jù)庫(kù)移植的常見(jiàn)問(wèn)題
安裝與配置
在 Linux 下重新安裝 DB2 之后無(wú)法建立 DB2INST1 的實(shí)例,提示已經(jīng)存在
解決辦法:刪除 /var/db2/v81 目錄,再重新創(chuàng)建實(shí)例;
原因分析:在重新安裝 DB2 之前,需要卸載原 DB2 安裝環(huán)境,其中很重要的一步就是,使用 db2idrop 命令刪除 DB2INST1 實(shí)例, 如果不刪除,再次安裝 DB2 之后,則無(wú)法建立相同名稱(chēng)的數(shù)據(jù)庫(kù)實(shí)例。db2idrop 命令在 /opt/IBM/db2/V8.1/instance 目錄下,以下為示例:
清單 1. db2idrop 命令示例
/opt/IBM/db2/V8.1/instance/db2idrop db2inst1
在Solaris 5.8 下安裝 DB2 后卻無(wú)法創(chuàng)建實(shí)例,提示 shmmax 需要調(diào)整
解決辦法:編輯 /etc/system 文件,修改共享內(nèi)存參數(shù)和消息隊(duì)列值,重啟機(jī)器后再建實(shí)例;
原因分析:DB2 在 UNIX 系統(tǒng)上需要使用 IPC 通信,所以內(nèi)核參數(shù)共享內(nèi)存和消息隊(duì)列是關(guān)鍵指標(biāo),如果不能達(dá)到 DB2 要求數(shù)量,則 DB2 無(wú)法正常工作,其具體數(shù)字不易記憶,但可以查看 db2diag.log,里面記錄了 DB2 所需要的具體數(shù)字,依照該數(shù)字更新內(nèi)核參數(shù)即可。
DB2 Runtime Client 可否不安裝開(kāi)發(fā)工具包,只安裝足夠客戶端工作的組件,以方便模擬客戶實(shí)際應(yīng)用環(huán)境進(jìn)行測(cè)試?
解決辦法:DB2 Runtime Client并不包含開(kāi)發(fā)工具包。其功能就是只提供客戶端工作的組件包。
一個(gè)裸設(shè)備無(wú)法同時(shí)分配給兩個(gè)數(shù)據(jù)庫(kù),這樣無(wú)法建立兩個(gè)數(shù)據(jù)庫(kù)服務(wù)器共享同一個(gè)裸設(shè)備
解決辦法:把這兩個(gè)數(shù)據(jù)庫(kù)分別建在不同的實(shí)例上,將其中一個(gè)實(shí)例停下,第二個(gè)實(shí)例啟動(dòng),分配裸設(shè)備給該活動(dòng)實(shí)例上的數(shù)據(jù)庫(kù),分配完畢后將活動(dòng)實(shí)例停下,啟動(dòng)第一個(gè)實(shí)例,重復(fù)先前分配裸設(shè)備的操作到第一個(gè)實(shí)例,即可實(shí)現(xiàn)當(dāng)一個(gè)數(shù)據(jù)庫(kù)停下時(shí),該裸設(shè)備數(shù)據(jù)可以完全被另外一個(gè)數(shù)據(jù)庫(kù)接管,從而實(shí)現(xiàn)共享。
原因分析:一個(gè)容器是無(wú)法同時(shí)分配給兩個(gè)活動(dòng)數(shù)據(jù)庫(kù)的。必須針對(duì)兩個(gè)實(shí)例來(lái)操作,分配給一個(gè)實(shí)例時(shí)另一個(gè)實(shí)例必須處于不活動(dòng)狀態(tài)。
在 Linux 上 DB2 安裝完成后,不能綁定 License,報(bào) DBI1430N 錯(cuò)誤
解決辦法:
1.更新系統(tǒng)時(shí)間到當(dāng)前時(shí)間。使用 Linux 中的 DATE 命令;
2.使用 db2licm 命令綁定 License:
清單 2. 綁定 License 命令示例
./db2licm -a db2ese.lic
在Linux 上 DB2 實(shí)例創(chuàng)建不成功,返回錯(cuò)誤碼 DBI1281E
解決辦法:正確設(shè)置主機(jī)名;
原因分析:DB2 創(chuàng)建實(shí)例時(shí)要取主機(jī)名,如果主機(jī)名設(shè)置不正確,則會(huì)報(bào)告無(wú)法初始化實(shí)例的錯(cuò)誤,也就是 DBI1281E,可以首先用 uname 或者 hostname 查看是否有主機(jī)名,進(jìn)一步可以用 ping 命令驗(yàn)證主機(jī)名是否正確,如果 ping 不通則不正確,還可以檢查 /etc/hosts 查看 IP 和主機(jī)名的對(duì)應(yīng)關(guān)系是否正確。
連接數(shù)據(jù)庫(kù)
SuSE Linux C shell 環(huán)境下,無(wú)法連接數(shù)據(jù)庫(kù)
解決辦法:在cshell下,執(zhí)行以下腳本設(shè)置環(huán)境,或?qū)⒃撁罴拥?Linux 用戶配置文件中:
清單3. 設(shè)置環(huán)境
source /sqllib/db2csrhc
原因分析:在 Linux 下,根據(jù)不同的 shell,需要執(zhí)行不同的腳本來(lái)設(shè)置環(huán)境。
清單 4. 在不同的 shell 環(huán)境下設(shè)置
. /sqllib/db2profile (B shell 或 K shell)
source /sqllib/db2csrhc (C shell)
CLP 連接數(shù)據(jù)庫(kù)服務(wù)器返回錯(cuò)誤,提示 codepage 無(wú)法轉(zhuǎn)換,按提示更改代碼頁(yè)后仍然無(wú)法連接
解決辦法:在 CLP 中運(yùn)行 db2 terminate 后再重新連接即可;
原因分析:在 CLP 中 codepage 更改不會(huì)即時(shí)生效,必須斷掉當(dāng)前連接再連才會(huì)生效。
Solaris 5.8 下用命令行方式無(wú)法連接數(shù)據(jù)庫(kù),提示遇到錯(cuò)誤 SQL1084C
解決辦法:編輯 /etc/system 調(diào)整內(nèi)核參數(shù),重啟機(jī)器;
原因分析:查看 db2diag.log 可以發(fā)現(xiàn)消息隊(duì)列錯(cuò)誤,進(jìn)一步發(fā)現(xiàn)該機(jī)器上的內(nèi)核參數(shù)的消息隊(duì)列值被改為 4096,DB2 需要 65535,更改這個(gè)參數(shù)重啟機(jī)器和數(shù)據(jù)庫(kù),再連成功。
在Linux C Shell下創(chuàng)建新的 DB2 用戶之后,用該用戶無(wú)法連接數(shù)據(jù)庫(kù)
解決辦法:在該用戶 home 目錄下尋找 .cshrc 文件,如果沒(méi)有則手工創(chuàng)建一個(gè),然后在該文件中加入以下一行,然后重新登陸或者使用 source .cshrc 即可連接數(shù)據(jù)庫(kù)。
清單5. shell 環(huán)境設(shè)置
source /sqllib/db2cshrc
原因分析:創(chuàng)建的用戶所用的 shell 是 C shell,調(diào)用的是 .cshrc,該文件不存在,手工創(chuàng)建該文件,并在該文件中調(diào)用 sqllib/db2cshrc 后即可以正常連接數(shù)據(jù)庫(kù)。
存儲(chǔ)過(guò)程
在Stored Procedure 中如何判斷一個(gè)系統(tǒng)文件是否存在
解決辦法:使用 Java 開(kāi)發(fā)一個(gè) UDF, 將文件全名通過(guò)參數(shù)傳遞給這個(gè) UDF,在 UDF 中判斷系統(tǒng)文件是否存在然后返回結(jié)果代碼;
原因分析:存儲(chǔ)過(guò)程的主要目標(biāo)是對(duì)數(shù)據(jù)庫(kù)對(duì)象的操作,對(duì)文件系統(tǒng)操作需要借助于外部語(yǔ)言開(kāi)發(fā)用戶自定義函數(shù),DB2 中提供了用各種外部語(yǔ)言開(kāi)發(fā)函數(shù)的機(jī)制,所以推薦用 Java 開(kāi)發(fā) UDF 后,由該存儲(chǔ)過(guò)程來(lái)調(diào)用。
DB2 SQL PL 的 HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND 無(wú)法捕獲 SQLCODE=-727 和 SQLCODE=-911 的異常
解決辦法:將 DB2 補(bǔ)丁升級(jí)到 DB2V8 FixPack9;
原因分析:在 DB2 V8 FixPack7 上的確存在該問(wèn)題,在 FixPack9 中已經(jīng)解決。
備份與恢復(fù)
DB2中可否查詢最近一次全備份執(zhí)行的時(shí)間以及全備份文件存放的路徑
解決辦法:在 CLP 中可以使用 list history backup all for 命令查看,如需要在存儲(chǔ)過(guò)程中使用,可使用表函數(shù)查詢:select from table(snapshot_database('sample',-2)) as t
原因分析:snapshot_database() 是 DB2 中提供的表函數(shù),可以返回當(dāng)前數(shù)據(jù)庫(kù)的一些信息,其中包括了數(shù)據(jù)庫(kù)上次備份的時(shí)間信息。第一個(gè)參數(shù)是數(shù)據(jù)庫(kù)名,第二個(gè)參數(shù)是數(shù)據(jù)庫(kù)分區(qū)標(biāo)志,-2 代表所有分區(qū),-1 代表當(dāng)前分區(qū)。
如何在數(shù)據(jù)庫(kù)恢復(fù)的時(shí)候重定向表空間
解決辦法:使用如下命令,詳情請(qǐng)參見(jiàn)《DB2備份和恢復(fù)》簡(jiǎn)明手冊(cè):
清單6. 在數(shù)據(jù)庫(kù)恢復(fù)的時(shí)候重定向表空間
RESTORE DATABASE SAMPLE FROM 'C:TEMP' TAKEN AT 20050626155952 REDIRECT;
SET TABLESPACE CONTAINERS FOR 0 IGNORE ROLLFORWARD CONTAINER OPERATIONS
USING (PATH 'C:DB2NODE0000SQL00005SQLT0000.0');
RESTORE DATABASE SAMPLE CONTINUE;
數(shù)據(jù)操作
如何對(duì)應(yīng) SQLServer 的 InsertBulk 命令?
解決辦法:使用 load 命令。
如何給 VARGRAPHIC 類(lèi)型字段設(shè)置缺省值?
解決辦法:將數(shù)據(jù)庫(kù)建為 UTF-8 格式的數(shù)據(jù)庫(kù)。
原因分析:
表中有 long varchar 字段,在存儲(chǔ)過(guò)程的游標(biāo)中,以 select distinct varchar(該字段)……方式選擇記錄,但編譯通不過(guò)
解決辦法:把 distinct 去掉;
原因分析:如果有 long 型字段,加 distinct 關(guān)鍵字就失去意義而且十分影響性能,另外該列在原來(lái)的 Oracle 應(yīng)用中也只是定義為 varchar(4000),建議在 DB2 中仍設(shè)為 varchar 型,同時(shí)將該表所在表空間的 pagesize 加大,由缺省的 4k 設(shè)為 16k 或 32k。
DB2存儲(chǔ)過(guò)程中的異常處理如何寫(xiě),與Oracle中的有何區(qū)別?
解決辦法:DB2 中使用以下 SQL 語(yǔ)句聲明和處理異常:
清單7. 聲明和處理異常,方法一
DECLARE HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND
BEGIN
…
END;
或者也可以針對(duì)某一sqlstate定義相應(yīng)的錯(cuò)誤處理句柄,示例如下:
清單8. 聲明和處理異常,方法二
DECLARE condition_name CONDITION FOR SQLSTATE value;
DECLARE EXIT HANDLER FOR too_many_rows
BEGIN
...
END;
如何查詢數(shù)據(jù)庫(kù)中用戶已定義的表?
解決辦法:select * from syscat.tables;
原因分析:DB2 提供了一組視圖用以用戶查詢數(shù)據(jù)庫(kù)對(duì)象,這些視圖統(tǒng)一存放在 SYSCAT 模式下,這些視圖幾乎包含了所以的數(shù)據(jù)庫(kù)對(duì)象編目信息,包括表、視圖、名字空間、存儲(chǔ)過(guò)程等等。用戶可以在《DB2 UDB SQL Reference Volume 1》SQL Reference 1 的 Appendix D 中找到這些視圖的詳細(xì)定義。
如何查詢數(shù)據(jù)庫(kù)中用戶已定義的 sequence?
解決辦法:使用 select * from syscat.sequences。
如何用SQL語(yǔ)句獲得表空間的當(dāng)前使用率?
解決辦法:可以使用如下 SQL 語(yǔ)句查詢,在用該語(yǔ)句獲得了表空間已用頁(yè)數(shù),可用頁(yè)數(shù)等信息后,即可計(jì)算出表空間當(dāng)前使用率:
清單9. 獲得表空間頁(yè)數(shù)信息
select tablespace_name, page_size, usable_pages, used_pages, free_pages
from table( snapshot_tbs_cfg( 'sample', -1 ) ) as t
where t.tablespace_type = 0 and t.tablespace_name=
在 Oracle 中可以將游標(biāo)結(jié)果集通過(guò) BULK 方式存入宿主數(shù)組中,DB2中如何實(shí)現(xiàn)?
解決辦法:DB2 中不支持 BULK 方式,其替代方式是定義相應(yīng)的數(shù)組,然后以循環(huán)方式每次從游標(biāo)結(jié)果集中 fetch 一條記錄到數(shù)組元素中。
DB2中如何用 SQL 語(yǔ)句取出滿足條件的結(jié)果集的前N條記錄?
解決辦法:使用 select * from where fetch first row only。
Oracle中有 trunacte 表的功能,速度非常快,它只是把表標(biāo)志設(shè)為空,并不發(fā)生刪除數(shù)據(jù)的 IO 操作,DB2 中如何做類(lèi)似操作?
解決辦法:可以先 drop 表,再重建該表
原因分析:Oracle 中 trunacte 表的速度之所以快,是因?yàn)樗挥浫罩荆皇侵苯影驯淼慕Y(jié)構(gòu)信息刪除了,并不發(fā)生刪除數(shù)據(jù)的 IO 操作。DB2 中 drop 表,也不會(huì)引起數(shù)據(jù) IO 和日志記錄,從而達(dá)到相同的效果。但前提是你預(yù)先有創(chuàng)建表的結(jié)構(gòu)。否則不要隨意 drop 表。
Oracle 有 truncate,DB2 中建議使用 drop,然后再 create 表,這樣好還是 alter 表好?
解決辦法:Oracle 的 truncate 是直接把表的數(shù)據(jù)清空,但不記日志,所以速度很快。DB2 中 drop 表也避免了大量記錄記入日志的問(wèn)題,再重建表就達(dá)到了快速清空表的目的。但 alter 是用于修改表結(jié)構(gòu)的,和表的數(shù)據(jù)操作沒(méi)有關(guān)系。
在一次性導(dǎo)入大量數(shù)據(jù)到表中時(shí),會(huì)因?yàn)閷?xiě)日志而影響性能,如何提高該操作的性能,在導(dǎo)入數(shù)據(jù)后,需要做更新統(tǒng)計(jì)操作,如何做?
解決辦法:一次性導(dǎo)入大量數(shù)據(jù)時(shí)為了提高性能,可以使用 alter table activate not logged initially 在該事務(wù)中關(guān)閉該表的日志選項(xiàng),然后執(zhí)行數(shù)據(jù)導(dǎo)入,在該事務(wù)結(jié)束后,該表日志開(kāi)關(guān)自動(dòng)打開(kāi)。在導(dǎo)入大量數(shù)據(jù)后,為了提高查詢性能,再運(yùn)行 runstats on table 命令更新查詢統(tǒng)計(jì)信息。
提示:必須在一個(gè)事務(wù)中執(zhí)行關(guān)閉日志和數(shù)據(jù)導(dǎo)入才會(huì)不記日志,當(dāng)前事務(wù)結(jié)束后日志開(kāi)關(guān)會(huì)自動(dòng)重新打開(kāi)。
DB2 中如何定時(shí)執(zhí)行一些任務(wù),如表的清空等維護(hù)操作?
解決辦法:在任務(wù)中心圖形界面中將維護(hù)腳本導(dǎo)入,并設(shè)定定時(shí)調(diào)度的時(shí)間周期,任務(wù)中心會(huì)自動(dòng)調(diào)度該任務(wù)。運(yùn)行任務(wù)中心的前提是數(shù)據(jù)庫(kù)服務(wù)器上已裝有任務(wù)中心,并已編目工具目錄數(shù)據(jù)庫(kù),如果沒(méi)有工具目錄數(shù)據(jù)庫(kù),請(qǐng)按以下步驟操作:
使用 create db taskdb 創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù),以用于工具目錄數(shù)據(jù)庫(kù);
使用 db2admin start 啟動(dòng)數(shù)據(jù)庫(kù)管理服務(wù)器,如果已經(jīng)啟動(dòng),進(jìn)入第三步;
使用 db2 create tools catalog toolscat use existing db taskdb 編目工具目錄數(shù)據(jù)庫(kù)。
DB2 中如何實(shí)現(xiàn)為一個(gè) DMS 表空間自動(dòng)添加容器的腳本?
解決辦法:可以先計(jì)算表空間當(dāng)前可用大小,如小于某個(gè)設(shè)定值,則用 Alter tablespace add (...) 語(yǔ)句添加新的容器到表空間。計(jì)算表空間可用大小的方法可以參照問(wèn)題“如何用sql語(yǔ)句獲取表空間的當(dāng)前使用率?”
用 UDF 實(shí)現(xiàn)了將 TimeStamp 類(lèi)型的一個(gè)變量轉(zhuǎn)換成 Date 型,但卻無(wú)法將該 UDF 用于 Group By 子句
解決辦法:可以使用 With 語(yǔ)句將需要 Group By 的字段先預(yù)先處理。如:with t1(col1) as (select func1(timecolumn) from t2) select col1 from t1 group by col1。With 語(yǔ)句中的 func1()為 UDF,實(shí)現(xiàn)了將 timestamp 轉(zhuǎn)換為 date 的功能,其結(jié)果通過(guò) with 語(yǔ)句被定義為一個(gè) t1 中的虛列 col1,然后在 t1 中按 col1 分組。注意上面是一條語(yǔ)句,中間沒(méi)有分隔符。
如何做類(lèi)型轉(zhuǎn)換才能將 VARGRAPHIC 類(lèi)型的數(shù)據(jù)用在 LOCATE 函數(shù)中?
解決辦法:先將 VARGRAPHIC 轉(zhuǎn)換成 VARCHAR。然后再用于 locate 函數(shù)。
原因分析:LOCATE 函數(shù)只能接受字符串作為輸入,所以必須將 VARGRAPHIC 先轉(zhuǎn)換成 VARCHAR。同時(shí)在數(shù)據(jù)庫(kù)編碼格式上有要求,只有用 Unicode codepage 創(chuàng)建的數(shù)據(jù)庫(kù)才能實(shí)現(xiàn) VARGRAPHIC 到 VARCHAR 的轉(zhuǎn)換。所以之前要用 UTF-8 CN_ZH 方式創(chuàng)建數(shù)據(jù)庫(kù)。
如何使用 DB2 JDBC TYPE 4 方式連接數(shù)據(jù)庫(kù)?
解決辦法:將 JDBC Driver 配置為 com.ibm.db2.jcc.DB2Driver,在程序中數(shù)據(jù)庫(kù) URL 指定為 jdbc:db2://server:port/alias。Server 是指數(shù)據(jù)庫(kù)服務(wù)器所在主機(jī)名或 IP;port 是數(shù)據(jù)庫(kù)服務(wù)端口號(hào),缺省是 50000;alias 是數(shù)據(jù)庫(kù)別名。編譯時(shí)需要 db2jcc.jar,記得把它指定在 classpath 中。
如何將一個(gè) timestamp 類(lèi)型轉(zhuǎn)換為 yyyymmdd 格式?
解決辦法:可以使用用戶自定義函數(shù)(UDF)來(lái)實(shí)現(xiàn)。以下是一個(gè)廣為流傳的轉(zhuǎn)換函數(shù)代碼:
清單10. 將 timestamp 類(lèi)型轉(zhuǎn)換為 yyyymmdd 格式
create function ts_fmt(TS timestamp, fmt varchar(20))
returns varchar(50)
return
with tmp (dd,mm,yyyy,hh,mi,ss,nnnnnn) as
(
select
substr( digits (day(TS)),9),
substr( digits (month(TS)),9) ,
rtrim(char(year(TS))) ,
substr( digits (hour(TS)),9),
substr( digits (minute(TS)),9),
substr( digits (second(TS)),9),
rtrim(char(microsecond(TS)))
from sysibm.sysdummy1
)
select
case fmt
when 'yyyymmdd'
then yyyy || mm || dd
when 'mm/dd/yyyy'
then mm || '/' || dd || '/' || yyyy
when 'yyyy/dd/mm hh:mi:ss'
then yyyy || '/' || mm || '/' || dd || ' ' ||
hh || ':' || mi || ':' || ss
when 'nnnnnn'
then nnnnnn
else
'date format ' || coalesce(fmt,' ') ||
' not recognized.'
end
from tmp@
將上述代碼保存在一個(gè)文本文件中,假設(shè)保存到 func.db2 中,使用以下命令創(chuàng)建函數(shù):db2 –td@ -f func.db2。然后即可使用該 UDF 進(jìn)行時(shí)間格式轉(zhuǎn)換。該函數(shù)可以根據(jù)輸入的 timestamp 轉(zhuǎn)換為多種格式,包括 yyyymmdd,mm/dd/yyyy,yyyy/dd/mm hh:mi:ss,或者返回毫秒數(shù)(nnnnnn)。
在 SQL 存儲(chǔ)過(guò)程中有('每月'||COALESCE(VAR, '')||'元')語(yǔ)句時(shí),編譯無(wú)法通過(guò)
解決辦法:客戶端 codepage 和腳本的編碼格式不同,所以服務(wù)器端無(wú)法識(shí)別腳本命令,把客戶端 codepage 設(shè)為 1386 即可。
Oracle 中有一個(gè)函數(shù) DBMS_SQL.VARCHAR2_TABLE,可以傳入一個(gè)以某個(gè)分隔符為分隔的字符串,該函數(shù)將該字符串以分隔符拆分,返回給調(diào)用者一個(gè)數(shù)組或是表,DB2 中如何實(shí)現(xiàn)類(lèi)似功能?
解決辦法:用全局臨時(shí)表實(shí)現(xiàn);
原因分析:Oracle 中的 varchar2_table 其實(shí)是集合的概念,在 DB2 中不支持集合。DB2 通常做法是聲明全局臨時(shí)表(DGTT),第一列存儲(chǔ)記錄順序,第二列存儲(chǔ)數(shù)據(jù)。以下是示例,在聲明后即可向該表中插入和查詢數(shù)據(jù),效果和集合相同。
清單 11. 實(shí)現(xiàn)拆分
DECLARE GLOBAL TEMPORARY TABLE SESSION.temp_emp_list
(num integer, EmpName varchar(30))
WITH REPLACE
ON COMMIT PRESERVE ROWS NOT LOGGED;
DB2 無(wú)法對(duì)允許空值的列建唯一性索引
解決辦法:將該列屬性設(shè)為不允許為空;
原因分析:空值在數(shù)據(jù)庫(kù)中被認(rèn)為是不確定值,任何其他值與空值組合,結(jié)果仍然是空值,不具備唯一性,所以 DB2 不允許空值列作為唯一鍵的索引列。
同一張表的索引可以放在不同表空間中嗎?
解決辦法:在創(chuàng)建表的時(shí)候使用 INDEX in tablespace-name 選項(xiàng),在該表上創(chuàng)建的索引將存放在指定的表空間上;
原因分析:表數(shù)據(jù),表索引,以及表中的 long 型數(shù)據(jù)可以分開(kāi)存放在不同的表空間。可以提高性能。
用UDF 調(diào)用存儲(chǔ)過(guò)程總是編譯通不過(guò),報(bào)關(guān)鍵字沖突錯(cuò)誤
解決辦法:把該 UDF 改造成存儲(chǔ)過(guò)程;
原因分析:DB2 中 UDF 主要用于邏輯運(yùn)算和處理,存儲(chǔ)過(guò)程則偏重于處理數(shù)據(jù)庫(kù)對(duì)象,如表數(shù)據(jù)的增刪查改,所以兩者的用途不同決定了其使用方式也不同,UDF 使用的是內(nèi)嵌的 SQL 語(yǔ)句,是 SQL 語(yǔ)言的子集,不能執(zhí)行動(dòng)態(tài) SQL,如果 UDF 調(diào)用存儲(chǔ)過(guò)程,則會(huì)導(dǎo)致 SQL 嵌套上的混亂,因?yàn)?UDF 通過(guò)調(diào)用存儲(chǔ)過(guò)程實(shí)現(xiàn)了 SQL 全集,這是不允許的,所以報(bào)關(guān)鍵字沖突,把該 UDF 改為存儲(chǔ)過(guò)程即可。
建議對(duì)于不涉及數(shù)據(jù)庫(kù)表操作的業(yè)務(wù)邏輯可以用 UDF 實(shí)現(xiàn),如邏輯算法,文件操作,系統(tǒng)調(diào)用等,而涉及到數(shù)據(jù)庫(kù)表操作的功能則交給存儲(chǔ)過(guò)程來(lái)實(shí)現(xiàn)。存儲(chǔ)過(guò)程可以調(diào)用 UDF。
工具使用
如何在 CLP 中查看表結(jié)構(gòu)
解決辦法:使用 db2 describe table 命令。
用開(kāi)發(fā)中心遠(yuǎn)程調(diào)試存儲(chǔ)過(guò)程,可以構(gòu)建,但構(gòu)建并調(diào)試卻不能成功
解決辦法:在遠(yuǎn)程數(shù)據(jù)庫(kù)上安裝 DB2 開(kāi)發(fā)包;
原因分析:在遠(yuǎn)程調(diào)試時(shí)將會(huì)調(diào)用遠(yuǎn)程數(shù)據(jù)庫(kù)上的開(kāi)發(fā)包,所以遠(yuǎn)程服務(wù)器一定要裝有開(kāi)發(fā)包才可遠(yuǎn)程調(diào)試。
如何將部署在 DB2 數(shù)據(jù)庫(kù)上的存儲(chǔ)過(guò)程導(dǎo)出為可執(zhí)行腳本,以便在其它機(jī)器上部署
解決辦法:在開(kāi)發(fā)中心中可以導(dǎo)出存儲(chǔ)過(guò)程為腳本,前提是之前創(chuàng)建存儲(chǔ)過(guò)程的時(shí)候沒(méi)有指定 hide body。
如何讓 DB2 自動(dòng)運(yùn)行 runstat
解決辦法:使用 db2 update db cfg using auto_runstats on 命令。
