DB2存储过程入门

来源:互联网 发布:淘宝历史宝贝精灵 编辑:程序博客网 时间:2024/05/20 05:24

今天是工作的第一天,被老总要求写db2存储过程,关键是之前并没有学过这个,然后还了解到不同的数据库的存储过程是不太一样的,DB2的存储过程还没有教学的视屏或者详细的文章讲解,学的很吃力。感觉这个点是个问题,以后有技术出来,也不会有相应的文章和讲解,要慢慢摸索解决的方案。

就我今天接触的来说,存储结构给我的感觉就像一个放在数据库的方法一样,他可以传入参数,但是传出的是结果集,也就是resultset的类型对象。感觉上是可以把业务逻辑封装在里面,从而简化业务层或持久层的代码。

 问题1:
模糊查询,以传入的参数作为条件,要用||将参数和%链接起来,如:    '%'||v_companyid||'%';
问题2:
排序的时候北京,上海,重庆,天津等直辖市要排在最前面,需要指定这些数据在最前面,用decode函数。
order by  decode(provname,'北京',1,'上海',2,'天津',3,'重庆',4)
这样北京排在第一,上海排在第二,天津排在第三,重庆排在第四。
如遇到空值时, order by 默认将空值排在最下面,如要排在最上面,则: 

--用DROP PROCEDURE 存储过程名字来删除一个存储过程。

drop PROCEDURE TEST_ZBL@
         --用CREATE PROCEDURE 存储过程名字,来创建一个存储过程               
CREATE PROCEDURE TEST_ZBL(                                                                    

--这里表示调用这个存储过程时可以传入的参数,并且类型是varchar
IN v_companyid     VARCHAR(50),                     
)       

--这里表示返回的结果集为2(数据库表包括顶部的标题和下面的数据内容:比如城市,下面有北京上海等)                                                    
DYNAMIC RESULT SETS 2                                       
    LANGUAGE SQL                                                  
                                                                
BEGIN                             

--我们用DECLARE 变量名 数据类型来在存储过程内创建一个变量                            
    DECLARE SQLCODE INT;
    DECLARE v_errCode   INT DEFAULT 0;    

--这个地方写一个中间表,这个表只在内存中存在,我们把从数据库中读取到的需要的数据放在这个中间表中,然后在这个表上建一个游标来返回结果集
DECLARE GLOBAL TEMPORARY TABLE captions
(

--此表为标题表,上面存储了一些基础的标题数据
caption     VARCHAR(500),
width    INT,
property  VARCHAR(40),
format  VARCHAR(40),
fixcol  INT,
align    VARCHAR(40),
datatype  INT,
type        VARCHAR(40),
ordertag    int
 ) ON COMMIT PRESERVE ROWS WITH REPLACE NOT LOGGED; 

--此为数据表,即数据库中标题下面的数据
 DECLARE GLOBAL TEMPORARY TABLE result
(
provname     VARCHAR(50),
city    VARCHAR(50),
person_name  VARCHAR(50),
weixin  VARCHAR(50),
tel_num VARCHAR(50),
p_address    VARCHAR(200)

 )  ON COMMIT PRESERVE ROWS WITH REPLACE NOT LOGGED; 
--在这里我从数据库中拿到相应的数据插入到这个中间表中
  insert into session.result( provname,city, person_name, weixin, tel_num, p_address)
    select provname,city, person_name, weixin, tel_num, p_address  from C_TERMINALPERSON_TRUE  WHERE person_name LIKE '%'||v_companyid||'%';


  insert into session.captions( ordertag,caption, width, property, format, fixcol, align, datatype,type)
    values(0,'省份',60,'provname','', 1, 'center', 0,'lable' ),
          (1,'城市',60,'city','', 1, 'center', 0 ,'lable'),
          (2,'名字',60,'person_name','', 1, 'center', 0 ,'lable'),
          (3,'微信号',60,'weixin','', 1, 'center', 0 ,'lable'),
 (4,'电话',60,'tel_num','', 1, 'center', 0 ,'lable'),
 (5,'地址',60,'p_address','', 1, 'center', 0 ,'lable');


  BEGIN

--创建一个游标来返回查询语句所查询到的结果集
     DECLARE v_captionCur CURSOR  WITH RETURN TO CALLER FOR
      SELECT * FROM SESSION.captions  order by ordertag;
 
     DECLARE v_resultCur CURSOR  WITH RETURN FOR
      select * from session.result r  order by decode(provname,'北京',1,'上海',2,'重庆',3,'天津',4), provname,city;
     

--打开这个游标,外部就能通过游标来访问这个结果集
     OPEN v_captionCur;
     OPEN v_resultCur;
  END;


quick:
    RETURN v_errCode;            
                 
                 
END
@
    

0 0
原创粉丝点击