2009-06-19 57 views
11

我有一個應用程序使用Oracle高級排隊的JMS操作。我想在顯示消息內容的隊列表上進行查詢(在我的例子中是XML)。所以當我做'從[queue_table]'中選擇user_data'時,我得到'AQ SYS.AQ $ _JMS_TEXT_MESSAGE'作爲響應。

是否有一個函數可以顯示此消息的內容?像'select_function(user_data)from [queue_table]'或類似的東西?

我使用Google搜索了很多關於排隊的Oracle文章,但是我找不到這個東西。我懷疑有一個簡單的方法來做到這一點,但我找不到它。

回答

10

我也在爲此而苦苦掙扎。我在這裏寫了一個答案:http://rwijk.blogspot.com/2009/02/whats-in-my-jms-queue.html

Regards, Rob。

+1

「select queue.user_data.text_vc from [queue_table] queue」 我在這裏添加了答案,所以我可以提出答案作爲問題的解決方案,我希望答案是完整的。 – 2009-06-23 22:43:50

+1

我發現較大的文本存儲在queue.user_data.text_lob而不是text_vc – 2009-09-11 11:35:36

4

,所以我想它應該是:

select queue.user_data.text_vc from [queue_table] queue 
+1

正是如此。您應該在user_data.text_vc前使用別名或table_name本身。否則,它會開始尋找包含名爲text_vc的函數的包user_data,導致出現錯誤消息ORA-00904:「USER_DATA」。「TEXT_VC」:無效的標識符 – 2009-06-20 12:42:04

0

請嘗試以下命令:從[queue_table]

選擇USER_DATA名

1

這些問題的答案在這裏不處理的更大的顯示內容,保存在user_data.text_lob。 如果含量超過一定量字節(4000?)的,text_vcnull更大,你要看看text_lob(這將是null否則)

爲了顯示所有的數據,不管它的大小,你可以使用nvl使用以下查詢:

SELECT nvl(q.user_data.text_vc, q.user_data.text_lob) FROM [queue_table] q

我想你可以(也應該考慮到)使用coalesce代替nvl,因爲它doesn't evaluate the second argument,如果第一個是已不同,但我還沒有測試過那個。

1

加成到Stuxnet蠕蟲的評論:

SELECT nvl(to_clob(q.user_data.text_vc), q.user_data.text_lob) FROM queue_table q; 

沒有TO_CLOB你會得到ORA-22835爲4000個字符大數據,因爲它保留了第一個參數,這是唯一VARCHAR2的空間。