2009-06-19 18 views
11

Tengo una aplicación que utiliza JMS en la parte superior de la cola avanzada de Oracle. Me gustaría hacer una consulta en la tabla de cola que muestra el contenido del mensaje (que en mi caso es XML). Entonces, cuando hago 'select user_data from [queue_table]' obtengo 'AQ SYS.AQ $ _JMS_TEXT_MESSAGE' como respuesta.

¿Existe una función para que se muestre el contenido de este mensaje? Algo como 'seleccionar FUNCTION (user_data) de [queue_table]' o algo así?

Busqué en Google, analicé numerosos artículos de Oracle sobre cola, pero no puedo encontrar esto. Sospecho que hay una manera simple de hacer esto, pero no puedo encontrarlo.

Respuesta

10

Tuve problemas con este también. He escrito una respuesta aquí: http://rwijk.blogspot.com/2009/02/whats-in-my-jms-queue.html.

Saludos, Rob.

+1

"select queue.user_data.text_vc from [queue_table] queue" Agregué la respuesta aquí, así que puedo promocionar la respuesta como la solución al problema, y ​​quiero que la respuesta se complete. –

+1

He encontrado que el texto más grande se almacena en queue.user_data.text_lob en lugar de text_vc –

4

así que supongo que debe ser:

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

Exactamente. Debe usar un alias o el nombre de la tabla delante de user_data.text_vc. De lo contrario, comienza a buscar un paquete user_data que contenga una función llamada text_vc, que da como resultado el mensaje de error ORA-00904: "USER_DATA". "TEXT_VC": identificador no válido –

0

Inténtelo el siguiente comando:

seleccione user_data de [queue_table] nombre

+1

La pregunta ya fue respondida hace 2 años. –

1

Las respuestas aquí no manejan la pantalla de mayor contenido, almacenado en user_data.text_lob. Si el contenido es mayor que una cierta cantidad de bytes (4000?), text_vc habrá null y hay que mirar a text_lob (que sería null lo contrario)

Con el fin de mostrar todos los datos, independientemente de su tamaño, se puede utilizar la siguiente consulta utilizando nvl:

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

Creo que se puede (y debe tener en cuenta a) utilizar coalesce en lugar de nvl, porque doesn't evaluate the second argument, si el primero ya es diferente a 0.123., pero aún no lo he probado.

1

adición a la observación de Stuxnet:

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

sin TO_CLOB obtendrá-22835 ORA para los datos de más de 4000 caracteres, ya que preserva el espacio del primer argumento, que sólo está VARCHAR2.

Cuestiones relacionadas