1. 程式人生 > >oracle批量備份表的儲存過程

oracle批量備份表的儲存過程

在一些重大變更前,後都需要備份涉及的重要表,當表很多且備份不是最新的時候,需要drop表,因為oracle沒if exists 這種語法,寫個儲存過程來批量備份,當然也可以把加上引數,不過沒什麼必要,基本知道哪些表需要備份,執行下儲存過程就OK

注意,這邊如果當天存在同名備份表,會drop掉,

create or replace procedure BAK_CRM_PRO as
type type_array is varray(20) of varchar2(50);
back_tables type_array :=type_array(
'TBL_XXX1',
'TBL_XXX2',
'TBL_XXX3',
'TBL_XXX4',
'TBL_XXX5',
'TBL_XXX6',
'TBL_XXX7',
'TBL_XXX8',
'TBL_XXX9',
'TBL_XXX10'
);
bak_name varchar2(100);
temp_str varchar2(1000);
date_str varchar2(10);
temp_num number;
temp_num2 number;
begin
	select to_char(sysdate,'mmdd') into date_str from dual;
	for i in 1..back_tables.count loop
		bak_name:='BAK_'||date_str||'_'||back_tables(i);
		if (length(bak_name)>30) then
			bak_name:=regexp_replace(bak_name,'_([[:alpha:]])[[:alpha:]]+','_\1',8);
		end if;
		execute immediate 'select count(1)  from user_tables a where a.table_name=:1' into temp_num using bak_name ;
		dbms_output.put_line('temp_num='||temp_num);
		if(temp_num=1) then
			temp_str:='drop table '||bak_name;
			dbms_output.put_line(temp_str);
			execute immediate temp_str;
		end if;
		temp_str:='create table '||bak_name||' as select * from '||back_tables(i);
		dbms_output.put_line(temp_str);
		execute immediate temp_str;
		temp_num:=1;
		temp_num2 :=2;
		execute immediate 'select count(1) from '||back_tables(i) into temp_num;
		execute immediate 'select count(1) from '||bak_name into temp_num2;
		dbms_output.put_line('n1='||temp_num||' n2='||temp_num2);
		if(temp_num=temp_num2)
		then
			dbms_output.put_line('back '||bak_name||' success');
		end if;
	end loop;
end;


先編譯下儲存,然後呼叫就可以

另外plsql中編譯儲存過程在命令視窗,複製上面的程式碼,然後輸入/ 和回車,就能編譯,當然編譯前需要替換成自己需要備份的表,就是tbl_xxx那部分

這邊用到了dml動態sql,也可以用遊標代替,不太熟悉這個

編譯後執行 在sql視窗執行下面這個就可以

begin
  BAK_CRM_PRO_test();
end;

如果不需要這個儲存過程可以刪除

drop procedure BAK_CRM_PRO_test;

相關推薦

oracle批量備份儲存過程

在一些重大變更前,後都需要備份涉及的重要表,當表很多且備份不是最新的時候,需要drop表,因為oracle沒if exists 這種語法,寫個儲存過程來批量備份,當然也可以把加上引數,不過沒什麼必要,基本知道哪些表需要備份,執行下儲存過程就OK 注意,這邊如果當天存在同名備

Oracle 批量建函式 儲存過程 指令碼

這段時間開始使用oracle 10G 資料庫,前幾天寫了幾個報表的函式  和儲存過程,然後 把生成的指令碼去  正式庫上執行 ,老是報錯,不知道是怎麼回事, 可能是  SQLserver 用慣了 ,總覺得可以連續執行多個  建函式的 指令碼,但是  始終不行, 偶然的在 網

ORACLE定時任務呼叫儲存過程動態為新增分割槽

1、建立需要自動分割槽的表 CREATE TABLE TEST(M DATA) PARTITION BY RANGE(M) ( PARTITION TEST_PAR_99991212 VALUES LESS THAN(TO_DATE('12-12-9999','DD-MM-

批量修改Oracle序列值的儲存過程

createorreplaceprocedure P_MODIFY_SEQUENCES is--更新各序列值str_sql varchar2(4000);r boolean;function F_MODIFY_SEQUENCE(sequenceName varchar2,taleName varchar2,k

備份一個批量插入的儲存過程

懶得每次都要重寫   drop procedure if exists insertText;   delimiter $ create procedure insertText()      BEGIN     

Oracle用定時任務儲存過程將資料轉存到歷史,提高查詢速度

一、定義儲存過程 CREATE OR REPLACE PROCEDURE Sync_INFO_HISTORY IS BEGIN insert into depart_passenger_info

oracle exp/imp命令詳解(匯入,匯出,儲存過程,檢視等)

E: >exp help=y 通過輸入 EXP 命令和使用者名稱/口令,您可以 在使用者 / 口令之後的命令: 例項: EXP SCOTT/TIGER 或者,您也可以通過輸入跟有各種引數的 EXP 命令來控制“匯出”的執行方式。 要指定引數,您可以使用關鍵字: 格式: EXP KEYWOR

在PL/SQL Developer和oracle中如何新建儲存過程並呼叫儲存過程

1、新建程式視窗,選擇Procedure 2、寫入procedure以後,要執行程式進行編譯 3、編譯成功以後,有三種方法可以執行procedure 第一種是在命令視窗執行exec procedure name SQL> exec procedure_name();

QT操作Oracle資料庫(事務、儲存過程)

QT操作Oracle資料庫可以使用QODBC、QOCI兩種驅動,這裡使用QODBC驅動。在使用QOCI驅動操作oracle時,事務不能回滾,可能是我編譯的QOCI驅動有問題,但是暫時沒有找到原因。 #ifndef QTTEST_H #define QTTEST_H #include <

oracle 批量刪除table、sequence,匯入等

1、拼接 刪除表sql,語句執行即可 select 'drop table '||table_name||';' as sqlscript from user_tables; 2、匯入table imp account/[email protected] file=d:/d

Oracle與Mysql建立儲存過程

<1>Oracle如下: create or replace procedure aa //建立無參儲存過程 is begin for i in 1…100000 loop //定義迴圈 insert into jz(jz_object_id,cid,customer_id,co

MySQL儲存過程中的3種迴圈,儲存過程的基本語法,ORACLE與MYSQL的儲存過程/函式的使用區別,退出儲存過程方法

  學無止境 部落格園   首頁   新隨筆   聯絡   訂閱  管理 隨筆-1968  評論-103  文章-4&

Oracle job 定時執行 儲存過程

一:簡單測試job的建立過程案例: 1,先建立一張JOB_TEST表,欄位為a 日期格式 SQL> create table JOB_TEST(a date); Table created SQL> commit; Commit complete

Oracle通過Job呼叫儲存過程

 這是本人第一次處理Oracle的儲存過程以及計劃任務(job)的事情;期間遇到了很多問題在此將這次試用job呼叫自己的編寫的儲存過程的過程中遇到的問題做一總結; 任務:實時採集系統會每5分鐘給中心繫統傳送一個流量資料,但是沒有給出累計流量資料; 1、編寫一個儲存過程W

Oracle】PL/SQL 儲存過程 顯式遊標、隱式遊標、動態遊標

  【Oracle】PL/SQL 顯式遊標、隱式遊標、動態遊標 2013年06月17日 09:02:51 AlphaWang 閱讀數:13009更多 個人分類: 【Database】 在PL/SQL塊中執行SELECT、INSERT、DELET

oracle 函式中呼叫儲存過程

  專案中開發了一個儲存過程來給報表提供資料來源,而程式業務邏輯中需要有一個對該資料來源進行判斷的功能,開始是使用拼接sql的方式在儲存過程中對應sql的外面包裝一層來進行處理,但是覺得這種方式拼接的sql太長,而且以後業務邏輯改變要同時修改儲存過程和程式碼,容易發生遺漏,

oracle 動態SQL在儲存過程中的使用

1、      靜態SQL和動態SQLOracle編譯PL/SQL程式塊分為兩個種(其它SQL程式碼塊包括儲存過程也是如此):其一為前期聯編(early binding),即SQL語句在程式編譯期間就已經確定,大多數的編譯情況屬於這種型別;另外一種是後期聯編(late bin

Oracle PL/SQL程式設計-儲存過程優缺點及實現過程【1】

如果儲存過程名已經被佔用,兩種方式:1.修改儲存過程名;2新增關鍵字 or replace :表示如果有yao_prol,就替換。eg:SQL> create or replace procedure yao_prol is  2      begin  3      insert into YAO_T

Oracle定時任務執行儲存過程帶引數

儲存過程: create or replace procedure pro_test (retCode out number, retMsg out varchar2) is  vcrm v_prod_inst%ROWTYPE; TYPE ref_cursor_type I

Oracle建立和呼叫儲存過程,函式,檢視

【1】Oracle建立和呼叫儲存過程1:寫一個簡單的例子刪除三級級聯 1)create or replace procedure ww_procedure_servicecheck (V_ID IN NUMBER)-- 定義輸入變數 IS begin    DELETE