游标和指针

来源:互联网 发布:mac os 10.12 beta5 编辑:程序博客网 时间:2024/05/22 14:16
游标的概念:
    是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。
    每个游标区都有一个名字,用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。
优点:


    在数据库中,游标是一个十分重要的概念。
    游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。
    游标总是与一条SQL 查询语句相关联因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。
缺点:
    游标速度较慢。数据量比较大时,占内存。
游标的作用和特点;
游标是对查询数据的返回结果进行单方向的遍历,方便对相关数据进行操作。、
特点:
 
 1  只是对返回的数据结果进行遍历,没有其他的功能,也就是说不能进行“增” “删” “改”。


 2  游标单方向进行动作的,游标是不能滚动的,也就是只能在一个方向上进行遍历,不能在记录之间随意进退,不能跳过某些记录。
 3  避免在已经打开游标的表上更新数据。


 游标的结构:


  ① 创建游标  
  ②定义游标的结束条件  来避免出现“no data to fetch”这样的错误,
  ③打开游标  
  ④获取记录  
  ⑤关闭游标


 DECLARE 游标名称 CURSOR  FOR 


       select  ….   From  ….  Where …;------不能有into关键字
       (into 关键字后的变量要求先声明;只能出现在存储过程和触发器,不能单独使用;字段(数量、类型)要和声明的变量一致;只能针对一行;返回标量值:)
 #定义游标的结束--当遍历完成时,将DONE设置为1
 declare CONTINUE HANDLER FOR SQLSTATE '02000' SET tmpname = null;
 #也可以这么写


 #DECLARE CONTINUE HANDLER FOR NOT FOUND SET tmpname = null;




 open  游标名称;


 fetch  游标名称 into  变量; 


 close  游标名称;


异常代码:


SQLSTATE代码


Error 1022  XXXXXXXXXXX


内置异常描述


   Declare  exit      handler  for SQLSTATE 信息 执行的动作;


   Declare  continue  handler  for SQLSTATE 信息 执行的动作;


注意:


1、 执行顺序(声明位置无要求,建议在开头,当错误出现的时候被执行,如果


是exit类型的在终止整个存储过程的执行;如果是continue类型的则从错误


出现的位置继续);


例子:
CREATE PROCEDURE CIVE_GXB_CARRYNUMBERINFOJOB(
   OUT COMPID VARCHAR(32), #公司ID
   OUT ENTITYID VARCHAR(32), #实体ID
   OUT USERID VARCHAR(32), #用户ID
   OUT USERLEVEL VARCHAR(32), #用户级别
   OUT SOLUTIONID VARCHAR(32), #方案ID
   OUT METHODNAME VARCHAR(32), #方法名称
   OUT SELECTSQL VARCHAR(20000), #查询数据sql
   OUT DELETESQL VARCHAR(4000), #删除数据sql
   OUT DELPARAMETER VARCHAR(4000), #查询数据sql
   OUT PVALUES VARCHAR(20000) #用于直反类型
     )
     BEGIN
 DECLARE HMXZID VARCHAR(32); #UUID
 DECLARE HMXZNPCODE varchar(15); #手机号
 DECLARE HMXZNPZONEID varchar(5); #区域id
 DECLARE HMXZPORTOUTNETID varchar(10); #转出网id
 DECLARE HMXZPORTINNETID varchar(10); #转入网id
 DECLARE HMXZHOMENETID varchar(10); #归属网id
 DECLARE XZSSSHENGFENPROVID VARCHAR(32); #省份
 DECLARE DONE BOOLEAN DEFAULT 0; #定义结束标识


 DECLARE HMXZINFODATA CURSOR FOR 
 SELECT  HMXZ_ID, #UUID
 HMXZ_NPCODE, #手机号
 HMXZ_NPZONEID, #区域id
 HMXZ_PORTOUTNETID, #转出网id
 HMXZ_PORTINNETID, #转入网id
 HMXZ_HOMENETID #归属网id
 FROM cive_t_d_haomaxiezhuan
 WHERE HMXZ_ISDELETED=0
 AND HMXZ_ISDISABLED=0;
 #定义游标的结束--当遍历完成时,将DONE设置为1
 DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET DONE = 1;


 OPEN HMXZINFODATA; #打开游标
 #游标去取值放到变量当中
 FETCH HMXZINFODATA INTO HMXZID, #UUID
                          HMXZNPCODE, #手机号
                          HMXZNPZONEID, #区域id
                          HMXZPORTOUTNETID, #转出网id
 HMXZPORTINNETID, #转入网id
                          HMXZHOMENETID; #归属网id
  REPEAT
   #根据区域ID获取省份ID
   SELECT XZSS_SHENGFEN_PROVID_FK
   INTO XZSSSHENGFENPROVID
   FROM cive_t_c_xiezhuanshengshi
   WHERE XZSS_ISDELETED=0
   AND XZSS_ISDISABLED=0
   AND XZSS_QUYUID=HMXZNPZONEID;


   UPDATE cive_t_d_haomaxiezhuan
   SET HMXZ_COMPID_FK='x9128496a6ec4bdc9c4f28f2c2cd83ed', #工信部
HMXZ_SHENGFEN_PROVID_FK=XZSSSHENGFENPROVID, #省份
HMXZ_ZHUANCHUYUNYINGSHANG=SUBSTRING(HMXZPORTOUTNETID,2,2), #转出运营商
HMXZ_ZHUANRUYUNYINGSHANG=SUBSTRING(HMXZPORTINNETID,2,2), #转入运营商
HMXZ_GSYUNYINGSHANG=SUBSTRING(HMXZHOMENETID,2,2) #归属运营商
   WHERE HMXZ_ID=HMXZID;


   FETCH HMXZINFODATA INTO HMXZID, #UUID
 HMXZNPCODE, #手机号
 HMXZNPZONEID, #区域id
 HMXZPORTOUTNETID, #转出网id
 HMXZPORTINNETID, #转入网id
 HMXZHOMENETID; #归属网id


 UNTIL DONE=1
 END REPEAT;
 CLOSE HMXZINFODATA; #关闭游标
     END;;


指针


在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。
1 0