動態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基礎系列:struct和巢狀struct
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選擇器同時