純純的技術小白職場新人,求指點求指教。
資料庫DDW里有20多個有資料的表(就簡單點,假設是a,b,c,d,e,5個表吧,每個表里的欄位都不一樣),新創建資料庫DDW_HIS,里面的表我都建好了,兩個庫的表完全一樣只是后者沒有資料。現在我被要求寫個存盤程序,將前者的資料導到后者里,達到備份資料的效果。
一開始想直接用Navicat工具,或者一個個的寫存盤程序,但提出之后不是人家想要的效果,這些辦法他都知道,這不是他想要的...而且提到讓我研究研究游標。網上查到的insert例句,感覺差點意思,而且直接就是陳述句不是存盤程序。
應該是寫SQL的經驗太少吧,我太菜了,現在有點懵,求大神指點,最好是能寫的直白點,讓我能更直接的理解...
uj5u.com熱心網友回復:
游標?第一次聽說要求用游標的。也是個半拉子吧?直接使用動態陳述句回圈表名就行了,表名能在sys.objects里面都能取出來。
uj5u.com熱心網友回復:
額...不管怎樣,是要完成他的要求的。表名我是一個個復制到空白檔案里隨時取用,sys.objects這個還真沒用過,比如我想看資料庫DDW里的表名,應該怎么搜?
uj5u.com熱心網友回復:
感覺他想要的,是這個存盤程序以后就長期用來給DDW做資料備份,所以那些一次性倒資料的辦法不是他想要的,這個存盤程序應該怎么寫呢?uj5u.com熱心網友回復:
給你寫個偽代碼吧,具體程序還是你自己寫吧(1)游標定義: 該查詢陳述句 select table_name from information_schema.tables where table_schema='DDW'; -- 獲取原庫
(2)使用動態sql拼接陳述句:
假設:前面游標獲取的變數名叫 table_name,sql變數為存盤動態sql變數
sql = concat('truncate table DDW_HIS.',table_name,';') -- 備份前,洗掉備份庫同名表中的資料,避免引起主鍵沖突、唯一鍵沖突等問題(你要是想增量一直備份,這就有點麻煩了,你需要查系統表獲取主鍵/唯一鍵 然后對此關聯插入,這里我只給你寫一下每次備份前清空原備份表資料的思路)
exec(sql) -- 執行該sql
sql = concat('insert into DDW_HIS.',table_name,' select * from DDW.',table_name,';')
exec(sql) -- 執行該SQL
(3)然后這個存盤程序,用 event 做個定時任務就好了,或者你放到程式中 讓代碼、界面使用
uj5u.com熱心網友回復:
動態陳述句回圈表名,就是游標
uj5u.com熱心網友回復:
參考下這個吧,只要把游標陳述句和里面的陳述句改改就能用BEGIN
declare v_varchars varchar(200);
declare v_varchars2 varchar(200);
declare v_varchars3 varchar(200);
declare done int;
declare cursor_tab cursor for select TABLE_SCHEMA,TABLE_NAME from information_schema.tables where table_type='BASE TABLE' AND TABLE_SCHEMA not in ('performance_schema','mysql','information_schema','activemq') order by TABLE_SCHEMA,TABLE_NAME;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
set @now = now();
open cursor_tab;
posLoop:LOOP
FETCH cursor_tab into v_schema,v_tbname;
IF done=1 THEN
LEAVE posLoop;
END IF;
#set @strSql='select ''資料庫:'|| v_schema || ',表名:'||v_tbname|| ',資料量:''|| count(*) from '||v_schema||'.'||v_tbname;
set @strSql='select count(*) into @v_cnt from '||v_schema||'.'||v_tbname;
PREPARE stmt FROM @strSql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
INSERT into stats_tab_rows values (v_schema,v_tbname,@v_cnt,@now);
END LOOP posLoop;
CLOSE cursor_tab;
END
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/228638.html
標籤:疑難問題
上一篇:POSTGRE查詢滿
