(3)使用Programs |
[君三思] 2009-8-7 |
二、使用Programs在論壇中偶爾見過有人討論如何在ORACLE中執行操作系統命令,或是ORACLE數據庫外的應用。應該說在9i及之前的版本中,雖然說并非完全無法實現(其實還是有多種方式能夠變相實現的),不過復雜的實現方式讓DBA使勁了力,傷透了心,費勁了事兒。 進入10g版本之后,就完全不必如此費神,因為有了DBMS_SCHEDULER,因為有了PROGRAM。 2.1 創建ProgramsScheduler 中的Program對象并不是常規意義上的"程序"或"應用",而就是一個"對象",由DBA定義的,具有執行某項功能的特殊對象。Program中實際執行的操作可以分為下列三種類型:
創建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如上所示,前三項為必選參數,各參數實際代表的意義如下:
下面實際操作一下看看,PL/SQL或PROCEDURE沒有挑戰(ORACLE中直接即可調用),咱們創建一下program,直接調用操作系統中的ls命令,操作如下: -- 與三思有點不同 SQL> BEGIN DBMS_SCHEDULER.CREATE_PROGRAM ( program_name => 'IPCONFIG', program_action => 'C:\WINDOWS\system32\ipconfig.exe', program_type => 'EXECUTABLE', enabled => TRUE); END; / 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 2 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 2 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是由誰來執行呢,不要走開,廣告之后即將全面揭曉。 |