oracle存储过程在循环游标时定义新的游标,并向子表插入数据

下面是我在做报表时写存储过程的一部分,拿过来顺便做个记录,以便于以后忘了还可以看看,本人能力一般,水平有限,如果有各位大神看到不对的地方,欢迎指导!哦,这个是使用达梦数据库做的存储

CREATE OR REPLACE PROCEDURE AAAAAAAAAAAAAAAAAAAAAA
AUTHID DEFINER
 is

/****************************************************这是定义变量的开始*****************************************************/

/*姓名*/
username varchar(32);
/*民族*/
nation number(16);
/*性别*/
sex number(16);
/*出生日期*/
birthdate date;
/*户口性质*/
nature number(16);
/*行政区划*/
regionname varchar(32);
/*学校*/
departname varchar(32);
/*学段*/
phase varchar(32);
/*返回的id*/
stuid varchar(32);
/*组织机构id*/
schstuid varchar(32);
/*组织机构code*/
schstucode varchar(32);

/*身份证号*/
idcard varchar(32);
/*学年*/
xuenian number(16);
/*资助名称*/
zatname varchar(32);
/*资助id*/
zatid varchar(32);
/*分类名称*/
zatclassname number(16);
/*批次号*/
batchnumber varchar(32);
/*资助类型*/
zattype number(16);

/*发放金额*/
amountpay number(16,2);


/*国家资助金额*/
gjpay number(16,2);
/*地方资助金额*/
dfpay number(16,2);
/*社会资助金额*/
shpay number(16,2);
/*学校资助金额*/
xxpay number(16,2);
/*合计*/
hjpay number(16,2);

/************************************这是定义for循环中的游标开始*******************************/

type cur_type is ref cursor; --定义游标类型
cur5 cur_type; --定义游标变量

/*************************************这是定义for循环中的游标结束*******************************/

/****************************************************这是定义变量的结束*****************************************************/

 

/*******************************************************这是定义要循环的游标开始***********************************************/
cursor cur1 is select sp.pre_id_card as preidcard ,ab.zat_xuenian as xuenian
from AA sp left join BB ap on sp.pre_id_card = ap.zpre_id_card 
left join CC te on ap.zpre_fd_id = te.id left join DD sd on sp.school_id = sd.id
left join EE ab on te.id = ab.fd_id group by sp.pre_id_card,ab.zat_xuenian;

//这可以定义多个,下面就可以逐条进行遍历了

/*******************************************************这是定义要循环的游标结束***********************************************/

begin

  /*遍历游标*/    
 for temp1 in cur1 loop 
      /*姓名*/
      select pre_user_name into username from AA where pre_id_card = temp1.preidcard
      /*学校*/
      select sd.departname into departname from AA sp inner join  DD sd on sp.school_id = sd.id where sp.pre_id_card = temp1.preidcard;

/**************************************************有很多就不逐条往下写了******************************************************/
     /*每次循环置为0*/
      gjpay :=0.00;
      dfpay :=0.00;
      shpay :=0.00;
      xxpay :=0.00;
      hjpay :=0.00;


      /*累计国家资助金额*/
            select sum(pay) into gjpay 
        from BB a 
        join zn_aidType b on a.zpre_fd_id=b.id  
        join zn_aidBatchSch c on a.zpre_batch_number=c.id 
        join zn_aidBatch d on c.abc_id=d.id 
        join DD e on e.id=c.abs_school 
        where a.STAUTS=1 
        and b.zat_classification_name=1 
        and a.ID_CARD=temp1.preidcard
        and zat_xuenian=temp1.xuenian;    
   /**************************************************有很多就不逐条往下写了******************************************************/

     /*判断是否为null*/
     if(gjpay is null) then 
       gjpay :=0.00;
       end if;
       
      if(dfpay is null) then 
       dfpay :=0.00;
       end if;
       
      if(shpay is null) then 
       shpay :=0.00;
       end if; 
           
      if(xxpay is null) then 
       xxpay :=0.00;
       end if;
     /*求和*/  
     hjpay :=  gjpay + dfpay + shpay + xxpay;

/****************************************突然想起来在公司做报表,一帮人讨论小学问题,哪个是除数,哪个是被除数,趁现在记着,把那个存储过程拿过来记录下,只是记录下求商是怎么求的:

      if (real_peole!=0) then 
          peopay = real_pay/real_peole;
          end if;   

1、判断是否为null,使用is null

2、等于使用 :=

3、if一定要有结束语:end if;  如果需要else,则使用elsif() then ,看清楚,是elsif

 

**********************************************************************************************/

 


     /*插入数据,字段就自己写啦*/
      insert into CCC
      (id,--------------------------------------------------------)
     values(sys_guid(),username,nation,sex,birthdate,nature,departname,regionname,temp1.preidcard,phase,temp1.xuenian,getdate(),gjpay,shpay,dfpay,xxpay,hjpay,schstuid,schstucode) RETURNING ID INTO  stuid;

/*********

RETURNING  ID 可以将新增的id赋值一个变量

还有就是这个是使用达梦数据库做的报表,主键是uuid,并不自增,所以需要使用sys_guid()每次给id插入值。对了,如果是日期,可以使用getdate()

******************/      

/**这就是在for循环中定义的一个新游标,随便看啦*/
      /*在for循环中定义一个新的游标*/
     open cur5 for select sp.pre_id_card as idcard ,ab.zat_xuenian as xuenian,te.zat_name as zatname,te.id 
     as zatid,te.zat_type as zattype,te.zat_classification_name as zatclassname,ab.batch_number as batchnumber,
     ap.AMOUNT as amountpay
    from AAAsp inner join BBB ap on sp.pre_id_card = ap.zpre_id_card 
    inner join CCCC te on ap.fd_id = te.id left join  DDD sd on sp.school_id = sd.id
    inner join EEEE on te.id = ab.fd_id where sp.pre_id_card = temp1.preidcard;
    
  loop    
        fetch cur5 into idcard,xuenian,zatname,zatid,zattype,zatclassname,batchnumber,amountpay;
        exit when cur5%notfound;   
        /*新增到子表*/
        insert into zn_report_stutype (id,stutype_stuid,stutype_name,stutype_addtime,stutype_typeid,stutype_type,stutype_classname,stutype_batchnumber,stutype_amountpay) values(sys_guid(),stuid,zatname,getdate(),zatid,zattype,zatclassname,batchnumber,amountpay);
  end loop;

 END LOOP;
 

 

 

 


 

你可能感兴趣的:(达梦存储过程)