寫MySQL存儲過程實現動態執行SQL


--存儲過程名和參數,參數中in表示傳入參數,out標示傳出參數,inout表示傳入傳出參數

create procedure p_procedurecode(in sumdate varchar(10))   
begin
     declare v_sql varchar(500);    --需要執行的SQL語句
     declare sym varchar(6);
     
     declare var1 varchar(20);
     declare var2 varchar(70);
     declare var3 integer;

     --定義游標遍歷時,作為判斷是否遍歷完全部記錄的標記
     declare no_more_departments integer DEFAULT 0;     

     --定義游標名字為C_RESULT 
     DECLARE C_RESULT CURSOR FOR
             SELECT barcode,barname,barnum FROM tmp_table;

    --聲明當游標遍歷完全部記錄后將標志變量置成某個值
     DECLARE CONTINUE HANDLER FOR NOT FOUND
             SET no_more_departments=1;

     set sym=substring(sumdate,1,6);     --截取字符串,並將其賦值給一個遍歷

     --連接字符串構成完整SQL語句,動態SQL執行后的結果記錄集,在MySQL中無法獲取,因此需要轉變思路將其放置到一個臨時表中(注意代碼中的寫法)。一般寫法如下:

     --     'Create TEMPORARY Table   表名(Select的查詢語句);
     set v_sql= concat('Create TEMPORARY Table tmp_table(select aa as aacode,bb as aaname,count(cc) as ccnum from h',sym,' where substring(dd,1,8)=''',sumdate,''' group by aa,bb)');

     set @v_sql=v_sql;   --注意很重要,將連成成的字符串賦值給一個變量(可以之前沒有定義,但要以@開頭)
     prepare stmt from @v_sql;  --預處理需要執行的動態SQL,其中stmt是一個變量
     EXECUTE stmt;      --執行SQL語句
     deallocate prepare stmt;     --釋放掉預處理段

     OPEN C_RESULT;       --打開之前定義的游標
     REPEAT                      --循環語句的關鍵詞
           FETCH C_RESULT INTO VAR1, VAR2, VAR3;   --取出每條記錄並賦值給相關變量,注意順序

          --執行查詢語句,並將獲得的值付給一個變量 @oldaacode(注意如果以@開頭的變量可以不用通過declare語句事先聲明)
           select @oldaacode:=vcaaCode from T_sum where vcaaCode=var1 and dtDate=sumdate; 
           if @oldaacode=var1 then    --判斷
              update T_sum set iNum=var3 where vcaaCode=var1 and dtDate=sumdate;
           else
               insert into T_sum(vcaaCode,vcaaName,iNum,dtDate) values(var1,var2,var3,sumdate);
           end if;
     UNTIL no_more_departments  END REPEAT;    --循環語句結束
     CLOSE C_RESULT;                            --關閉游標

     DROP TEMPORARY TABLE tmp_table;       --刪除臨時表
end;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM