全面學習ORACLE Scheduler特性(3)使用Programs

來源:互聯網
上載者:User
二、使用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

      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是由誰來執行呢,不要走開,廣告之後即將全面揭曉。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.