generación de Oracle XMLType con los valores nulos de gatillo para hacer cola avanzada

StackOverflow https://stackoverflow.com/questions/4467080

  •  11-10-2019
  •  | 
  •  

Pregunta

Buenas tardes.

He estado trabajando con Oracle colas avanzadas para crear un sistema de mensajería que podemos utilizar para determinar cuando las nuevas líneas se pasan en el DATABSE, cuando las actualizaciones se producen cuando se produzcan eliminaciones.

Estoy utilizando una única cola de los consumidores y el uso de correlaciones para el control de los datos que se buscaban en determinados momentos y mi carga útil es de XMLType.

Para generar el XML, que originalmente estaba utilizando un xmlsequence para generar el mensaje como a continuación.

<MESSAGE>
<LOCATIONS>
  <LOCATION_ID>9999</LOCATION_ID>
  <LOC_TYPE>S</LOC_TYPE>
  <NAME>Test Location</NAME>
  <RETAILER_UNIT_CODE>T&amp;L</RETAILER_UNIT_CODE>
  <REGION_CODE>SA</REGION_CODE>
  <DELETE_FLAG>N</DELETE_FLAG>
  <EXTERNAL_WHSE_FLAG>N</EXTERNAL_WHSE_FLAG>
  <CREATED_BY>SYSADMIN</CREATED_BY>
  <CREATED_DATE>04/MAR/08</CREATED_DATE>
  <STATE_CODE>SA</STATE_CODE>
  <ADDRESS>223 Road Ridsonville</ADDRESS>
  <POSTCODE>1234</POSTCODE>
  <PHONE_NUM>08 </PHONE_NUM>
  <LAST_MODIFIED_BY>SYSADMIN</LAST_MODIFIED_BY>
  <LAST_MODIFIED_DATE>21/APR/09</LAST_MODIFIED_DATE>
  <POS_CODE>TRANS</POS_CODE>
  <SOP_FLAG>N</SOP_FLAG>
</LOCATIONS>
</MESSAGE>

Sin embargo, ha llegado a mi conocimiento que las hojas xmlsequence Sin elementos nulos, lo cual no es ideal, ya que cuando llega el momento de los mensajes a ser recogidos en el otro extremo, no pueden ser mapeados en el campo de datos de forma sencilla. Para tratar de solucionar este problema, he tratado de emplear el uso de DBMS_XMLGEN dentro de mi gatillo, ya que permite el manejo de los nulos exactamente de la manera que me gustaría que maneja.

ctx := dbms_xmlgen.newContext('SELECT * FROM LOCATIONS WHERE LOCATION_ID = ' || :new.LOCATION_ID);
dbms_xmlgen.setrowsettag(ctx, 'MESSAGE');
dbms_xmlgen.setrowtag(ctx, 'LOCATIONS');
dbms_xmlgen.setnullhandling(ctx, dbms_xmlgen.EMPTY_TAG);
l_xml:=dbms_xmlgen.getxmltype(ctx);

El problema con este enfoque es que se generará una excepción, ya que está tratando de operar en la misma tabla que el gatillo se ha ejecutado de.

ORA-04091: table RIT.LOCATIONS is mutating, trigger/function may not see it

Así que pasé a tratar de utilizar los nuevos y antiguos objetos para obtener los datos y colocarlo en el contexto, pero estoy corriendo a algunos contratiempos con los valores que son nulas, ya que están haciendo estragos con mi concatenar ellos en la cadena de consulta.

...
REFERENCING NEW AS NEW OLD AS OLD
for each row 
DECLARE
l_xml   xmltype;
ctx       dbms_xmlgen.ctxHandle;
begin
ctx := dbms_xmlgen.newContext('SELECT   '||:new.id||'as id, '||:new.nullfield||' as nullfield from dual');
dbms_xmlgen.setrowsettag(ctx, 'MESSAGE');
dbms_xmlgen.setrowtag(ctx, 'INT_CREDIT_CLAIMS');
dbms_xmlgen.setnullhandling(ctx, dbms_xmlgen.EMPTY_TAG);
l_xml:=dbms_xmlgen.getxmltype(ctx);
...
end;

Así que mi pregunta es: ¿Cómo puedo ir sobre la solución de este modo que pueda ver mis elementos vacíos para mi tipo XML

También estoy abierto a sugerencias en el camino sobre cómo resolverlo y será revise de nuevo para cualquier solicitud de aclaración.

¿Fue útil?

Solución

para generar una fila simple en XML que puede utilizar xmlelement:

SQL> CREATE TABLE emp AS SELECT * FROM scott.emp;

Table created

SQL> CREATE TABLE message (xml XMLTYPE);

Table created

SQL> CREATE OR REPLACE TRIGGER trg_b4_emp
  2     BEFORE UPDATE ON emp
  3     FOR EACH ROW
  4  BEGIN
  5     INSERT INTO message VALUES (
  6       xmlelement("MESSAGE",
  7           xmlelement("EMP",
  8              xmlelement("empno", :new.empno),
  9              xmlelement("comm", :new.comm)
 10           )
 11        )
 12     );
 13  END;
 14  /

SQL> update emp set comm=NULL;

14 rows updated

SQL> select * from message where rownum = 1;

XML
----------------------------------------------------------------
<MESSAGE><EMP><empno>7369</empno><comm></comm></EMP></MESSAGE>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top