帶參存儲過程+浮標的使用

前段時間接到項目經理的一個需求,要對之前的做的電商平臺的發佈商品的規格寫一個sql語句,調用sql可以實現調用sql對該商品品進行規格補充,

背景:規格數值分兩張表存放,這簡稱key表和value表,用於存放去重之後的具體值,style表存放商品規格的匹配表。表結構如下:
key表

類型
keyid varchar(32)
keyzhi varchar(64)
goodsid bigint

value表

類型
valueid varchar(32)
valuezhi varchar(64)
goodsid bigint

style表

類型
styleid bigint
key1 varchar(32)
value1 varchar(64)
key2 varchar(32)
value2 varchar(64)
goodsid bigint

key表
14bab4d589204114ac9f5941e6480288 顏色 70
b151377d976744a59e4e8dc140fcc2bf 尺寸 70
value表
1d4429a88613484792196bade689773e 小米9SE 14bab4d589204114ac9f5941e6480288 70
2cc77f0e413449de837741c75ff32362 電光紫 b151377d976744a59e4e8dc140fcc2bf 70
4bff49f25b5d11e98fff00163e007b2d HuaWei P30 14bab4d589204114ac9f5941e6480288 70
5b1c03085b5d11e98fff00163e007b2d HuaWei P31 14bab4d589204114ac9f5941e6480288 70
7f5e87a83d414127ad2c1af91123ee51 Nokia6 14bab4d589204114ac9f5941e6480288 70
8dcc5463d56b4237907246268bb29157 騷粉色 b151377d976744a59e4e8dc140fcc2bf 70
話不多說直接上語句,邊寫邊解釋

delimiter $$
//傳入參數,商品id gid BIGINT ,規格名稱 k2value VARCHAR
create procedure proc3(gid BIGINT,k2value VARCHAR(64))
begin
	/*定義變量   declare [名字]  [類型]*/
    declare done int default false;  /* 用於判斷退出循環 */
    declare ky1,ky2 VARCHAR(32);                  /* 用於key表中的兩個id */
    declare kvalue VARCHAR(64);
	declare uid VARCHAR(36);	/* 用於存放所需要的uuid */
	/* 用於存放所需要循環的結果集的遊標   有表數據  騷粉色 電光紫 */
	declare colorlistcursor for select gv.valuezhi from g_goodspropertyvalue gv where gv.goodsid=goodsid and gv.keyid = (SELECT keyid  from g_goodspropertykey  where goodsid = gid and sort = 10);    
	/* not found時,退出循環 */
    declare continue handler for not found set done=true;  
    	/* 給定義的變量賦值  
		1.set ky1 = 9;
		2.select ky1 = 9;
		*/
		SET ky1 = (SELECT keyid  from g_goodspropertykey  where goodsid = gid and sort = 10);
		SET ky2 = (SELECT keyid  from g_goodspropertykey  where goodsid = gid and sort = 20);
    /*打開遊標*/
    open cur1;
	/*對數據進行循環處理
	my_loop是循環的標籤,可以用leave離開循環
	LOOP
	[sql語句塊]
	end loop; 結束循環
	*/
    myloop: LOOP
   		 /*取遊標結果集中的值給kvalue,每次循環取遊標中的下一個,在這裏也就是獲取我們想要得到的規格中一的顏色集合中的每個顏色*/
        fetch colorlist into kvalue;
        /*當遊標沒有數據的時候跳出循環*/
        if done then
            leave myloop;
        end if;
        /* 執行插入操作將數據插入到樣式表 */
		INSERT INTO g_goodsstyles(key1,value1,key2,value2,defaultimg,price,supplyprice,stock,goodsid,businessno) VALUES(ky1,kvalue,ky2,k2value,NULL,NULL,NULL,NULL,gid,NULL);
    end loop;
    /*在這裏順道介紹一uuid,自增id,生成時理論上空間唯一,具體可以去百度,在這裏我需要一個32的且不帶-的uuid,所以我在聲明時定義的時36位的,目的爲了去除4個-*/
		SET uid = UUID();/*這時的uid大致爲578e3ef2-5e9d-11e9-8fff-00163e007b2d。所以我要去除中間4個-,這裏用到replace函數*/
		SET uid = REPLACE(uid,'-','');
		INSERT into g_goodspropertyvalue(valueid,valuezhi,keyid,sort,goodsid) VALUES(uid,k2value,ky2,0,gid);
    close colorlist;
end$$

delimiter ;

代碼上述所示,可以直接拷貝使用,去除註釋在對應地方放入你自己的數據即可。
注意點:創建存儲過程,聲明變量,設置變量,使用變量,設置浮標開啓浮標,開啓循環塊,判斷是否需要跳出循環,關閉循環快,關閉浮標,uuid使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章