全面學習ORACLE Scheduler特性(3)使用Programs
在論壇中偶爾見過有人討論如何在ORACLE中執行作業系統命令,或是ORACLE資料庫外的應用。應該說在9i及之前的版本中,雖然說並非完全無法實現(其實還是有多種方式能夠變相實現的),不過複雜的實現方式讓DBA使勁了力,傷透了心,費勁了事兒。
進入10g版本之後,就完全不必如此費神,因為有了DBMS_SCHEDULER,因為有了PROGRAM。
2.1 建立Programs
Scheduler 中的Program物件並不是常規意義上的"程式"或"應用",而就是一個"物件",由DBA定義的,具有執行某項功能的特殊物件。Program中實際執行的操作可以分為下列三種型別:
- PL/SQL BLOCK :標準的pl/sql程式碼塊;
- STORED PROCEDURE :編譯好的PL/SQL儲存過程,或者Java儲存過程,以及外部的c子程式;
- EXECUTEABLE :ORACLE資料庫之外的應用,比如作業系統命令等等。
建立Programs使用DBMS_SCHEDULER.CREATE_PROGRAM過程,該過程支援的引數如下:
JSSWEB> desc dbms_scheduler.create_program;
Parameter Type Mode Default?
------------------- -------------- ---- --------
PROGRAM_NAME VARCHAR2 IN
PROGRAM_TYPE VARCHAR2 IN
PROGRAM_ACTION VARCHAR2 IN
NUMBER_OF_ARGUMENTS BINARY_INTEGER IN Y
ENABLED BOOLEAN IN Y
OMMENTS VARCHAR2 IN Y如上所示,前三項為必選引數,各引數實際代表的意義如下:
- PROGRAM_NAME :指定一個program名稱;
- PROGRAM_TYPE :Program的型別,如前文中所述,Program支援三種型別;
- PROGRAM_ACTION :實際執行的操作,應與前面PROGRAM_TYPE引數關聯使用。比如說前面指定了PROGRAM_TYPE為"PLSQL_BLOCK",那麼此處要執行的action就應當是一段標準的pl/sql程式碼。如果前面指定PROGRAM_TYPE為"STORED_PROCEDURE",那麼此處要執行的action就應當是ORACLE中定義好的儲存過程(含Java儲存過程),如果前面指定PROGRAM_TYPE為"EXECUTABLE",那麼此處就應該指定外部命令的命令列資訊(含路徑資訊);
- NUMBER_OF_ARGUMENTS :指定支援的引數個數,預設值為0即沒有引數。每個program最多能夠支援255個引數,注意如果PROGRAM_TYPE設定為PLSQL_BLOCK,那麼本引數自動忽略;
- ENABLED :指定是否將建立的program置為有效狀態,預設情況下為false。
- COMMENTS :這個不用再說了吧,註釋資訊。
下面實際操作一下看看,PL/SQL或PROCEDURE沒有挑戰(ORACLE中直接即可呼叫),我們們建立一下program,直接呼叫作業系統中的ls命令,操作如下:
SQL> BEGIN
2 DBMS_SCHEDULER.CREATE_PROGRAM (
3 program_name => 'my_program1',
4 program_action => '/bin/date',
5 program_type => 'EXECUTABLE',
6 enabled => TRUE);
7 END;
8 /
PL/SQL procedure successfully completed.2.2 管理Programs
定義的program如何執行,這裡先賣個關子,前面介紹CREATE_PROGRAM過程的引數時提到,每個program最多支援255個引數,要為program新增引數,可以透過DEFINE_PROGRAM_ARGUMENT過程。不過在為其新增引數前,要注意program的NUMBER_OF_ARGUMENTS指定的數量,如果該值為0,那麼為其新增引數時就會報錯。
查詢建立的program的資訊,可以透過USER_SCHEDULER_PROGRAMS檢視,例如:
SQL> select program_name,program_type,program_action,number_of_arguments,enabled from user_scheduler_programs;
PROGRAM_NAME PROGRAM_TYPE PROGRAM_ACTION NUMBER_OF_ARGUMENTS ENABL
-------------------- ---------------- -------------------- ------------------- -----
MY_PROGRAM1 EXECUTABLE /bin/ls 1 FALSE由於前面建立program時並未指定NUMBER_OF_ARGUMENTS的值,因此我們這裡需要首先修改該值為一個非0值,操作如下:
SQL> exec dbms_scheduler.set_attribute('my_program1','NUMBER_OF_ARGUMENTS',1);
PL/SQL procedure successfully completed.沒錯,操作還是使用DBMS_SCHEDULER.SET_ATTRIBUTE過程。另外需要注意,program的NUMBER_OF_ARGUMENTS引數可是說想改就能改的,正常情況下該處理必須是在program處於enabled之前確認完畢,否則會觸發ORA-27465錯誤,因此要修改program的引數之前,必須首先確保要修改program的enabled狀態為false。
那麼對於已經處於enabled狀態的program,如何修改其狀態屬性呢?其實很簡單,前面操作jobs時使用的DBMS_SCHEDULER.DISABLE過程還記的嗎?沒錯,該過程對於program同樣好使,並且呼叫方式也完全一樣,例如:
SQL> exec dbms_scheduler.disable('my_program1');
PL/SQL procedure successfully completed.另外,如果希望將program置為enabled狀態,執行DBMS_SCHEDULER.ENABLE過程即可,這裡不再例舉。
接下來,就可以為剛剛建立的my_program1新增路徑引數,操作如下:
SQL> BEGIN
2 DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT (
3 program_name => 'my_program1',
4 argument_position => 1,
5 argument_name => 'dirpath',
6 argument_type => 'VARCHAR2',
7 default_value => '/home/oracle');
8 END;
9 /
PL/SQL procedure successfully completed.查詢為program定義的引數,可以透過USER_SCHEDULER_PROGRAM_ARGS檢視,例如:
SQL> select program_name,argument_name,argument_position,argument_type, default_value from user_scheduler_program_args;
PROGRAM_NAME ARGUMENT_NAME ARGUMENT_POSITION DEFAULT_VALUE
-------------------- -------------------- ----------------- --------------------
MY_PROGRAM1 DIRPATH 1 VARCHAR2刪除program的argument操作也很簡單,使用DROP_PROGRAM_ARGUMENT過程即可,例如:
SQL> exec dbms_scheduler.drop_program_argument('my_program1','dirpath');
PL/SQL procedure successfully completed.該過程第一個引數指定program名稱,第二個引數指定定義的argument名稱,當然此處也可以指定argument的位置,即前例檢視返回結果中的 ARGUMENT_POSITION 列值。
要刪除program的話就更簡單了,使用DROP_PROGRAM過程即可,例如:
SQL> exec dbms_scheduler.drop_program('my_program1');
PL/SQL procedure successfully completed.當然啦,刪除program的同時,也會刪除該program對應的所有arguments。
實際上SCHEDULER中建立job時,也可以指定執行外部的程式。SCHEDULER中的Job更像是之前版本繼承過來的JOBS,只不過10g中SCHEDULER管理的JOBS功能更加強大。Programs與Jobs不同的是,Jobs是定義好的,定時執行的任務,而Programs則是定義好的,等待被執行的物件。那麼Programs是由誰來執行呢,不要走開,廣告之後即將全面揭曉。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31397003/viewspace-2147703/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 全面學習ORACLE Scheduler特性(5) Schedules排程Programs執行的JobsOracle
- 全面學習ORACLE Scheduler特性(5)Schedules排程Programs執行的JobsOracle
- 全面學習ORACLE Scheduler特性(11)使用Job ClassesOracle
- 全面學習ORACLE Scheduler特性(1)建立jobsOracle
- 全面學習ORACLE Scheduler特性(2)管理jobsOracle
- 全面學習ORACLE Scheduler特性(7)Scheduler丟擲的EventsOracle
- 全面學習ORACLE Scheduler特性(7)使用Events之Scheduler丟擲的EventsOracle
- 全面學習ORACLE Scheduler特性(9)建立ChainsOracleAI
- 全面學習ORACLE Scheduler特性(10)管理ChainsOracleAI
- 全面學習ORACLE Scheduler特性(12)使用Windows和Window GroupsOracleWindows
- 全面學習ORACLE Scheduler特性(4)建立和管理ScheduleOracle
- 全面學習ORACLE Scheduler特性(8)使用Events之Application丟擲的EventsOracleAPP
- 全面學習ORACLE Scheduler特性(6)設定Repeat Interval引數Oracle
- 全面學習ORACLE Scheduler特性(8)Application丟擲的EventsOracleAPP
- 【JOB】Oracle JOB全面學習(DBMS_JOB和DBMS_SCHEDULER)Oracle
- 全面學習和應用ORACLE ASM特性OracleASM
- [轉載] 全面學習和應用ORACLE ASM特性(1),(2),(3)OracleASM
- 全面學習和應用ORACLE ASM特性--(3)新增和修改asm磁碟組OracleASM
- 全面學習oracle flashback特性(3.2)--Flashback Database操作示例OracleDatabase
- 全面學習oracle flashback特性(2.1)--Flashback Table之RECYCLEBINOracle
- Oracle Scheduler學習筆記分享Oracle筆記
- Oracle 10g Scheduler 特性Oracle 10g
- 全面學習oracle flashback特性(2.3)--Flashback Table之注意事項Oracle
- 全面學習oracle flashback特性(1.2)--閃回查詢之As of scnOracle
- [轉載] 全面學習和應用ORACLE ASM特性(4),(5)OracleASM
- 全面學習和應用ORACLE ASM特性--(2)管理asm磁碟OracleASM
- Oracle 10g Scheduler 全面介紹Oracle 10g
- 全面學習oracle flashback特性(1.4)--閃回查詢之Transaction queryOracle
- 全面學習oracle flashback特性(1.1)--閃回查詢之As of timestampOracle
- 【徵文】全面學習oracle flashback特性(1.2)--閃回查詢之As of scnOracle
- 全面學習oracle flashback特性(2.2)--Flashback Table之從UNDO中恢復Oracle
- 全面學習oracle flashback特性(1.5)--閃回查詢之制約因素Oracle
- 【徵文】全面學習oracle flashback特性(1.1)--閃回查詢之As of timestampOracle
- 【徵文】全面學習oracle flashback特性(1.4)--閃回查詢之Transaction queryOracle
- 全面學習和應用ORACLE ASM特性--(1)關於asm例項OracleASM
- Quartz job scheduler 學習quartz
- 【徵文】全面學習oracle flashback特性(1.5)--閃回查詢之制約因素Oracle
- Oracle Applications Interface ProgramsOracleAPP