2009-06-19 21 views
11

Ich habe eine Anwendung, die JMS op top Oracle erweiterte Warteschlangen verwendet. Ich möchte eine Abfrage in der Queue-Tabelle machen, die den Inhalt der Nachricht anzeigt (was in meinem Fall XML ist). Wenn ich also 'Select user_data from [queue_table]' anwähle, bekomme ich 'AQ SYS.AQ $ _JMS_TEXT_MESSAGE' als Antwort.

Gibt es eine Funktion, damit der Inhalt dieser Nachricht angezeigt werden kann? Etwas wie 'FUNCTION (user_data) von [queue_table] auswählen oder etwas?

Ich googelte, scannte zahlreiche Oracle-Artikel über Warteschlangen, aber ich kann dieses Ding nicht finden. Ich vermute, es gibt einen einfachen Weg, dies zu tun, aber ich kann es nicht finden.

Antwort

10

Ich kämpfte auch mit diesem. Ich habe hier eine Antwort geschrieben: http://rwijk.blogspot.com/2009/02/whats-in-my-jms-queue.html.

Grüße, Rob.

+1

"Wählen Sie queue.user_data.text_vc aus [queue_table] queue" Ich habe die Antwort hier hinzugefügt, so dass ich die Antwort als die Lösung für das Problem fördern kann, und ich möchte die Antwort abgeschlossen sein. –

+1

Ich habe festgestellt, dass größere Text in queue.user_data.text_lob statt text_vc –

4

Also nehme ich es sein sollte:

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

Exactly gespeichert werden. Sie sollten einen Alias ​​oder den table_name selbst vor dem user_data.text_vc verwenden. Andernfalls sucht es nach einem Paket user_data, das eine Funktion namens text_vc enthält, was zur Fehlermeldung ORA-00904: "USER_DATA" führt. "TEXT_VC": ungültige ID –

0

Bitte versuchen Sie den folgenden Befehl ein:

wählen user_data von [queue_table] Name

+1

Die Frage wurde bereits vor 2 Jahren beantwortet. –

1

Die Antworten hier nicht behandeln die Anzeige von größeren Inhalt, gespeichert in user_data.text_lob. Wenn der Gehalt größer als eine bestimmte Menge von Bytes (4000?), text_vc wird null und Sie haben bei text_lob suchen (die null sonst wäre)

Um alle Daten zu zeigen, egal es Größe ist, Sie können die folgende Abfrage mit nvl verwenden:

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

ich denke, man könnte coalesce (und prüfen, sollte) anstelle von nvl, weil es doesn't evaluate the second argument, wenn die erste ist schon anders als 0.123., aber ich habe das noch nicht getestet.

1

Zusatz zum Kommentar von Stuxnet:

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

ohne TO_CLOB Sie ORA-22835 für Daten, die größer als 4000 Zeichen bekommen, weil sie den Raum des ersten Arguments bewahrt, die nur VARCHAR2 ist.