1. 程式人生 > >動態SQL 和 巢狀遊標的使用例項

動態SQL 和 巢狀遊標的使用例項

mysql動態執行sql,這邊重點程式碼是:


set f_sql=CONCAT('rename table cw_computer_resulttest to cw_computer_result',f_last,';');
set @ms=f_sql; 
PREPARE stmt1 FROM @ms;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1 ;
其中@ms是系統變數,不用declare,這是重點

下面是寫的 全部儲存過程:(本例中還給出了巢狀cursor的應用)

drop PROCEDURE IF EXISTS  cw_year1_deal;

delimiter $$
create PROCEDURE cw_year1_deal()
BEGIN
 
DECLARE f_date VARCHAR(20);
DECLARE f_month VARCHAR(20);
DECLARE f_last VARCHAR(20);
DECLARE DONE INT;
DECLARE I int DEFAULT 0;
DECLARE f_sql VARCHAR(200);
 
DECLARE d_cursor CURSOR FOR select date from tb_date where date>='2016-01-11' ;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET DONE = 1;
 
set f_last='201601';
set f_month='201601';
 
START TRANSACTION;
OPEN d_cursor;
READ_LOOP :LOOP
FETCH d_cursor INTO f_date;
 
 
IF DONE THEN
LEAVE READ_LOOP;
END IF;
set f_last=f_month;
set f_month =CONCAT(SUBSTR(f_date FROM 1 FOR 4),SUBSTR(f_date FROM 6 FOR 2));
if f_last<>f_month THEN
 
 
-- SET cal1=CONCAT(cal1," ","AND OPEDOC_ID = ","'",DoctorId,"'");
set f_sql=CONCAT('rename table cw_computer_resulttest to cw_computer_result',f_last,';');
set @ms=f_sql; 
PREPARE stmt1 FROM @ms;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1 ;
 
 
DROP TABLE IF EXISTS `cw_computer_result`;
CREATE TABLE `cw_computer_result` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `date` date DEFAULT NULL,
  `bianhao` varchar(20) DEFAULT NULL,
  `licairenbh` varchar(500) DEFAULT NULL,
  `licairen` varchar(200) DEFAULT NULL,
  `SCHEDULE_ID` varchar(32)  COMMENT '主鍵',
  `jiekuandanhao` varchar(50) DEFAULT '0' COMMENT '借款ID',
  `dangqistarttime` datetime DEFAULT NULL COMMENT '每期開始計時時間',
  `dangqiyhtime` datetime DEFAULT NULL COMMENT '預計還款時間',
  `dangqishtime` varchar(19)  DEFAULT '',
  `jiekuanhetongrfl` decimal(18,8) DEFAULT NULL,
  `jiekuanhetongts` int(11) DEFAULT '0' COMMENT '每期天數',
  `fangkuanje` decimal(21,2) DEFAULT NULL,
  `dangqije` decimal(20,2) DEFAULT '0.00' COMMENT '預還本金',
  `jiekuanfuwufeilx` decimal(20,2) DEFAULT '0.00' COMMENT '預還利息',
  `jiekuangudingfy` varchar(10)  DEFAULT '',
  `jiekuanzjzyqfy` decimal(20,8) DEFAULT '0.00' COMMENT '借款-資金佔用期費用',
  `userid` varchar(32) DEFAULT NULL COMMENT '使用者ID',
  `username` varchar(255) DEFAULT NULL COMMENT '借款客戶姓名',
  `jiekuanhetongje` decimal(20,2) DEFAULT NULL COMMENT '借款總金額',
  `fankuandate` datetime DEFAULT NULL COMMENT '借款成功時間',
  `jiekuanyhdate` datetime DEFAULT NULL COMMENT '最後還款時間',
  `licaibenjin` int(11) DEFAULT NULL,
  `zijinduanrfl` varchar(200) DEFAULT NULL,
  `zijinduanstarttime` date DEFAULT NULL,
  `zijinduanendtime` date DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `date_index` (`date`),
  KEY `SCHEDULE_ID` (`SCHEDULE_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
 
end if;
 
-- select f_month;
call cw_deal(f_date);
 
 
SET I=I+1;
IF I%10000=0
THEN
SELECT I;
COMMIT;
START TRANSACTION;
END IF;
 
END LOOP READ_LOOP;
COMMIT;
CLOSE d_cursor;
 
END $$
delimiter ;

引用的儲存過程程式碼:

drop PROCEDURE IF EXISTS  cw_deal;

delimiter $$

create PROCEDURE cw_deal(IN indate varchar(20))
BEGIN
 
DECLARE f_date VARCHAR(20);
DECLARE I int DEFAULT 0;
DECLARE f_licairen VARCHAR(60);
DECLARE f_schedule_id varchar(32);
DECLARE f_jiekuandanghao varchar(50);
DECLARE f_dangqistarttime datetime;
DECLARE f_dangqiyhtime datetime;
DECLARE f_dangqishtime varchar(19);
DECLARE f_jiekuanhetongrfl decimal(18,8);
DECLARE f_jiekuanhetongts  int(11);
DECLARE f_fangkuanje decimal(21,2);
DECLARE f_dangqije decimal(20,2);
DECLARE f_jiekuanfuwulx decimal(20,2);
DECLARE f_jiekuangudingfy varchar(10);
 
DECLARE f_userid varchar(32);
DECLARE f_username varchar(255);
DECLARE f_jiekuanhetongje  decimal(20,2);
DECLARE f_jiekuanhetongksr datetime;
DECLARE f_jiekuanhetongyhr datetime;
 
DECLARE f_zijinduanje int(11);
DECLARE f_zijinduanfl varchar(200);
DECLARE f_zijinduanstarttime date;
DECLARE f_zijinduanendtime date;
DECLARE f_bianhao varchar(20);
DECLARE f_licairenbh varchar(100);
 
DECLARE f_fkje  decimal(20,2);
DECLARE f_fkje2  decimal(20,2);
DECLARE f_lcbj  decimal(20,2);
DECLARE f_ziyou  decimal(20,2);
DECLARE flag INT;
DECLARE DONE INT;
 
DECLARE dcheck_cursor CURSOR FOR select bianhao,licairenbh,licairen,licaibenjin,zijinduanrfl,zijinduanstarttime,zijinduanendtime from temp_datecheck_20170122 where `date`=indate ORDER BY zijinduanrfl desc;
 
 
DECLARE cw_cursor CURSOR FOR select SCHEDULE_ID,jiekuandanhao,dangqistarttime,dangqiyhtime,dangqishtime,jiekuanhetongrfl,jiekuanhetongts,fangkuanje,dangqije,jiekuanfuwufeilx,jiekuangudingfy,userid,username,jiekuanhetongje,  fankuandate ,jiekuanyhdate from tmp_detail 
where  is_deal =0 ;
   
DECLARE CONTINUE HANDLER FOR NOT FOUND SET DONE = 1;
 
DROP temporary TABLE IF EXISTS `tmp_detail`;
CREATE  temporary TABLE `tmp_detail` (
 `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `SCHEDULE_ID` varchar(32) NOT NULL COMMENT '主鍵',
  `jiekuandanhao` varchar(50) DEFAULT '0' COMMENT '借款ID',
  `dangqistarttime` datetime DEFAULT NULL COMMENT '每期開始計時時間',
  `dangqiyhtime` datetime DEFAULT NULL COMMENT '預計還款時間',
  `dangqishtime` varchar(19) NOT NULL DEFAULT '',
  `jiekuanhetongrfl` decimal(18,8) DEFAULT NULL,
  `jiekuanhetongts` int(11) DEFAULT '0' COMMENT '每期天數',
  `fangkuanje` decimal(21,2) DEFAULT NULL,
  `dangqije` decimal(20,2) DEFAULT '0.00' COMMENT '預還本金',
  `jiekuanfuwufeilx` decimal(20,2) DEFAULT '0.00' COMMENT '預還利息',
  `jiekuangudingfy` varchar(10) NOT NULL DEFAULT '',
  `userid` varchar(32) NOT NULL COMMENT '使用者ID',
  `username` varchar(255) DEFAULT NULL COMMENT '借款客戶姓名',
  `jiekuanhetongje` decimal(20,2) DEFAULT NULL COMMENT '借款總金額',
  `fankuandate` datetime DEFAULT NULL COMMENT '借款成功時間',
  `jiekuanyhdate` datetime DEFAULT NULL COMMENT '最後還款時間',
   is_deal int(1) NOT NULL DEFAULT '0',
   PRIMARY KEY (`id`),
  KEY `SCHEDULE_IDindex` (`SCHEDULE_ID`),
  KEY `is_dealindex` (`is_deal`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
insert into tmp_detail(SCHEDULE_ID,jiekuandanhao,dangqistarttime,dangqiyhtime,dangqishtime,jiekuanhetongrfl,jiekuanhetongts,fangkuanje,dangqije,jiekuanfuwufeilx,jiekuangudingfy,userid,username,jiekuanhetongje,  fankuandate ,jiekuanyhdate) 
select SCHEDULE_ID,jiekuandanhao,dangqistarttime,dangqiyhtime,dangqishtime,jiekuanhetongrfl,jiekuanhetongts,fangkuanje,dangqije,jiekuanfuwufeilx,jiekuangudingfy,userid,username,jiekuanhetongje,  fankuandate ,jiekuanyhdate from temp_cw_result_20170119 
where `date`=indate; 
 
SET flag=1;
SET f_fkje=0;
SET f_fkje2=0;
START TRANSACTION;
OPEN dcheck_cursor;
READ_LOOP :LOOP
FETCH dcheck_cursor INTO f_bianhao,f_licairenbh,f_licairen,f_zijinduanje,f_zijinduanfl,f_zijinduanstarttime,f_zijinduanendtime;
set f_lcbj=f_zijinduanje;
 
 
 
IF DONE THEN
 
set f_ziyou=0;
select sum(fangkuanje) into f_ziyou from tmp_detail where  is_deal =0;
INSERT INTO cw_computer_result(bianhao,licairenbh,date,licairen,SCHEDULE_ID,jiekuandanhao,dangqistarttime,dangqiyhtime,dangqishtime,jiekuanhetongrfl,jiekuanhetongts,fangkuanje,dangqije,jiekuanfuwufeilx,jiekuangudingfy,jiekuanzjzyqfy,userid,username,jiekuanhetongje,fankuandate,jiekuanyhdate,licaibenjin,zijinduanrfl,zijinduanstarttime,zijinduanendtime)
select 'bh_999','ziyou_999',indate,'自由資金',SCHEDULE_ID,jiekuandanhao,dangqistarttime,dangqiyhtime,dangqishtime,jiekuanhetongrfl,jiekuanhetongts,fangkuanje,dangqije,jiekuanfuwufeilx,jiekuangudingfy,0,userid,username,jiekuanhetongje,  fankuandate ,jiekuanyhdate,f_ziyou,0.0,indate,indate from tmp_detail 
where  is_deal =0;
    
LEAVE READ_LOOP;
 
END IF;
 
 
OPEN cw_cursor;
inner_loop:LOOP
 
    FETCH cw_cursor INTO f_schedule_id,f_jiekuandanghao,f_dangqistarttime,f_dangqiyhtime,f_dangqishtime,f_jiekuanhetongrfl,f_jiekuanhetongts,f_fangkuanje,f_dangqije,f_jiekuanfuwulx,f_jiekuangudingfy,f_userid,f_username,f_jiekuanhetongje,f_jiekuanhetongksr,f_jiekuanhetongyhr; 
 
    IF DONE = 1 THEN
 
      IF flag =0 
       THEN
       INSERT INTO cw_computer_result(bianhao,licairenbh,date,licairen,licaibenjin,zijinduanrfl,zijinduanstarttime,zijinduanendtime)
       select f_bianhao,f_licairenbh,indate,f_licairen,f_zijinduanje,f_zijinduanfl,f_zijinduanstarttime,f_zijinduanendtime;
      end if;
       LEAVE inner_loop;
 
             
    end IF;
     
 
    SET flag=0;
     
    IF f_fkje2>0
    THEN
            set f_lcbj=f_lcbj-f_fkje2;
            IF f_lcbj>0
            THEN
                INSERT INTO cw_computer_result(bianhao,licairenbh,date,licairen,SCHEDULE_ID,jiekuandanhao,dangqistarttime,dangqiyhtime,dangqishtime,jiekuanhetongrfl,jiekuanhetongts,fangkuanje,dangqije,jiekuanfuwufeilx,jiekuangudingfy,jiekuanzjzyqfy,userid,username,jiekuanhetongje,fankuandate,jiekuanyhdate,licaibenjin,zijinduanrfl,zijinduanstarttime,zijinduanendtime)
                select f_bianhao,f_licairenbh,indate,f_licairen,f_schedule_id,f_jiekuandanghao,f_dangqistarttime,f_dangqiyhtime,f_dangqishtime,f_jiekuanhetongrfl,f_jiekuanhetongts,f_fkje2,f_dangqije,f_jiekuanfuwulx,f_jiekuangudingfy,f_fkje2*f_zijinduanfl,f_userid,f_username,f_jiekuanhetongje,f_jiekuanhetongksr,f_jiekuanhetongyhr,f_zijinduanje,f_zijinduanfl,f_zijinduanstarttime,f_zijinduanendtime;
                update tmp_detail set is_deal=1 where SCHEDULE_ID=f_schedule_id;
            
                SET f_fkje2=0;
 
            END IF;
            IF f_lcbj<=0
            THEN
               
              set f_fkje = f_fkje2+f_lcbj;
              set f_fkje2 = -f_lcbj;
              INSERT INTO cw_computer_result(bianhao,licairenbh,date,licairen,SCHEDULE_ID,jiekuandanhao,dangqistarttime,dangqiyhtime,dangqishtime,jiekuanhetongrfl,jiekuanhetongts,fangkuanje,dangqije,jiekuanfuwufeilx,jiekuangudingfy,jiekuanzjzyqfy,userid,username,jiekuanhetongje,fankuandate,jiekuanyhdate,licaibenjin,zijinduanrfl,zijinduanstarttime,zijinduanendtime)
              select f_bianhao,f_licairenbh,indate,f_licairen,f_schedule_id,f_jiekuandanghao,f_dangqistarttime,f_dangqiyhtime,f_dangqishtime,f_jiekuanhetongrfl,f_jiekuanhetongts,f_fkje,f_dangqije,f_jiekuanfuwulx,f_jiekuangudingfy,f_fkje*f_zijinduanfl,f_userid,f_username,f_jiekuanhetongje,f_jiekuanhetongksr,f_jiekuanhetongyhr,f_zijinduanje,f_zijinduanfl,f_zijinduanstarttime,f_zijinduanendtime;
              set DONE =1;
              SET flag=1;
            END IF;
 
             
    else
    set f_lcbj=f_lcbj-f_fangkuanje; 
    IF f_lcbj>0
    THEN
            INSERT INTO cw_computer_result(bianhao,licairenbh,date,licairen,SCHEDULE_ID,jiekuandanhao,dangqistarttime,dangqiyhtime,dangqishtime,jiekuanhetongrfl,jiekuanhetongts,fangkuanje,dangqije,jiekuanfuwufeilx,jiekuangudingfy,jiekuanzjzyqfy,userid,username,jiekuanhetongje,fankuandate,jiekuanyhdate,licaibenjin,zijinduanrfl,zijinduanstarttime,zijinduanendtime)
            select f_bianhao,f_licairenbh,indate,f_licairen,f_schedule_id,f_jiekuandanghao,f_dangqistarttime,f_dangqiyhtime,f_dangqishtime,f_jiekuanhetongrfl,f_jiekuanhetongts,f_fangkuanje,f_dangqije,f_jiekuanfuwulx,f_jiekuangudingfy,f_fangkuanje*f_zijinduanfl,f_userid,f_username,f_jiekuanhetongje,f_jiekuanhetongksr,f_jiekuanhetongyhr,f_zijinduanje,f_zijinduanfl,f_zijinduanstarttime,f_zijinduanendtime;
            update tmp_detail set is_deal=1 where SCHEDULE_ID=f_schedule_id;
    END IF;
    IF f_lcbj<=0
    THEN
            set f_fkje = f_fangkuanje+f_lcbj;
            set f_fkje2 = -f_lcbj;
            INSERT INTO cw_computer_result(bianhao,licairenbh,date,licairen,SCHEDULE_ID,jiekuandanhao,dangqistarttime,dangqiyhtime,dangqishtime,jiekuanhetongrfl,jiekuanhetongts,fangkuanje,dangqije,jiekuanfuwufeilx,jiekuangudingfy,jiekuanzjzyqfy,userid,username,jiekuanhetongje,fankuandate,jiekuanyhdate,licaibenjin,zijinduanrfl,zijinduanstarttime,zijinduanendtime)
            select f_bianhao,f_licairenbh,indate,f_licairen,f_schedule_id,f_jiekuandanghao,f_dangqistarttime,f_dangqiyhtime,f_dangqishtime,f_jiekuanhetongrfl,f_jiekuanhetongts,f_fkje,f_dangqije,f_jiekuanfuwulx,f_jiekuangudingfy,f_fkje*f_zijinduanfl,f_userid,f_username,f_jiekuanhetongje,f_jiekuanhetongksr,f_jiekuanhetongyhr,f_zijinduanje,f_zijinduanfl,f_zijinduanstarttime,f_zijinduanendtime;
            set DONE =1;
            SET flag=1;
    END IF;
 
    END IF;
 
   
  end LOOP inner_loop;
  CLOSE cw_cursor; 
 

SET DONE=0;
 

SET I=I+1;
IF I%10000=0
THEN
SELECT I;
COMMIT;
START TRANSACTION;
END IF;
 
END LOOP READ_LOOP;
COMMIT;
CLOSE dcheck_cursor;
 
END $$
delimiter ;
 

相關推薦

動態SQL 遊標的使用例項

mysql動態執行sql,這邊重點程式碼是: set f_sql=CONCAT('rename table cw_computer_resulttest to cw_computer_result',f_last,';'); set @ms=f_sql;  PREPARE

儲存過程+遊標結合使用的例項

上週接了一個新任務——寫儲存過程,我以前可不知道這玩意怎麼寫,上週用了一個星期琢磨了一下然後終於給弄出來了,資料庫用的是Oracle,需求是說要每天定時去處理大批量的資料,用儲存過程處理好了存在中間表裡面,然後專案平臺就直接取中間表的資料就OK,因為目前而言我們是以XX平臺

SQL語言進行復雜查詢:對各表中的資料進行不同條件的連線查詢查詢: 1)查詢每個學生及其選課情況; 2)查詢每門課的間接先修課

對各表中的資料進行不同條件的連線查詢和巢狀查詢: 1)查詢每個學生及其選課情況; 2)查詢每門課的間接先修課 3)將STUDENT,SC進行右連線 4)查詢有不及格的學生姓名和所在系 5)查詢所有成績為優秀(大於90分)的學生姓名 6)查詢既選修了2號課程又選修了3號課程的

Oracle的動態SQL動態遊標舉例

--動態sql和動態遊標declare cnt number; begin execute immediate 'select count(*) from emp' into cnt; dbms_output.put_line(cnt);end;--建立儲存過

Go基礎系列:structstruct

struct struct定義結構,結構由欄位(field)組成,每個field都有所屬資料型別,在一個struct中,每個欄位名都必須唯一。 說白了就是拿來儲存資料的,只不過可自定義化的程度很高,用法很靈活,Go中不少功能依賴於結構,就這樣一個角色。 Go中不支援面向物件,面向物件中描述事物的類的重擔

Java框架-mybatis連線池、動態sql多表查詢

1. mybatis連線池 通過SqlMapConfig.xml設定dataSource type實現連線池的配置 1.1 dataSource標籤type屬性值含義 type=”POOLED”: MyBatis 會建立 PooledDataSource 例項

Python_從零開始學習_(21) 函式的返回值呼叫

1.  函式的返回值 在程式開發中,  有時候,  會希望 一個函式執行結束後,  告訴呼叫者一個結果,  以便呼叫者針對具體的結果做後續的處理 返回值 是函式 完成工作 後,  最後 給呼叫者的 一個結果

動態規劃——矩形

題目連結:矩形巢狀 矩形巢狀 時間限制:3000 ms  |  記憶體限制:65535 KB 難度:4 輸入 第一行是一個正正數N(0<N<10),表示測試資料組數, 每組測試資料的第一行是一個正正數n,表示該組測試資料中含

C#程式設計基礎第六課:C#中三元運算子的初級使用

知識點:三元運算子的使用。 1、三元運算子 三元運算子的初級使用: 符號: ?: 舉例:int c=bool ? a : b 當bool=true,c=表示式a,當bool=false,c=表示式b。 三元運算子?:是 if~else 語句的簡寫形式 書寫格式

CSS之分組選擇器選擇器

分組選擇器, 將一個樣式應用於多個類,或者標籤啥的 每個選擇器用逗號隔開 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>菜鳥教程(runoob.c

程式筆記:MyBatis 動態SQL模糊查詢

之前用mybatis在xml中寫sql語句用到過<if>標籤,但是不知道這是動態SQL(尷尬),最近空閒整理一下常用的動態SQL。好記性不如爛筆頭 以圖 t_user 表為例: 1. if 語句 根據 userNo 和 name 來查詢資料。如果userNo為空

Python List資料去重List資料去重

單個list中資料去重 例如: 去除a中重複的資料 ‘b’ a = ['a','b','c','b'] b = list(set(a)) print(b) 輸出結果為: ['a', 'c', 'b']    巢狀list中去除相同list資料

動態sql 重定向

<select id="findByTiaoJian" parameterType="cn.zzsxt.furniture.vo.TiaojianVo" resultType="cn.zzsxt.furniture.vo.MoneyUserVo"> SELEC

css關於position定位元素並列顯示的小發現

一、fixed定位 1、元素並列 <!-- html程式碼 --> <div class="container"> <div class="fixed-one"> <el-button type="primar

python 中高階函式函式

 1、高階函式:變數可以指向函式;                         函式的引數可以接收變數;      

vue——46-webpack打包vue-路由 路由

一、路由 main.js 中 1.引入 vue-router 包 安裝命名:cnpm i vue-router -s import Vue from 'vue'; import app from

Python List資料去重List資料去重

單個list中資料去重 例如: 去除a中重複的資料 ‘b’ a = ['a','b','c','b'] b = list(set(a)) print(b) 輸出結果為: ['a', 'c', 'b']  巢狀list中去除相同list資料 例如: 去除

elasticsearch複合資料型別——陣列,物件

在ElasticSearch中,使用JSON結構來儲存資料,一個Key/Value對是JSON的一個欄位,而Value可以是基礎資料型別,也可以是陣列,文件(也叫物件),或文件陣列,因此,每個JSON文件都內在地具有層次結構。複合資料型別是指陣列型別,物件型別和巢狀型別,各個

CSS 分組 選擇器

Grouping Selectors在樣式表中有很多具有相同樣式的元素。h1{color:green;}h2{color:green;}p{color:green;}   為了儘量減少程式碼,你可以使用

CSS選擇器的宣告

前言   在利用CSS選擇器控制HTML標記時,除了每個選擇器可以一次宣告多個,選擇器本身也可以同時宣告多個。 集體宣告   在宣告各種CSS選擇器時,如果某些選擇器的風格是完全相同或部分相同,這時便可以利用集體宣告的方法,將風格相同的CSS選擇器同時