ORACLE 儲存過程動態執行SQL建立表備份

2021-09-26 13:00:09 字數 1636 閱讀 8256

1.需求 定時將資料庫中某個表的資料 進行備份

類似:create table_bak as select * from table_name;

這樣的建立表的語句 是不允許直接在儲存過程中填寫的。

解決:execute immediate

create or replace procedure psn_bak_job

astable_name varchar2(100);

str_sql varchar2(1000);

begin

select 'hi_psnjob_'||to_char(sysdate,'yyyymmddhh24mi') into table_name from dual;

--table_name:='hi_psnjob_bak';

str_sql:='create table '||table_name||' as select * from hi_psnjob';

execute immediate str_sql;

end;

這裡使用yyyymmddhh24miss 格式 建立表失敗 所以改為yyyymmddhh24mi;

這樣測試執行時 報錯 提示許可權不足。

call psn_bak_job();
需要授權一下

grant create any table to 使用者名稱;
處理完以上問題後 就可以結合oracle自帶的定時任務進行自動備份表資料了

自動備份 參考

間隔/interval是指上一次執行結束到下一次開始執行的時間間隔,當interval設定為null時,該job執行結束後,就被從佇列中刪除。假如我們需要該job周期性地執行,則要用『sysdate+m』表示。

(1).每分鐘執行

interval => trunc(sysdate,'mi') + 1/ (24*60)

每小時執行

interval => trunc(sysdate,'hh') + 1/ (24)

(2).每天定時執行

例如:每天的凌晨1點執行

interval => trunc(sysdate+ 1) +1/ (24)

(3).每週定時執行

例如:每週一凌晨1點執行

interval => trunc(next_day(sysdate,'星期一'))+1/24

(4).每月定時執行

例如:每月1日凌晨1點執行

interval =>trunc(last_day(sysdate))+1+1/24

(5).每季度定時執行

例如每季度的第一天凌晨1點執行

interval => trunc(add_months(sysdate,3),'q') + 1/24

(6).每半年定時執行

例如:每年7月1日和1月1日凌晨1點

interval => add_months(trunc(sysdate,'yyyy'),6)+1/24

(7).每年定時執行

例如:每年1月1日凌晨1點執行

interval =>add_months(trunc(sysdate,'yyyy'),12)+1/24

oracle 動態儲存過程

1.定時 begin sys.dbms scheduler.create job job name job pro his delete cp job type stored procedure job action pro his delete cp start date sysdate,repe...

Oracle儲存過程執行許可權

預設情況下,在呼叫儲存過程使用者的角色是不起作用的,即在執行儲存過程時只有public許可權。所以如果被呼叫的儲存過程中如果有execute immediate create table.語句,將會引發ora 01031 insufficient privileges錯誤。儲存過程分為兩種,即dr ...

oracle動態呼叫 動態呼叫儲存過程

關鍵字 execute immediate sqlname using in 1 in 2 out c sql create or replace procedure p test a in varchar2,b in varchar2,c out varchar2 2 is 3 begin 4 c...