2009-06-19 8 views
11

Ho un'applicazione che utilizza JMS op in cima all'accodamento avanzato Oracle. Vorrei fare una query sulla tabella della coda che mostra il contenuto del messaggio (che nel mio caso è XML). Così quando faccio un 'select user_data from [queue_table]' ottengo 'AQ SYS.AQ $ _JMS_TEXT_MESSAGE' come risposta.

Esiste una funzione per visualizzare il contenuto di questo messaggio? Qualcosa come 'selezionare FUNCTION (user_data) from [queue_table]' o qualcosa del genere?

I google, ho scansionato numerosi articoli Oracle sull'accodamento, ma non riesco a trovare questa cosa. Sospetto che ci sia un modo semplice per farlo, ma non riesco a trovarlo.

risposta

10

Ho lottato anche con questo. Ho scritto una risposta qui: http://rwijk.blogspot.com/2009/02/whats-in-my-jms-queue.html.

Cordiali saluti, Rob.

+1

"seleziona queue.user_data.text_vc dalla coda [queue_table]" Ho aggiunto la risposta qui, così posso promuovere la risposta come soluzione al problema e voglio che la risposta sia completa. –

+1

Ho trovato che il testo più grande è memorizzato in queue.user_data.text_lob invece di text_vc –

4

quindi suppongo che dovrebbe essere:

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

Esattamente. Dovresti usare un alias o table_name stesso di fronte a user_data.text_vc. Altrimenti inizia la ricerca di un pacchetto user_data contenente una funzione chiamata text_vc, che genera il messaggio di errore ORA-00904: "USER_DATA". "TEXT_VC": identificatore non valido –

0

Si prega di provare il seguente comando:

selezionare user_data da [queue_table] nome

+1

La domanda aveva già una risposta 2 anni fa. –

1

Le risposte qui non gestiscono la visualizzazione dei più grandi contenuto, memorizzato in user_data.text_lob. Se il contenuto è più grande di una certa quantità di byte (4000?), text_vc sarà null e si deve guardare text_lob (che sarebbe null altrimenti)

Al fine di visualizzare tutti i dati, a prescindere la sua dimensione, è possibile utilizzare la seguente query utilizzando nvl:

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

Credo che si potrebbe (e dovrebbe prendere in considerazione a) usare coalesce invece di nvl, perché doesn't evaluate the second argument, se il primo è già diverso da 0.123., ma non l'ho ancora provato.

1

aggiunta al commento di Stuxnet:

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

senza to_clob otterrete ORA-22835 per i dati più grandi di 4000 caratteri perché conserva lo spazio del primo argomento, che è solo VARCHAR2.

Problemi correlati