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