MySQL資料庫存儲過程

Mysql存儲過程其實就是一個函數,這個函數裡面可以執行多條Sql語句,可以創建臨時變量。
例如:下面的存儲過程主要功能是
(1)創建兩個臨時變量來統計資料庫的兩個表裡面有沒有昨天的數據,如果沒有就插入統計數據,如果有就什麼也不做。
(2)這個存儲過程每間隔一個小時會被調用一次,為什麼不是一天調用一次呢?因為這個存儲過程查詢的表有很多是FEDERATED表,類似Oracle的dblink,如果一天查詢一次,鏈接就不在瞭(修改資料庫變量也不行,這時候就會出現到時間一運行就會報錯1160 – Got an error writing communication packets,從而導致定時任務不能正常執行)所以還加瞭存儲過程一開始的FLUSH TABLE語句。
(3)這裡要留意變量的使用和賦值,時間的比較和運算

drop procedure IF EXISTS u_head_and_low_pro;
delimiter //
create procedure u_head_and_low_pro()
begin

DECLARE count_yestaday_data_low INT DEFAULT 0;
DECLARE count_yestaday_data_head INT DEFAULT 0;

FLUSH TABLE unconnected_low_statistics;
FLUSH TABLE bureau_and_area;
FLUSH TABLE connected_low;
FLUSH TABLE head;
FLUSH TABLE head_and_meter;
FLUSH TABLE meter_and_low;
FLUSH TABLE uhead_without_bureau;
FLUSH TABLE e_bureau_link39;
FLUSH TABLE e_elemeterhead_link39;
FLUSH TABLE e_elemeter_link39;
FLUSH TABLE e_lwrcomputer_link39;
FLUSH TABLE e_managementarea_link39;
FLUSH TABLE r_elemeter_elemeterhead_link39;
FLUSH TABLE r_lwrcomputer_elemeter_link39;
FLUSH TABLE r_managementarea_bureau_link39;

    select count(*) into count_yestaday_data_low 
  from e_unconnect_lowcomputer_statistics
  WHERE DATE(e_unconnect_lowcomputer_statistics.date) = date(DATE_SUB(NOW(),INTERVAL 1 DAY)); -- 如果沒有符合條件的選項,cnt1的值為0

    SELECT COUNT(*) INTO count_yestaday_data_head
    FROM e_unconnect_elemeterhead_statistics
    WHERE DATE(e_unconnect_elemeterhead_statistics.date) = date(DATE_SUB(NOW(),INTERVAL 1 DAY)); -- 如果沒有符合條件的選項,cnt1的值為0 

    IF count_yestaday_data_low = 0 THEN 
        -- 統計結果插入資料庫
        INSERT INTO e_unconnect_lowcomputer_statistics (
            `date`,
            area_name,
            low_name,
            low_address
        ) 
        SELECT 
            `uhead_date`,
            area_name,
            low_name,
            low_address
        FROM unconnected_low_statistics;
    ELSE    
        SELECT 'cnt1!=0';   
    END IF;

    IF count_yestaday_data_head = 0 THEN
        -- 統計結果插入資料庫
        INSERT INTO e_unconnect_elemeterhead_statistics (
            `date`,
            area_name,
            low_name,
            low_address,
            meter_name,
            meter_address,
            head_name,
            head_address,
            bureau_name,
            low_id,
            meter_id,
            uhead_id,
            bureau_id) 
        SELECT 
            `date`,
            area_name,
            low_name,
            low_address,
            meter_name,
            meter_address,
            head_name,
            head_address,
            bureau_name,
            low_id,
            meter_id,
            uhead_id,
            bureau_id FROM unconnected_elemeterhead_statistics;
    ELSE    
        SELECT 'cnt1!=0';   
    END IF;
 end
 //
 delimiter ;

接下來就可以在Mysql裡創建定時任務瞭,定時任務裡面執行的SQL語句就一句話,就是執行這個存儲過程:

 call u_head_and_low_pro();

You May Also Like