前言
自從學過存儲過程后,就再也沒有碰過存儲過程,這是畢業(yè)后寫的第一個存儲過程。
因為項目里設備的種類比較多,分別存在不同的數(shù)據(jù)表中,java中對應不同的java bean對象,想要統(tǒng)一管理有點困難。最近正好要開發(fā)一個功能模塊,就是需要統(tǒng)一對設備進行處理,想著為了以后都能方便的統(tǒng)一處理各種設備,就從現(xiàn)在開始設計一套方案管理起這些項目吧。
如何統(tǒng)一管理呢?
如果從項目一開始設計的時候就能考慮到項目會發(fā)展成今天這樣,當初就應該抽取公共父類,對所有類型的所有公共字段進行統(tǒng)一抽取,這樣無論添加多少模塊,需要對設備進行操作的時候,都只需要關聯(lián)統(tǒng)一父類,數(shù)據(jù)間的關系就清晰多了,開發(fā)也會簡單很多。
那么現(xiàn)在抽取呢?還來得及嗎?
應該是來不及了,因為項目已經發(fā)展壯大了,已經開發(fā)了很多功能,一旦現(xiàn)在抽取,需要修改的地方就太多了,沒有那么多時間來完成這項工作。
那還有別的方法嗎?
我也不曉得人家的項目是如何處理這樣的問題的,但是就我思考,可以學習下注冊表的思想,電腦中裝有很多很多的軟件,各個軟件也是各部相同,但是每個軟件安裝的時候都會寫一條信息到注冊表中,方便電腦對軟件的集中管理。是不是感覺這個方案還不錯
項目里需要做的就是:1、添加一個注冊表對象;2、添加設備的時候,都要把公共的很重要的信息寫到注冊表中,更新和刪除也要同步操作注冊表;3、一個很重要的工作,曾經已經添加到項目中的設備信息要怎么辦呢?他們都沒有注冊信息,難不成要放棄對他們的管理?或者是刪除重新添加?不!!!只需要寫一個存儲過程,遍歷表里已經存在的設備信息,將其插入注冊表中。
好了,人生第一個存儲過程就這樣拉開序幕了,下面要亮出我的第一個存儲過程了:

寫的過程中呢肯定是有遇到各種問題的
首先,不記得有哪些循環(huán)語句了,下面科普一下
第一種 while 循環(huán)
while循環(huán)語法:
while 條件 DO
循環(huán)體;
end while;
第二種 loop 循環(huán)
loop 循環(huán)語法:
loop_name:loop
if 條件 THEN -- 滿足條件時離開循環(huán)
leave loop_name; -- 和 break 差不多都是結束訓話
end if;
end loop;
第三種 repeat 循環(huán)
repeat 循環(huán)語法
repeat
循環(huán)體
until 條件 end repeat;
其次,遇到一個問題,循環(huán)的時候,最后一條記錄總是被執(zhí)行了兩次。
一開始使用的是repeat循環(huán)體,以為是因為還沒有判斷就執(zhí)行了,肯定是不對的,應該先判斷,再執(zhí)行,以為換一種循環(huán)語句便可以了
原先是這樣的

后來改成了這樣

看著沒毛病吧,是先判斷后做的,但是結果還是不對,仔細研究了一下,發(fā)現(xiàn),當游標走到最后一行的時候,執(zhí)行insert沒錯,但是這個時候的標記值依然是正常的,會再進入循環(huán)體,這個時候再去fetch下一個游標的時候,就獲取不到了,標記值會發(fā)生改變,但是插入語句依然執(zhí)行了,執(zhí)行后,下一次循環(huán)才不符合條件,跳出的循環(huán),因此,應該是游標下移一行后進行判斷,比如在fetch語句后面加一句if判斷,或者是像下面這樣,先移動游標,再判斷插入

最后貼上代碼吧,方便以后自己復制粘貼,不是有句話叫 ”天下代碼一大抄,看你會不會抄“ ,其實開發(fā)的日常也就是復制粘貼啦
BEGIN
DECLARE dsi_id LONG;
DECLARE dsi_name varchar(300);
DECLARE dsi_areaid LONG;
DECLARE dsi_orgzid LONG;
DECLARE dsi_clazz varchar(300);
declare no_more_departments integer DEFAULT 0;
DECLARE cursor_employee CURSOR FOR
SELECT
dsi.id,
dsi.inputname,
dsi.deviceArea_id,
sd.organization_id,
"DeviceSwitchInfo"
FROM
tip_s_deviceswitchinfo dsi
LEFT JOIN tip_s_systemdeviceinfo sd ON dsi.Device_id = sd.id
UNION SELECT
dsi.id,
dsi.outputname,
dsi.deviceArea_id,
sd.organization_id,
"DeviceSwitchOutPut"
FROM
tip_s_DeviceSwitchOutPut dsi
LEFT JOIN tip_s_systemdeviceinfo sd ON dsi.Device_id = sd.id
UNION SELECT
dsi.id,
dsi.analogname,
dsi.deviceArea_id,
sd.organization_id,
"AnalogInputInfo"
FROM
tip_s_AnalogInputInfo dsi
LEFT JOIN tip_s_systemdeviceinfo sd ON dsi.Device_id = sd.id
UNION SELECT
dsi.id,
dsi.devicename,
dsi.area_id,
sd.organization_id,
"SmartDeviceInfo"
FROM
tip_smart_deviceinfo dsi
LEFT JOIN tip_s_systemdeviceinfo sd ON dsi.deviceid = sd.id;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET no_more_departments = 1;
OPEN cursor_employee;
FETCH cursor_employee INTO dsi_id, dsi_name, dsi_areaid, dsi_orgzid, dsi_clazz;
WHILE !no_more_departments DO
INSERT INTO tip_m_deviceregister (
deviceId, NAME, area_id, orgz_id, deviceClass, active, version
)
VALUES (dsi_id, dsi_name, dsi_areaid, dsi_orgzid, dsi_clazz, 1, 1);
FETCH cursor_employee INTO dsi_id, dsi_name, dsi_areaid, dsi_orgzid, dsi_clazz;
END WHILE;
CLOSE cursor_employee;
END
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
您可能感興趣的文章:- MySQL中Update、select聯(lián)用操作單表、多表,及視圖與臨時表的區(qū)別
- MySQL在多表上創(chuàng)建視圖方法
- mysql delete 多表連接刪除功能
- MySQL多表鏈接查詢核心優(yōu)化
- 淺談mysql中多表不關聯(lián)查詢的實現(xiàn)方法
- MySQL多表數(shù)據(jù)記錄查詢詳解
- MySQL中基本的多表連接查詢教程
- mysql多表連接查詢實例講解