在項目中,經常會遇到需要定時完成的任務,比如定時更新資料,定義統計資料產生報表等等,其實這些事情都可以使用Oracle的Job來完成。下面考試大就結合我們實驗室項目實際,簡單介紹一下在Oracle資料庫中通過Job完成自動建立表的方法。
整個過程總共分為兩步。雖然整個過程都非常簡單,但是對於初學Oracle的生手還是有很多地方需要注意的。
首先介紹一下,建立該JOB的背景,因為每天更新的直播和點播節目資訊比較多,為了方便處理,需要每天建立一張表來記錄更新的節目資訊,當前資料庫中已經有一張tbl_programme的表,每天建立的表的欄位需要同tbl_programme保持一致,每天新建立的表的名稱格式為tbl_programme_日期(例如:tbl_programme_20090214)規定每天晚上1點鐘產生該天的新表。
關於Oracle RAC中的job運行在哪個執行個體的理解
Oracle job不執行的分析處理
Oracle job interval規則
學習Oracle環境中job建立
第一步:建立一個執行建立操作的預存程序
在這一步首先要解決的問題就是構造表名。在Oracle中格式化輸出時間可以用to_char函數來處理,例如:
SQL> select to_char(sysdate, ’yyyy/mm/dd hh24:mi:ss’) from dual;
TO_CHAR(SYSDATE,’YYYY/MM/DDHH2
------------------------------
2009/02/14 17:22:41
--以上SQL格式化輸出了時間,要得到我們所需要的格式直接修改一下SQL即可
SQL> select to_char(sysdate, ’yyyymmdd’) from dual;
TO_CHAR(SYSDATE,’YYYYMMDD’)
---------------------------
20090214
得到時間格式字串後我們就可以將表名的首碼和時間串連在一起形成完整的表名。這裡需要注意,在Oracle中串連兩個字串需要使用‘||’符號,而在Sql Server中直接使用‘+’號就可以了,因為我以前一直在Sql Server下編程,好久都沒編寫Oracle的SQL所以費了很大的功夫才發現這個問題。完整的Sql就是
SQL> select ’tbl_programme_’ || to_char(sysdate, ’yyyymmdd’) from dual;
’TBL_PROGRAMME_’||TO_CHAR(SYSD
------------------------------
tbl_programme_20090214
接下來就是建立表的代碼了,因為新表需要tbl_programme保持一致,所以直接CTAS來建立表那是非常適合的了,代碼如下:
Create table tablename as select * from tbl_programme
如果需要指定一個TableSpace則將該SQL做適當修改:
Create table tablename tablespace p2p as select * from tbl_programme
所以整個建立預存程序的SQL就是
create or replace procedure sp_createtab_tbl_programme
Authid Current_User
as
tabname varchar(200);
begin
select ’TBL_PROGRAMME_’ || to_char(sysdate, ’yyyymmdd’) into tabname fromdual;
--create table tabname as select * from tbl_programme where 1 != 1;
execute immediate ’create table ’ || tabname ||’ tablespace p2p as select* from tbl_programme where 1 != 1’;
commit;
end;
/
這裡還需要注意一下在Oracle裡面如果要對一個變數賦值的話有兩種方式:
(1)使用:=進行賦值
(2)使用select ‘xjkxj ’ into 變數名稱 from tabname
另外,在預存程序中定義變數的時候一般放在as/is後begin前面。在預存程序一般是不能直接使用create table,truncate table這類似的語句的,如果要使用這些語句必須使用excute immediate + 所要執行的sql語句來實現。
注意上面用紅色標誌的語句:Authid Current_User
這個語句比較重要,如果我們在建立預存程序的時候不添加這條語句執行該預存程序將不會成功,原因是預設情況向預存程序是沒有Create table等許可權的,即使目前使用者有DBA的許可權也不行,如果預存程序中存在建立表的操作,可以有以下兩種方式來解決該問題。
(1)顯示的賦予該使用者Create table的許可權,grant create table to user.
(2)在預存程序中使用Authid Current_User 標識使用目前使用者的許可權。