搞db2也2年了,一直都没搞过存储过程,最近想学下,到网上看到这个很全的例子,这里我给它加上注释,给初学者有个学习语法的机会 ,黑色的为原来的例子部分,红色的我加上的语法注释,希望能对大家有所帮助,下面就开始我们美好的历程:
CREATE PROCEDURE IPD.st_inter_PROF ( IN in_Transfer_id dec(6,0),
IN in_TRANS_TYPE_id dec(2,0),
IN in_begin_date timestamp,
IN in_TRANSFER_name varchar(1024),
OUT o_err_no int,
OUT o_err_msg varchar(1024) )
LANGUAGE SQL
(说明:定义存储过程名后面括号的部分为输入输出参数定义。IN 表示输入参数,OUT表示输出参数,INOUT表示既是输入参数也是输出参数,参数类型就这3种了。例子中的dec(6,0)为参数的数据类型还可以为smallint 、bigint等)。<o:p></o:p>
(例子中的LANGUAGE SQL表示此存储过程是sql存储过程,还可以是用c写的存储过程,具体自己查资料吧。这里除了LANGUAGE SQL,还可以有其他说明:DYNAMIC RESULT SETS integer, SPECIFIC specific-name等。具体可以下载下面的附件说明。也可以看我blog文章:http://acme1921209.iteye.com/blog/97863)<o:p></o:p>
---------------------------下面开始存储过程的主体---------<o:p></o:p>
P1:BEGIN --(这里begin对应后面的end,表示一块。可以嵌套 benin begin end end )<o:p></o:p>
--临时变量出错变量<o:p></o:p>
declare rec integer default 0;<o:p></o:p>
--声明变量 (注意变量前缀和输入输出变量前缀i ,o ,v,n)
declare v_name varchar(1000);
declare n_rows_all bigint;
<o:p> </o:p>
--声明静态游标()
DECLARE c1 CURSOR FOR SELECT XM FROM T_RYXX WITH UR;
--声明动态游标
DECLARE V_C1 VARCHAR(50);
DECLARE c2 CURSOR FOR S1;
--声明出错处理 (出错处理声明应当位于变量声明和游标声明后面)(所谓的出错处理就是当程序出错时进行怎么样的操作,这个操作就是在这里定义)(具体出错处理说明可以看这里的最佳实践4:http://acme1921209.iteye.com/admin/show/97829)
DECLARE EXIT HANDLER FOR SQLEXCEPTION
Begin
………
End
DECLARE continue HANDLER for not found
begin
……….
end;
--开始啦
SELECT XM INTO V_NAME FROM T_RYXX WHRE RYXXID= in_Transfer_id(in_Transfer_Id<o:p></o:p>
为输入参数)
<o:p> </o:p>
---对上面动态游标的应用<o:p></o:p>
Set V_C1 = ‘select xm from t_ryxx fetch first 20 rows only with ur’;
PREPARE S1 FROM V_C1;
OPEN C1;
fetch_loop1:
loop
--loop主体,这里省略了,具体的可以看下面的附件,附件里有此存储过程的完整源代码,当然也有关于loop的详细语法说明,大家也可以去db2信息中心搜索,这个loop语法说明也是从db2信息中心下的<o:p></o:p>
end loop fetch_loop1; ----(loop结束)
…..—(关于存储过程的其他语法就不多说了)
END P1; ---(存储过程结束)<o:p></o:p>
<o:p> </o:p>
<o:p> </o:p>
注:下面附件附件内容还是很全面的,我初学基本就是看了下面的资料,当然也是网上很常见的那些,附件中的PROCEDURE-Example.sql为此存储过程的完整代码)<o:p></o:p>