Domanda

Buon pomeriggio.

Ho lavorato con Oracle code avanzati per creare un sistema di messaggistica che possiamo utilizzare per determinare quando le nuove linee sono passati nel databse, quando gli aggiornamenti si verificano e quando si verificano le eliminazioni.

Sto usando una singola coda consumatori e utilizzando correlazioni di controllare ciò che i dati che si cerca in determinati orari e il mio carico utile è di XMLType.

Per generare il codice XML, che in origine stava usando un xmlsequence per generare il messaggio come di seguito.

<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>

Tuttavia, si è giunti alla mia attenzione che le foglie xmlsequence fuori elementi nulli, che non è l'ideale, come quando arriva il momento per i messaggi per essere ritirati presso l'altra estremità, non possono essere mappati sul campo di dati con facilità. Per cercare di risolvere questo problema, ho cercato di impiegare l'uso di DBMS_XMLGEN nel mio grilletto, in quanto consente la gestione dei valori nulli esattamente nel modo che vorrei ha gestito.

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);

Il problema di questo approccio è che esso genera un'eccezione, in quanto sta cercando di operare sulla stessa tabella che il grilletto è stato eseguito da.

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

Quindi sono passato a cercare di usare i vecchi e nuovi oggetti per ottenere i dati fuori e metterlo dentro al contesto, ma io sono in esecuzione per qualche piccolo inconveniente con i valori che sono nulli, come stanno giocando il caos con il mio li concatenando in alla stringa di query.

...
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;

Quindi la mia domanda è: Come posso fare per risolvere questo in modo che posso vedere i miei elementi vuoti per il mio tipo xml

Sono anche aperti ai suggerimenti lungo la strada su come risolverlo e sarà il controllo indietro per eventuali richieste di chiarimenti.

È stato utile?

Soluzione

to generate a simple row in XML you can use 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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top