昨天安装了DB2Express-C版本,之前曾经写过Oracle的存储过程。在Oracle里写存储过程是一件很简单的事情,编译也是很简单。而想写DB2的存储过程则没那么容易,部署编译存储过程要是没有集成开发环境(如IBM data studio)或者不清楚的db2命令的话,那是让人很痛苦的事。而我就是其中的一位,我不想下载6百多M的开发环境,只好自己用txt文档编辑器写存储过程了,简单的存储过程是容易写的,按照db2 存储过程的语法去写就OK了。痛苦的是写好了不知道怎么样部署。以下以我刚刚写的一个简单的存储过程为例,说说DB2存储过程从编写代码到部署编译最后运行的过程。
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数据