背景:項目中,需要給幾百張表添加相同的欄位,手動添加比較費勁,於是打算使用存儲過程實現。 編寫的存儲過程: delimiter // -- 創建存儲過程之前需判斷該存儲過程是否已存在,若存在則刪除 DROP PROCEDURE IF EXISTS updateTables; -- 創建存儲過程 CR ...
背景:項目中,需要給幾百張表添加相同的欄位,手動添加比較費勁,於是打算使用存儲過程實現。
編寫的存儲過程:
delimiter // -- 創建存儲過程之前需判斷該存儲過程是否已存在,若存在則刪除 DROP PROCEDURE IF EXISTS updateTables; -- 創建存儲過程 CREATE PROCEDURE updateTables() BEGIN -- 定義變數 DECLARE s int DEFAULT 0; DECLARE tableName varchar(100); DECLARE var_sql varchar(800); DECLARE cnt INT DEFAULT 0; -- 定義游標,並將sql結果集賦值到游標中 DECLARE report CURSOR FOR select table_name from information_schema.tables where table_schema='pbocbdms' and table_name like 'ods_%'; -- 聲明當游標遍歷完後將標誌變數置成某個值 DECLARE CONTINUE HANDLER FOR NOT FOUND SET s=1; -- 打開游標 open report; -- 將游標中的值賦值給變數,註意:變數名不要和返回的列名同名,變數順序要和sql結果列的順序一致 fetch report into tableName; -- 當s不等於1,也就是未遍歷完時,會一直迴圈 while s<>1 do -- 執行業務邏輯 SELECT count(*) into cnt FROM information_schema.columns WHERE table_schema='pbocbdms' AND table_name = tableName AND column_name = 'xm_code'; -- 列不存在則可以添加 IF cnt = 0 THEN set var_sql = concat('alter table ',tableName,' add column xm_code varchar(50) COMMENT \'項目別名編碼\';'); set @sql = var_sql; PREPARE s1 from @sql; EXECUTE s1; deallocate prepare s1; END IF; -- 繼續抓取游標數據到變數 fetch report into tableName; end while; -- 關閉游標 close report; END // delimiter ;
調用存儲過程
call updateTables();