DB2純SQL存儲(chǔ)過(guò)程入門(mén)的“通道”描述
以下的文章主要向大家講述的是DB2純SQL存儲(chǔ)過(guò)程入門(mén)的實(shí)踐方案,其實(shí)際的操作背景是本人現(xiàn)在在DB2 9.1數(shù)據(jù)庫(kù)做Birt應(yīng)用,需用寫(xiě)DB2數(shù)據(jù)庫(kù)純SQL存儲(chǔ)過(guò)程,經(jīng)過(guò)多層嵌套循環(huán)查詢(xún)多個(gè)表,并返回一個(gè)最終的結(jié)果集(打開(kāi)的游標(biāo))。
然后再在birt中直接調(diào)用以下就獲取了結(jié)果集的紀(jì)錄,并展示在頁(yè)面中。為此,我在網(wǎng)上搜索了很多資料,但是沒(méi)有一個(gè)完整的可以執(zhí)行的DB2存儲(chǔ)過(guò)程。研究好久了,終于寫(xiě)出來(lái)了一個(gè)模板性的示例出來(lái)。現(xiàn)在拿出來(lái),和各位網(wǎng)友共同分享交流。
示例說(shuō)明:先創(chuàng)建一個(gè)臨時(shí)表,并插入數(shù)據(jù),然后查詢(xún)臨時(shí)表,返回游標(biāo)。
create procedure testPrc()
-- 返回一個(gè)紀(jì)錄
dynamic result sets 1
-- DB2純SQL存儲(chǔ)過(guò)程
p1: begin
-- 定義一個(gè)全局臨時(shí)表tmp_hy
- declare global temporary table session.tmp_hy
- (
- dm varchar(10),
- mc varchar(10)
- )
with replace -- 如果存在此臨時(shí)表,則替換
not logged; -- 不在日志里紀(jì)錄
給臨時(shí)表插入三條數(shù)據(jù)
- insert into session.tmp_hy values('1','1');
- insert into session.tmp_hy values('1','1');
- insert into session.tmp_hy values('1','1');
- p2: begin
聲明游標(biāo)
- declare cursor1 cursor with return for
- select * from session.tmp_hy;
游標(biāo)對(duì)客戶(hù)機(jī)應(yīng)用程序保持打開(kāi)
- open cursor1;
- end p2;
- end p1
另:鑒于有人問(wèn)到此例子怎么執(zhí)行,我是在集成開(kāi)發(fā)環(huán)境里執(zhí)行的.運(yùn)行存儲(chǔ)過(guò)程的方法很多,可以存在高級(jí)編程語(yǔ)言里調(diào)用,也可以在命令行調(diào)用,也可以在sql開(kāi)發(fā)工具里調(diào)用,沒(méi)法一概而論,還有,這個(gè)游標(biāo),你要看到結(jié)果,需要逐條取出所有紀(jì)錄.這些都是其它方面的知識(shí),你可以去別的地方補(bǔ)充.我這里怎么運(yùn)行的,以及怎么處理的,為了避免誤導(dǎo)讀者,我還是不說(shuō)了.下面我給出我調(diào)用此存儲(chǔ)過(guò)程得出的結(jié)果,如下圖:
下載 (1.76 KB)
2010-7-21 16:21
總結(jié):這個(gè)例子很簡(jiǎn)單,但是很實(shí)用,可以作為一個(gè)DB2純SQL存儲(chǔ)過(guò)程的模板來(lái)用。完全操作的是臨時(shí)表,你在任何db2數(shù)據(jù)庫(kù)下都可以執(zhí)行,并查看結(jié)果。為了保持例子的簡(jiǎn)潔易懂,我沒(méi)有設(shè)置輸入輸出參數(shù),這些參數(shù)和Oracle里,高級(jí)變成語(yǔ)言中函數(shù)的參數(shù)差不多,所以就寫(xiě)了這個(gè)不帶參數(shù)的。
題外話(huà):DB2 的存儲(chǔ)過(guò)程和函數(shù)與Oracle的差別太大,DB2存儲(chǔ)過(guò)程允許返回值,還可以設(shè)定返回值的數(shù)量,而Oracle的存儲(chǔ)過(guò)程是不允許返回值的;DB2的函數(shù)也可以返回值,也可以返回表,而Oracle返回比較隨意。
用DB2做開(kāi)發(fā)是件很痛苦的事情,原因是沒(méi)有很好的開(kāi)發(fā)工具,不像Oracle有 PL/SQL這樣強(qiáng)大的開(kāi)發(fā)工具可用,但是DB2的性能比Oracle的好,海量T級(jí)別的數(shù)據(jù)庫(kù)尤為明顯。目前我用的是Quest Central For DB2 4.3,功能很弱,連自動(dòng)彈出表的列名功能都沒(méi)有!DB2自帶的開(kāi)發(fā)中心更爛,沒(méi)法用,shit!嚴(yán)重與IBM的品牌不相符合。不知道各位網(wǎng)友你們都在用什么開(kāi)發(fā)工具呢?
【編輯推薦】
- DB2性能調(diào)優(yōu)中易出現(xiàn)的問(wèn)題有哪些?
- DB2 多分區(qū)數(shù)據(jù)庫(kù)備份的正確操作流程演示
- 對(duì)DB2 增量備份的正確運(yùn)用描述
- DB2***SQL性能調(diào)節(jié)技術(shù)經(jīng)典版
- 對(duì)DB2數(shù)據(jù)移動(dòng)方法的正確解析