熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Oracle高級排隊機制

2013-11-13 15:36:13  來源: Oracle 

  包

  子程序

  說明

  DBMS_AQ

  ENQUEUE

  enqueueE操作向隊列中插入消息帶有指定的路由傳遞信息

  DBMS_AQ

  DEQUEUE

  Dequeue操作從隊列中檢索出消息帶有指定的選項消息

  DBMS_AQADM

  CREATE_QUEUE_TABLE

  用指定的參數創建列表

  DBMS_AQADM

  CREATE_QUEUE

  在現有隊列表中創建一個隊列

  DBMS_AQADM

  DROP_QUEUE

  從隊列表中刪除指定隊列

  DBMS_AQADM

  DROP_QUEUE_TABLE

  刪除隊列表以及其組件隊列

  DBMS_AQADM

  ALTER_QUEUE

  更改給定隊列的選項

  DBMS_AQADM

  ADD_SUBSCRIBER

  向指定隊列中添加預約者

  DBMS_AQADM

  REMOVE_SUBSCRIBER

  從給定隊列中刪除預約者

  DBMS_AQADM

  GRANT_TYPE_ACCESS

  為隊列管理器授予權限

  DBMS_AQADM

  QUEUE_SUBSCRIBERS

  返回指定隊列的預約者

  DBMS_AQADM

  START_TIME_MANAGER

  啟動時間管理器後台進程

  DBMS_AQADM

  STOP_TIME_MANAGER

  停止時間管理器後台進程

  DBMS_AQ支持類型

  類型名

  說明

  用於

  SYSAQ$_AGENT

  消息的生產者或消費者

  作為AQ$_RECIPIENT_LIST_T的一部分被包含因此用於ENQUEUET和DEQUEUE

  AQ$RECIPIENT_LIST_T

  接收消息的代理列表

  作為MESSAGE_PROPERIES_T的一部分被包含因此用於ENQUEUE和DEQUEUE

  MESSAGE_PROPERTIES_T

  消息的屬性

  ENQUEQU和DEQUEUE

  ENQUEUE_OPTIONS_T

  Enqueue的選項

  ENQUEQU

  DEQUEUE_OPTIONS_T

  Dequeue的選項

  DEQUEUE

   SYSAQ$_AGENT

  TYPE SYSAQ$_AGENT IS RECORD

  (

  Name varchar()

  Address varchar()

  Protocol number

  )

   AQ$RECIPIENT_LIST_T

  Type aq$_recipient_list_t is table of sysaq$_agent index by binary_integer;

   MESSAGE_PROPERTIES_T

  Type message_properties_t is record

  (

  Priority binary_integer default

  Delay binary_integer default no_delay

  Expiration binary_integer default never

  Correlation varchar() default null

  Attempts binary_integer

  Recipient_list aq$_recipient_list_t

  Exception_queue varchar() default null

  Enqueue_time date

  State binary_integer

  )

  參數說明:

  字段

  數據類型

  說明

  Priority

  Binary_integer

  相應消息的優先級比較小的數字意味著比較高的優先級優先級可以是任何整數其中也包括負數

  Delay

  Binary_integer

  相應消息的延遲delay可以是NO_DELAY(這意味著消息可以被立即從隊列中取出)或者要等待的秒數指定消息標識符的dequeue操作將忽略該延遲而進行操作被延遲的消息在執行enqueue(插入隊列)操作時的狀態是waiting然後在delay秒以後變為ready狀態

  Expiration

  Binary_integer

  過期的秒數如果該消息還沒有被從隊列中取出那麼該消息將不會過期如果指定了過期時間過期時間是在延遲以後開始計算的在過期以後該消息被移動到異常隊列中此時的狀態是expired

  Correlation

  Varchar()

  關聯標識符如果需要的話可以按照關聯標識符檢索消息

  Attempts

  Binary_integer

  嘗試提取該消息的次數這個參數僅僅用於dequeue

  Recipient_list

  Aq$recipient_list_t

  此消息的接收都列表此參數在enqueue執行時被讀出而在dequeu操作時並不返回它

  Exception_queue

  Varchar()

  此消息的異常隊列如果消息過期或者queue操作的次數超過了max_retres那麼該消息就被移動到異常隊列中其狀態為expired如果沒有指定exception_queue那麼該消息就被移動到隊列表的缺省異常隊列中如果指定了exception_queue但是在移動時此隊列不定期是無效的那麼該消息將被移動到隊列表的缺省異常隊列中同時該消息也被寫入警報日志中

  Enqueue_time

  Date

  消息插入隊列的時間這個參數將被dequeue返回在執行enqueue操作時它自動被系統所設定

  State

  Binary_integer

  在執行dequeue操作時消息的狀態這個參數不能由enqueue所設定它會被系統自動進行更新其取值為waiting(消息延遲還滑到達)ready(消息已准備被處理)processed(消息已被處理但是還保留在隊列中)和expired(消息已被移動到異常隊列中)

   ENQUEUE_OPTIONS_T

  Type enqueue_option_t is record

  (

  Visibility binary_integer default no_commit

  Relative_msgid raw() default null

  Sequence_deviation binary_integer default null

  )

  參數說明

  字段

  數據類型

  說明

  Visibility

  Binary_integer

  指定事務的行為如果visibility是on_commit那麼當當前事務提交以後該enqueue將完成如果visibility是immediate時那麼enqueue將構建一個單獨的立即被提交的事務即使當前事務被撤消了該enqueue操作也將會執行

  Relative_msgid

  Raw

  如果在sequeue_deviation中指定了before那麼在由relative_msgid所標識的消息的前面會插入此消息如果沒有指定sequence_deviation那麼將忽略relative_msgid

  Sequence_deviation

  Binary_integer

  指定在隊列中此消息的位置有效的取值為before(該消息將被插入到由relative_msgid所標識的消息的前面)top(該消息將被插入到所有其他消息的前面)以及NULL(該消息的優先級指定了在隊列中它的位置)缺省值是NULL

   DEQUEUE_OPTIONS_T

  Type dequeue_options_t is record

  (

  Consumer_name varchar() default null

  Dequeue_mode binary_integer default null remove

  Navigation binary_integer default next_message

  Visibility binary_integer default on_commit

  Wait binary_integer default forever

  Msgid raw() default null

  )

  參數說明

  字段

  數據類型

  說明

  Consumer_name

  Varchar()

  接收該消息的消費者名字如果指定了隊列中只有匹配此消費者的消息才會被處理如果該隊列沒有設置為供多個消費者所用那麼consumer_name應該是NULL

  Dequeue_mode

  Binary_integer

  指定dequeue操作的鎖定行為有效取值是browse(讀出消息同時並不加鎖和從隊列中刪除消息這類似於select)locked(讀出消息並得到關於該消息的一個寫操作鎖這類似於select for update)以及remove(讀出該消息然後更新或刪除該消息這要取決於該隊列的保留特性)Remove是缺省值

  Navigation

  Binary_integer

  指定要檢索的消息的位置在決定了該位置以後搜索條件(包括consumer_namemsgid和correlation)就會被應用有效的取值是next_message(檢索匹配搜索條件的下一個消息)next_transaction(如果當前的消息組中還有剩余的消息就跳過它們檢索匹配條件)

  Visibility

  Binary_integer

  指定是否dequeue是當前事務的一部分如果是on_commit(缺省值)那麼dequeue操作就是當前事務的一部分如果是immediate那麼dequeue操作是其自身的一個事務該事務會立即被提交

  Wait

  Binary_integer

  指定如果當前沒有匹配搜索條件的消息時等待的秒數如果同一個組中的消息正被執行dequeue操作那麼這個參數就會被忽略有效取值是forever(沒有超時這是缺省設置)no_wait(不等待如果沒有所需要的消息則立即返回)或者要等待的秒數

  Msgid

  Raw()

  指定要執行dequeue操作的消息標識符

  Correlation

  Varchar()

  指定要執行dequeue操作的關聯標識符

  枚舉常量

  DBMS_AQ中支持類型的許多字段都是枚舉常量這此字段被定義為binary_integer而DBMS_AQ定義相應的取值在設置了這些選項以後它們需要使用其包名作為前綴例如DBMS_AQIMMEDIATE下面的表列出了所有枚舉常量它們的取值以及它們用在何處

  字段

  取值

  使用位置

  Sequeue_deviation

  Beforetop

  Enqueue_options_t

  Visibility

  Immediateon_commit

  Enqueue_options_t

  Dequeue_mode

  Browselockedremove

  Dequeue_options_t

  Navigation

  First_messagenext_messagenext_transaction

  Dequeue_options_t

  Wait

  Foreverno_wait

  Dequeue_options_t

  State

  Waitingreadyprocessedexpired

  Message_properties_t

  Delay

  No_delay

  Message_properties_t

  Expiration

  Never

  Message_properties_t

  過程定義:

  一Enqueue

  Procedure enqueue(

  Queue_name in varchar

  Enqueue_options in enqueue_options_t

  Message_properties in message_properties_t

  Payload in message_type

  Msgid out raw);

  參數說明:

  字段

  數據類型

  說明

  Queue_name

  Varchar

  應該插入消息的隊列

  Enqueue_options

  Enqueue_options_t

  Enqueue的選項

  Message_properties

  Message_properties_t

  消息的屬性這些屬性將會在下一個dequeue操作中返回

  Payload

  Message_type

  消息數據這可能是raw類型或對象類型如果它是對象類型那麼它必須匹配在創建時指定的類型

  Msgid

  Raw

  返回的消息ID這個ID可以用來對此特定的消息執行dequeue操作無論優先級或延遲是多少

  Enqueue選項的sequeue_deviation字段指定了在兩個消息之間的關系如果指定了這個字段那麼對於被插入隊列的消息的延遲和優先級有兩個限制:

  [list=]

  新插入隊列的消息延遲必須少於或者等於在此消息被插入隊列以前的消息延遲

  新插入隊列的消息的優先級必須大於或者等於在此消息被插入隊列以前的消息的優先級

  二dequeue

  Procedure dequeue(

  Queue_name in varchar

  dequeue_options in enqueue_options_t

  Message_properties in message_properties_t

  Payload in message_type

  Msgid out raw);

  Dequeue的搜索條件是由consumer_namemsgid和/或dequeue_options的correlation字段決定的如果沒有指定msgid那麼只有ready狀態的消息會從隊列中被刪除

  三create_queue_table

  Create_queue_table用於創建隊列表並指定稍後在本表上創建的隊列的缺省屬性其中包括隊列的排序次序

  a 與此隊列表相關聯的缺省異常隊列稱為aq$_queue_table_e

  b 可以用於查詢隊列的只讀視圖稱為aq$_queue_table

  c 時間管理所用的索引稱為aq$_queue_table_t

  d 多個消費者隊列的索引稱為aq$_queue_table_i

  Procedure create_queue_table(

  Queue_table in varchar

  Queue_payload_type in varchar

  Storage_clause in varchar default null

  Sort_list in varchar default null

  Multiple_consumers in Boolean default false

  Message_grouping in binary_integer default none

  Commet in varchar default null

  Auto_commit in Boolean default true);

  參數

  數據類型

  說明

  Queue_table

  Varchar

  要創建的隊列表的名字

  Queue_payload_type

  Varchar

  此隊列中的用戶數據的類型它應該是raw或對象類型的

  Storage_clause

  Varchar

  用在create table 語句中的存儲參數

  Sort_list

  Varchar

  定義用作排序主鍵的列這樣就可以對這個表中創建的隊列進行排序了

  Multiple_consumers

  Boolean

  如果為true在此表中創建的隊列可以對每個消息擁有多個消費者該用戶必須要首先使用grant_type_access被授予類型訪問權限如果為false(缺省值)那麼在此表中創建的隊列只能對一個消息有一個消費者

  Message_grouping

  Binary_integer

  如果為NONE(缺省值)那麼在此隊列表中創建的隊列中每個消息被單獨進行處理如果是transactional那麼作為一個事務的一部分而被插入所有的消息都被認為是同一個消息組的一部分這樣就會同時從隊列中刪除了

  Comment

  Varchar

  新創建的表的注釋它將被記錄到隊列目錄中

  Auto_commit

  Boolean

  如果是true(缺省值)當前事務在隊列表被創建以前被提交當create_queue_table返回時該操作生效如果為false那麼創建操作是當前事務的一部分並將在當前事務提交時該操作生效

  四Drop_queue_table(

  Queue_table in varchar

  Force in Boolean default false

  Auto_commit in Boolean default true);

  參數說明:

  Force:如果為true該表中的所有隊列都自動停止並被刪除如果是false那麼如果在表中仍有隊列會返回一個錯誤

  五Create_queue

  在指定的隊列表中創建一個隊列隊列名必須在當前數據模式中是唯一的缺省情況下對該隊列的enqueue和dequeue操作是被屏蔽的在創建了該隊列以後必須使用start_queue來使得enqueue和dequeue操作生效

  Procedure create_queue(

  Queue_name in varchar

  Queue_table in varchar

  Queue_type in binary_integer default normal_queue

  Max_retries in number default

  Retry_delay in number default

  Retention_time in number default

  Dependency_tracking in Boolean default false

  Comment in varchar default null

  Auto_commit in Boolean default true);

  參數說明:

  參數

  數據類型

  說明

  Queue_name

  Varchar

  要創建的隊列的名字

  Queue_table

  Varchar

  將要包含新創建的隊列的隊列表

  Queue_type

  Binary_integer

  隊列類型有效取值是normal_queue(創建通常的隊列)或exception_queue(創建異常隊列)

  Max_retries

  Number

  嘗試dequeue操作(指定remove)的最大次數如果一個代理從隊列中刪除消息但是稍後又撤消了其事務那麼計數值也會增加當計數值到達了max_retries該消息會被移動到異常隊列中

  Retry_delay

  Number

  在兩次嘗試之間的秒數如果max_retries是以那麼retry_delay就不起作用如果該隊列有多個消息者那麼就不能指定retry_delay

  Retention_time

  Number

  消息在被執行dequeue以後在隊列表中保留的秒數有效值是infinite(該消息將被永遠保留)或一定的秒數default

  Dependency_tracking

  Boolean

  該參數被保留用作將來之用

  Comment

  Varchar

  對新創建的隊列的說明此注釋將被添加到隊列目錄中

  Auto_commit

  Boolean

  如果為true那麼在該隊列被創建以前當前是會被提交當create_queue返回時該操作會生效如果是false那麼當當前事務提交時該操作將生效

  六.Drop_queue

  從隊列中刪除一個已存在的隊列在被刪除以前該隊列必須使用STOP_QUEUE予以停止在執行此操作時所有的隊列數據都將被刪除

  Procedure drop_queue(

  Queue_name in varchar

  Auto_commit in Boolean default true);

  七.Alter_queue

  此過程用於修改隊列的某些屬性只有max_retriesretry_delay和retention_time屬性可以被修改如果要改變其他屬性那麼該隊列必須要被刪除並重新生成

  Procedure alter_queue(

  Queue_name in varchar

  Max_retries in number default null

  Retry_delay in number default null

  Retention_time in number default null

  Auto_commit in Boolean default true);

  參數

  數據類型

  說明

  Queue_name

  Varchar

  要修改的隊列的名字

  Max_retries

  Number

  嘗試dequeue操作(指定remove)的最大次數如果一個代理從隊列中刪除消息但是稍後又撤消了其事務那麼計數值也會增加當計數值到達了max_retries該消息會被移動到異常隊列中

  Retry_delay

  Number

  在兩次嘗試之間的秒數如果max_retries是那麼retry_delay就不起作用如果該隊列有多個消費者那麼就不能指定retry_delay

  Retention_time

  Number

  消息在被執行dequeue以後在隊列表中保留的秒數有效值是infinite(該消息將被永遠保留)或一定的秒數缺省值是

  Auto_commit

  Boolean

  如果是true那麼在該隊列被創建以前當前是會被提交當alter_queue返回時該操作會生效如果是false那麼當當前事務提交時該操作將生效

  八Start_queue

  用於使得對一個隊列運行進行enqueue和/或dequeue操作在創建以後隊列必須使用此函數啟動對於異常對象進行dequeue操作所以對於異常隊列來打開允許enqueue操作的設置是不起作用的在此過程返回時該隊列被啟動甚至即使該事務撤消了

  Procedure start_queue(

  Queue_name in varchar

  Enqueue in Boolean default true

  Dequeue in Boolean default true);

  Enqueuedequeue分別指定了該隊列應該允許執行enqueue和dequeue操作

  九Stop_queue

  用於對指定隊列進行屏蔽enqueue和/或dequeue操作如果對隊列正在執行事務時是不能停止該隊列的當該過程返回時此隊列會被停止使用 甚至即使該事務撤消了

  Procedure stop_queue(

  Queue_name in varchar

  Enqueue in Boolean default true

  Dequeue in Boolean default true

  Wait in Boolean default true);

  如果wait是true那麼此調用將被阻塞直到所有針對queue_name的事務被提交或被撤消為止如果是false那麼stop_queue將立即返回成功或是失敗

  十Add_subscriber

  將向隊列中添加一個缺省的預約者這僅對擁有多個消費者的隊列是有效的Add_subscriber會立即生效並且當前的事務會提交用戶通過Grant_type_acces必須被授予訪問此隊列的權限

  Procedure add_subscriber(

  Queue_name in varchar

  Subscriber in sysaq$_agent);

  Subscriber是新的預約者

  十一Remove_subscriber

  此過程將從指定的隊列中刪除指定預約者 Remove_subscriber會立即生效並且當前的事務會提交用戶通過Grant_type_acces必須被授予訪問此隊列的權限

  Procedure Remove_subscriber(

  Queue_name in varchar

  Subscriber in sysaq$_agent);

  十二queue_subscribers

  此函數指定隊列的預約者的PL/SQL表

  Function queue_subscribers(

  Queue_name in varchar)

  Return aq$_subscriber_list_t;

  十三Grant_type_access

  Grant_type_access用於使得一個用戶能夠執行隊列管理操作如果不使用該過程那麼用戶將不能執行Create_queue_tableCreate_queueAdd_subscriber和remove_subscriber

  Procedure grant_type_access(

  User_name in varchar);

  User_name 是要被授予權限的數據庫用戶

  十四Start_time_manager

  此過程啟動時間管理進程AQ_TM_PROCESS initora參數必須先被設置為這會在數據庫啟動的時候啟動該進程當這個調用返回的時候時間管理器被啟動即使當前的事務被撤銷無參數

  Procedure start_time_manager;

  十五Stop_time_manager

  使得時間管理器失效但是它不終止該進程它只是使得該進程停止其工作當此調用返回時時間管理器將被停止即使當前的事務被撤銷了

  Procedure stop_time_manager;

  人生有三寶:終身運動終身學習終身反醒吸收新知提高效率懂得相處成就自己也成就他人創造最高價值


From:http://tw.wingwit.com/Article/program/Oracle/201311/16990.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.