MySQL存儲過程 游標 錯誤處理的示例代碼

mysql存儲過程 游標 錯誤處理的示例代碼

--set_account_data?重新生成用戶編號    BEGIN  ??DECLARE?temp_id?INT(8);????????????????????????????????????????/*用戶id*/  ??DECLARE?temp_manager?INT(8);????????????????????????????/*上級id*/  ??DECLARE?temp_accounter_no?VARCHAR(64);????????/*上級編碼*/  ????DECLARE?temp_max_no?VARCHAR(64);????????????????????/*上級的最大下級編碼*/  ????DECLARE?max_no?VARCHAR(64);????????????????????????????????/*編碼*/  ????DECLARE?str1?VARCHAR(64);????????????????????????????????????/*編碼*/  ????DECLARE?temp_no?INT(8);????????????????????????????????????????/*編碼*/  ????DECLARE?temp_level?INT(8);????????????????????????????????/*級次*/  ????DECLARE?state?VARCHAR(30);????????????????????????????????/*錯誤處理監聽變量*/    ????/*定義用戶表游標*/  ????DECLARE?account_cursor?CURSOR?FOR?SELECT?id,manager?FROM?account?ORDER?BY?manager,id;    ????/*定義錯誤處理監聽,用于結束游標循環*/  ????DECLARE?CONTINUE?HANDLER?FOR?1329  ????BEGIN  ????????SET?state?=?'error';  ????END;?    ??OPEN?account_cursor;  ??REPEAT  ????????FETCH?account_cursor?INTO?temp_id,temp_manager;  ????????IF?(temp_id?=?1)?THEN  ????????????UPDATE?account?SET?leaf?=?0,no?=?'01',level?=?1?WHERE?id?=?1;  ????????ELSE  ????????????/*設置上級leaf為0*/  ????????????UPDATE?account?SET?leaf?=?0?WHERE?id?=?temp_manager;  ????????????/*查詢上級編號*/  ????????????SELECT?no?INTO?temp_accounter_no?FROM?account?WHERE?id?=?temp_manager;  ????????????/*設置上級編碼*/  ????????????UPDATE?account?SET?pno?=?temp_accounter_no?WHERE?id?=?temp_id;  ????????????/*查詢上級原有的最大下級編碼*/  ????????????SELECT?MAX(no)?INTO?temp_max_no?FROM?account?WHERE?pno?=?temp_accounter_no;  ????????????/*如果最大下級編碼為空,生成新的編碼,否則把原來的編碼加一*/  ????????????IF?(temp_max_no?IS?NULL)?THEN  ????????????????SET?max_no?=?concat(temp_accounter_no,?'0001');  ????????????ELSE?  ????????????????SET?str1?=?SUBSTR(temp_max_no,LENGTH(temp_max_no)-3,4);  ????????????????SET?temp_no?=?str1;  ????????????????SET?temp_no?=?temp_no?+?1;  ????????????????SET?str1?=?temp_no;  ????????????????IF?(LENGTH(str1)?=?1)?THEN  ????????????????????SET?str1?=?concat('000',?str1);  ????????????????ELSEIF?(LENGTH(str1)?=?2)?THEN  ????????????????????SET?str1?=?concat('00',?str1);  ????????????????ELSEIF?(LENGTH(str1)?=?3)?THEN  ????????????????????SET?str1?=?concat('0',?str1);????????????  ????????????????END?IF;  ????????????????SET?max_no?=?concat(temp_accounter_no,?str1);  ????????????END?IF;  ????????????UPDATE?account?SET?no?=?max_no?WHERE?id?=?temp_id;  ????????????SET?temp_level?=?(LENGTH(max_no)?+?2)?/?4;  ????????????UPDATE?account?SET?level?=?temp_level?WHERE?id?=?temp_id;  ????????END?IF;  ????????UNTIL?state?=?'error'  ????END?REPEAT;  ????CLOSE?account_cursor;  ????/*修改leaf為null的為1*/  ????UPDATE?account?SET?leaf?=?1?WHERE?leaf?IS?NULL;  ????RETURN?0;  END

? 版權聲明
THE END
喜歡就支持一下吧
點贊13 分享