主頁(yè) > 知識(shí)庫(kù) > mysql存儲(chǔ)過(guò)程基礎(chǔ)之遍歷多表記錄后插入第三方表中詳解

mysql存儲(chǔ)過(guò)程基礎(chǔ)之遍歷多表記錄后插入第三方表中詳解

熱門(mén)標(biāo)簽:合肥營(yíng)銷(xiāo)外呼系統(tǒng)收費(fèi) 外呼系統(tǒng)從哪買(mǎi) 深圳 商家地圖標(biāo)注哪個(gè)好 地圖標(biāo)注賺錢(qián)真假 陜西400電話如何申請(qǐng) 德惠市地圖標(biāo)注 承德電腦地圖標(biāo)注 遵義地圖標(biāo)注app

前言

自從學(xué)過(guò)存儲(chǔ)過(guò)程后,就再也沒(méi)有碰過(guò)存儲(chǔ)過(guò)程,這是畢業(yè)后寫(xiě)的第一個(gè)存儲(chǔ)過(guò)程。

因?yàn)轫?xiàng)目里設(shè)備的種類(lèi)比較多,分別存在不同的數(shù)據(jù)表中,java中對(duì)應(yīng)不同的java bean對(duì)象,想要統(tǒng)一管理有點(diǎn)困難。最近正好要開(kāi)發(fā)一個(gè)功能模塊,就是需要統(tǒng)一對(duì)設(shè)備進(jìn)行處理,想著為了以后都能方便的統(tǒng)一處理各種設(shè)備,就從現(xiàn)在開(kāi)始設(shè)計(jì)一套方案管理起這些項(xiàng)目吧。

如何統(tǒng)一管理呢?

如果從項(xiàng)目一開(kāi)始設(shè)計(jì)的時(shí)候就能考慮到項(xiàng)目會(huì)發(fā)展成今天這樣,當(dāng)初就應(yīng)該抽取公共父類(lèi),對(duì)所有類(lèi)型的所有公共字段進(jìn)行統(tǒng)一抽取,這樣無(wú)論添加多少模塊,需要對(duì)設(shè)備進(jìn)行操作的時(shí)候,都只需要關(guān)聯(lián)統(tǒng)一父類(lèi),數(shù)據(jù)間的關(guān)系就清晰多了,開(kāi)發(fā)也會(huì)簡(jiǎn)單很多。

那么現(xiàn)在抽取呢?還來(lái)得及嗎?

應(yīng)該是來(lái)不及了,因?yàn)轫?xiàng)目已經(jīng)發(fā)展壯大了,已經(jīng)開(kāi)發(fā)了很多功能,一旦現(xiàn)在抽取,需要修改的地方就太多了,沒(méi)有那么多時(shí)間來(lái)完成這項(xiàng)工作。

那還有別的方法嗎?

我也不曉得人家的項(xiàng)目是如何處理這樣的問(wèn)題的,但是就我思考,可以學(xué)習(xí)下注冊(cè)表的思想,電腦中裝有很多很多的軟件,各個(gè)軟件也是各部相同,但是每個(gè)軟件安裝的時(shí)候都會(huì)寫(xiě)一條信息到注冊(cè)表中,方便電腦對(duì)軟件的集中管理。是不是感覺(jué)這個(gè)方案還不錯(cuò)

項(xiàng)目里需要做的就是:1、添加一個(gè)注冊(cè)表對(duì)象;2、添加設(shè)備的時(shí)候,都要把公共的很重要的信息寫(xiě)到注冊(cè)表中,更新和刪除也要同步操作注冊(cè)表;3、一個(gè)很重要的工作,曾經(jīng)已經(jīng)添加到項(xiàng)目中的設(shè)備信息要怎么辦呢?他們都沒(méi)有注冊(cè)信息,難不成要放棄對(duì)他們的管理?或者是刪除重新添加?不?。。≈恍枰獙?xiě)一個(gè)存儲(chǔ)過(guò)程,遍歷表里已經(jīng)存在的設(shè)備信息,將其插入注冊(cè)表中。

好了,人生第一個(gè)存儲(chǔ)過(guò)程就這樣拉開(kāi)序幕了,下面要亮出我的第一個(gè)存儲(chǔ)過(guò)程了:

寫(xiě)的過(guò)程中呢肯定是有遇到各種問(wèn)題的

首先,不記得有哪些循環(huán)語(yǔ)句了,下面科普一下

第一種 while 循環(huán)

while循環(huán)語(yǔ)法:

while 條件 DO

            循環(huán)體;

end while;

第二種 loop 循環(huán)

loop 循環(huán)語(yǔ)法:

loop_name:loop

        if 條件 THEN -- 滿足條件時(shí)離開(kāi)循環(huán)

                leave loop_name;  -- 和 break 差不多都是結(jié)束訓(xùn)話

        end if;

end loop;

第三種 repeat 循環(huán)

repeat 循環(huán)語(yǔ)法

repeat

    循環(huán)體

until 條件 end repeat;

 其次,遇到一個(gè)問(wèn)題,循環(huán)的時(shí)候,最后一條記錄總是被執(zhí)行了兩次。

一開(kāi)始使用的是repeat循環(huán)體,以為是因?yàn)檫€沒(méi)有判斷就執(zhí)行了,肯定是不對(duì)的,應(yīng)該先判斷,再執(zhí)行,以為換一種循環(huán)語(yǔ)句便可以了

原先是這樣的

后來(lái)改成了這樣

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

最后貼上代碼吧,方便以后自己復(fù)制粘貼,不是有句話叫 ”天下代碼一大抄,看你會(huì)不會(huì)抄“ ,其實(shí)開(kāi)發(fā)的日常也就是復(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

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

您可能感興趣的文章:
  • MySQL中Update、select聯(lián)用操作單表、多表,及視圖與臨時(shí)表的區(qū)別
  • MySQL在多表上創(chuàng)建視圖方法
  • mysql delete 多表連接刪除功能
  • MySQL多表鏈接查詢核心優(yōu)化
  • 淺談mysql中多表不關(guān)聯(lián)查詢的實(shí)現(xiàn)方法
  • MySQL多表數(shù)據(jù)記錄查詢?cè)斀?/li>
  • MySQL中基本的多表連接查詢教程
  • mysql多表連接查詢實(shí)例講解

標(biāo)簽:商丘 揚(yáng)州 巴中 新余 貴州 南陽(yáng) 贛州 三門(mén)峽

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《mysql存儲(chǔ)過(guò)程基礎(chǔ)之遍歷多表記錄后插入第三方表中詳解》,本文關(guān)鍵詞  mysql,存儲(chǔ),過(guò)程,基礎(chǔ),之,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《mysql存儲(chǔ)過(guò)程基礎(chǔ)之遍歷多表記錄后插入第三方表中詳解》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于mysql存儲(chǔ)過(guò)程基礎(chǔ)之遍歷多表記錄后插入第三方表中詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章