<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
記錄一下工作中由於業務需要以及系統的資料庫模型變更,導致需要做一下歷史資料遷移的解決辦法
其實就是將一張表中的資料,拆分分別存入B和C中。但是B和C是一對多的關係。
Step1
insert into select
的語法形式來做資料遷移。Step2
Step3
sum、count、group by、case when
摻在一起又那麼複雜又理不清,可咋辦呢?insert into select
的階段,但是因為主鍵並不是自增的,這個主鍵的問題得解決。整理一下問題:
上面這幾個問題一出現,似乎已經沒辦法再使用insert into select
的形式了。
所以只能一個一個迴圈處理。那怎麼迴圈呢?
這個時候就行到了遊標。可是這兩個東西,不管是觸發器,還是遊標這個技能都已經封存已久,一點不記得了。所以重新學習一下
學習參考了一下這個文章。我覺得寫的還是蠻細緻的
下面是我最終寫完的儲存過程。用了遊標的巢狀
# --------------------------歷史資料遷移---------------------- # 刪除儲存過程 drop procedure if exists convertHistory; # 建立一個儲存過程 create procedure convertHistory() begin # 定義一個主鍵 declare outerId bigint default (select min(RESOURCE_ID) from mkt_resource_conf); # 定義查詢插入的列 declare caseName varchar(32); declare gradeId varchar(32); declare flowGrade bigint(10); declare allocateNum bigint(10); declare province varchar(8); declare flowUnit varchar(4); # 是否完成 declare done int default false; # 建立遊標 declare orignData cursor for select CASE_NAME, FLOW_GRADE, GRADE_ID, QUANTITY, BUSI_REG_PROVINCE_CODE, FLOW_UNIT from prd_flow_info where BUSI_REG_PROVINCE_CODE = '100'; # 指定遊標迴圈結束時的返回值 declare continue HANDLER FOR not found set done = true; # 把初始值ID減一個數目 set outerId = outerId - 100; # 先把之前遷移的刪掉 delete from mkt_resource_conf where REMARK = '歷史資料割接'; # 刪掉之前的 delete from mkt_resource_store_conf where REMARK = '歷史資料割接'; # 開啟遊標 open orignData; fetch orignData into caseName,flowGrade,gradeId,allocateNum,province,flowUnit; while (not done) do # 具體的業務邏輯 # 查詢的都是設定項,那麼插入到設定表 # 設定項需要查詢一下該設定的總量 select sum(QUANTITY) from prd_flow_info where FLOW_GRADE = flowGrade and BUSI_REG_PROVINCE_CODE = '99' into allocateNum; # 1、2G 的流量直接做轉換,轉為MB if flowUnit = 'G' then set flowGrade = flowGrade * 1024; end if; insert into mkt_resource_conf values (outerId, caseName, gradeId, flowGrade, allocateNum, allocateNum, 1, '沒什麼說明', 'system', 'system', sysdate(), 'system', 'system', sysdate(), '1', '歷史資料割接'); # 查詢門店的設定,並且插入到門店的設定資訊表 # 這裡就要寫一個巢狀的遊標了 begin # 定義一個設定表的ID declare storeConfId bigint default (select min(STORE_CONF_ID) from mkt_resource_store_conf); declare storeCode varchar(32); declare alloNum bigint(10); declare usedNum bigint(10); declare storeDone int default false; declare storeName varchar(128); # 定義遊標 declare storeData cursor for select store_code,QUANTITY,USE_NUM from prd_flow_info where GRADE_ID = gradeId and BUSI_REG_PROVINCE_CODE = '99'; declare continue HANDLER FOR not found set storeDone = true; # select gradeId; set storeConfId = storeConfId - 100; # 開始遊標了 open storeData; fetch storeData into storeCode,alloNum,usedNum; while (not storeDone) do # 從表裡查一下storeName,沒有就沒轍了 select STORE_NAME from mkt_resource_store_conf where STORE_CODE = storeCode limit 1 into storeName; # 開始儲存到門店設定表 insert into `mkt_resource_store_conf` (`store_conf_id`, `resource_id`, `store_code`, `STORE_NAME`, `allocated_res_num`, `used_res_num`, `create_id`, `create_name`, `create_time`, `update_id`, `update_name`, `update_time`, `state`, `remark`) values (storeConfId, outerId, storeCode, storeName, alloNum, usedNum, 'system', 'system', sysdate(), 'system', 'system', sysdate(), 1, '歷史資料割接'); commit ; # ID -1 set storeConfId = storeConfId - 1; fetch storeData into storeCode,alloNum,usedNum; end while; # 重置變數 set storeDone = false; # 關閉內層遊標 close storeData; end; # 把初始值ID減一 set outerId = outerId - 1; fetch orignData into caseName,flowGrade,gradeId,allocateNum,province,flowUnit; end while; # 關閉遊標 close orignData; SELECT * FROM mkt_resource_conf where REMARK = '歷史資料割接'; SELECT * FROM mkt_resource_store_conf where REMARK = '歷史資料割接'; end; call convertHistory();
沒開始的時候覺得會很難,但是真的邊學邊寫的時候,心情就會逐漸轉變。萬事開頭難說的不錯,一旦開始獲得正向反饋,問題也就慢慢的迎刃而解了。
其實這個寫的並不複雜,只是程式碼比較長。
總結一下:
declare procedure
declare 遊標名 cursor for (select 語句)
open 遊標名
關閉遊標close 遊標名
fetch 遊標名 into 事先定義的變數
來獲得每一條資料(有點像ES6的generator,走一步踢一腳)select xxx into 變數
和 set xxx = 變數值
總的來說掌握基本語法,或者看一眼別人的格式,就可以模仿出來了。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45