DB2儲存過程

47328983發表於2013-02-07
一個簡單的儲存過程為例,說說DB2儲存過程從編寫程式碼到部署編譯最後執行的過程。

  首先,編寫程式碼,程式碼如下:

  CREATE PROCEDURE sales_status() ---儲存過程可以設定輸入引數和輸出引數

  LANGUAGE SQL ----DB2可以用多種語言編寫儲存過程,這裡用的是純SQL

  BEGIN ---開始

  DECLARE vID smallint; ---定義變數 和Oracle一樣 DECLARE 變數名 變數的資料型別;

  FOR V AS SELECT BRND_CD FROM TMP_BRND_CD ---for迴圈 tmp_brnd_cd預先建立好

  DO ---迴圈體開始

  SET vID=BRND_CD; ---對vID賦值,db2可以用set賦值,也可以用values賦值,這裡可以寫成values(BRND_CD) into vID

  INSERT INTO WWM_FORINSERT_TEST VALUES(vID); ---往wwm_forinsert_test 插入資料

  END FOR; -----迴圈體結束

  END @ -----儲存過程結束

  把程式碼檔案儲存為db2檔案,我的檔名為 sample.db2,路徑為:E:\db2pro

  接著就是部署編譯儲存過程了,我下載了一兩本電子書看,可惜都沒說到怎麼用命令列模式部署以及編譯儲存過程的,都介紹在整合開發環境下部署編譯。~~~暈~~,幸虧在網上找到了(不過也找的挺辛苦的~~)。

  在Windows下,進入命令模式,然後輸入 db2cmd 就會進入db2 命令模式,然後輸入 db2 -td@ -vf E:\db2pro\sample.db2 就開始編譯儲存過程了~~~!要是報錯,那就要檢查程式碼羅~。改完程式碼,重新編譯羅~~~!

  最後,執行儲存過程,儲存過程部署編譯後,就是呼叫儲存過程了。

  db2 裡使用call 命令呼叫儲存過程,在db2命令模式下輸入db2 call sample()即可~!

  以上,只是一個簡單的例子,很多東西還沒涉及如出錯處理,遊標,在儲存過程裡使用臨時表等等~~!



有一表的記錄為:
Task_ID Employee_Name STEPWORKTIME
6262 張三 2
6262  ,成都酒吧裝置回收; 李四 2
6262 王二 1.5
6265 成某 2
6265 趙某 2
6265 錢某 1.5
……
我想求一個函式能將Task_ID欄位相同記錄合併為一條記錄。
即想得到如下結果:
Task_ID Employees WorkLoad
6262 張三、李四、王二 5.5
6265 成某、趙某、錢某 5.5
……

我寫了一下,沒寫出UDF,只寫了個儲存過程。能應付他大概的要求。
可是樓主不怎麼滿意,想著與其丟掉,不如索性貼出來,大家批評批評^_^。

先建立一個表,名為FromTable
db2 create table FromTable(id varchar(10),name varchar(200),stepworktime int)
插入資料
db2 insert into FromTable values ('6262','張三',2)
db2 insert into FromTable values ('6262','李四',2)
db2 insert into FromTable values ('6262','王二',1.5)
db2 insert into FromTable values ('6265','成某',2)
db2 insert into FromTable values ('6265','趙某',2)
db2 insert into FromTable values ('6265','錢某',1.5)

現在再建立一個表,為ToTable
跟test1000一樣的結構,用一個儲存過程把你要的結果插進去
創表
db2 create TABLE ToTable ( id varchar(100), name varchar(100),sum int )

寫儲存過程


CREATE PROCEDURE ADMINISTRATOR.ProcConcatName ( )
------------------------------------------------------------------------
--SQL 儲存過程
--Sisijian
--2005-01-20
------------------------------------------------------------------------

Lable1: begin

------------------------------------------------------------------------
--定義變數
--v_NumOfRecd存放對應FromTable每個id記錄條數
--v_Index控制當前記錄是在id相同的記錄中第幾條
--v_id等三個變數用於存放臨時資料
--at_end控制是否到底
------------------------------------------------------------------------
DECLARE SQLSTATE CHAR(5);
DECLARE v_NumOfRecd int;
,成都電纜回收; DECLARE v_Index int;
DECLARE v_Id varCHAR(100);
DECLARE v_ConcatedName varchar(5000);
DECLARE v_SumOfWorkTime int;
DECLARE at_end INT DEFAULT 0;


DECLARE not_found CONDITION FOR SQLSTATE '02000';
DECLARE C1 CURSOR FOR
SELECT id, count(*)
FROM FromTable
GROUP BY id
ORDER BY id;

DECLARE CONTINUE HANDLER FOR not_found
SET at_end = 1;

------------------------------------------------------------------------
--遊標移動一次,就到一個新的id,id不會重複,因為經過上面的group by
------------------------------------------------------------------------
OPEN C1;
Concat_Loop:
LOOP
FETCH C1 INTO v_Id, v_NumOfRecd;
IF at_end = 1 THEN
LEAVE Concat_Loop;
END IF;
------------------------------------------------------------------------
--遇到每個id ,第一條記錄都應該直接插入的
------------------------------------------------------------------------
SET v_Index=1;
SET v_C cdth= (SELECT name FROM
(SELECT ROW_NUMBER() over() as a ,FromTable.* FROM FromTable where id = v_Id) as x where a=v_Index );
SET v_SumOfWorkTime = (SELECT STEPWORKTIME FROM
(SELECT ROW_NUMBER() over() as a ,FromTable.* FROM FromTable where id = v_Id) as x where a=v_Index );
INSERT INTO ToTable VALUES (v_Id, v_ConcatedName,v_SumOfWorkTime);
SET v_Index=2;
------------------------------------------------------------------------
--如果有第二條的話,就連線名字字串,累加STEPWORKTIME資料

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/241379/viewspace-753991/,如需轉載,請註明出處,否則將追究法律責任。

相關文章