(3)使用Programs |
[君三思] 2009-8-7 |
二、使用Programs在論壇中偶爾見過有人討論如何在ORACLE中執(zhí)行操作系統(tǒng)命令,或是ORACLE數(shù)據(jù)庫外的應(yīng)用。應(yīng)該說在9i及之前的版本中,雖然說并非完全無法實(shí)現(xiàn)(其實(shí)還是有多種方式能夠變相實(shí)現(xiàn)的),不過復(fù)雜的實(shí)現(xiàn)方式讓DBA使勁了力,傷透了心,費(fèi)勁了事兒。 進(jìn)入10g版本之后,就完全不必如此費(fèi)神,因?yàn)橛辛薉BMS_SCHEDULER,因?yàn)橛辛薖ROGRAM。 2.1 創(chuàng)建ProgramsScheduler 中的Program對(duì)象并不是常規(guī)意義上的"程序"或"應(yīng)用",而就是一個(gè)"對(duì)象",由DBA定義的,具有執(zhí)行某項(xiàng)功能的特殊對(duì)象。Program中實(shí)際執(zhí)行的操作可以分為下列三種類型:
創(chuàng)建Programs使用DBMS_SCHEDULER.CREATE_PROGRAM過程,該過程支持的參數(shù)如下: 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如上所示,前三項(xiàng)為必選參數(shù),各參數(shù)實(shí)際代表的意義如下:
下面實(shí)際操作一下看看,PL/SQL或PROCEDURE沒有挑戰(zhàn)(ORACLE中直接即可調(diào)用),咱們創(chuàng)建一下program,直接調(diào)用操作系統(tǒng)中的ls命令,操作如下: -- 與三思有點(diǎn)不同 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如何執(zhí)行,這里先賣個(gè)關(guān)子,前面介紹CREATE_PROGRAM過程的參數(shù)時(shí)提到,每個(gè)program最多支持255個(gè)參數(shù),要為program添加參數(shù),可以通過DEFINE_PROGRAM_ARGUMENT過程。不過在為其添加參數(shù)前,要注意program的NUMBER_OF_ARGUMENTS指定的數(shù)量,如果該值為0,那么為其添加參數(shù)時(shí)就會(huì)報(bào)錯(cuò)。 查詢創(chuàng)建的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由于前面創(chuàng)建program時(shí)並未指定NUMBER_OF_ARGUMENTS的值,因此我們這里需要首先修改該值為一個(gè)非0值,操作如下: SQL> exec dbms_scheduler.set_attribute(¨my_program1¨,¨NUMBER_OF_ARGUMENTS¨,1); PL/SQL procedure successfully completed.沒錯(cuò),操作還是使用DBMS_SCHEDULER.SET_ATTRIBUTE過程。另外需要注意,program的NUMBER_OF_ARGUMENTS參數(shù)可是說想改就能改的,正常情況下該處理必須是在program處于enabled之前確認(rèn)完畢,否則會(huì)觸發(fā)ORA-27465錯(cuò)誤,因此要修改program的參數(shù)之前,必須首先確保要修改program的enabled狀態(tài)為false。 那么對(duì)于已經(jīng)處于enabled狀態(tài)的program,如何修改其狀態(tài)屬性呢?其實(shí)很簡(jiǎn)單,前面操作jobs時(shí)使用的DBMS_SCHEDULER.DISABLE過程還記的嗎?沒錯(cuò),該過程對(duì)于program同樣好使,并且調(diào)用方式也完全一樣,例如: SQL> exec dbms_scheduler.disable(¨my_program1¨); PL/SQL procedure successfully completed.另外,如果希望將program置為enabled狀態(tài),執(zhí)行DBMS_SCHEDULER.ENABLE過程即可,這里不再例舉。 接下來,就可以為剛剛創(chuàng)建的my_program1添加路徑參數(shù),操作如下: 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.查詢?yōu)閜rogram定義的參數(shù),可以通過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操作也很簡(jiǎn)單,使用DROP_PROGRAM_ARGUMENT過程即可,例如: SQL> exec dbms_scheduler.drop_program_argument(¨my_program1¨,¨dirpath¨); PL/SQL procedure successfully completed.該過程第一個(gè)參數(shù)指定program名稱,第二個(gè)參數(shù)指定定義的argument名稱,當(dāng)然此處也可以指定argument的位置,即前例視圖返回結(jié)果中的 ARGUMENT_POSITION 列值。 要?jiǎng)h除program的話就更簡(jiǎn)單了,使用DROP_PROGRAM過程即可,例如: SQL> exec dbms_scheduler.drop_program(¨my_program1¨); PL/SQL procedure successfully completed.當(dāng)然啦,刪除program的同時(shí),也會(huì)刪除該program對(duì)應(yīng)的所有arguments。 實(shí)際上SCHEDULER中創(chuàng)建job時(shí),也可以指定執(zhí)行外部的程序。SCHEDULER中的Job更像是之前版本繼承過來的JOBS,只不過10g中SCHEDULER管理的JOBS功能更加強(qiáng)大。Programs與Jobs不同的是,Jobs是定義好的,定時(shí)執(zhí)行的任務(wù),而Programs則是定義好的,等待被執(zhí)行的對(duì)象。那么Programs是由誰來執(zhí)行呢,不要走開,廣告之后即將全面揭曉。 |