génération Oracle XMLType avec des valeurs nulles de déclenchement à la file d'attente avancé

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

  •  11-10-2019
  •  | 
  •  

Question

Bonjour.

Je travaille avec Oracle Files d'attente avancés pour créer un système de messagerie que nous pouvons utiliser pour déterminer quand les nouvelles lignes sont transmises dans le databse, lorsque les mises à jour se produisent et lorsque surviennent des suppressions.

J'utilise une seule file d'attente des consommateurs et en utilisant des corrélations pour contrôler les données est recherchée à certains moments et ma charge utile est de XMLType.

Pour générer le xml, j'utilisais à l'origine d'un xmlsequence pour générer le message comme ci-dessous.

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

Cependant, il est venu à mon attention que les feuilles de xmlsequence sur des éléments nuls, ce qui est pas idéal, comme quand il vient le temps pour les messages à chercher à l'autre bout, ils ne peuvent pas être mises en correspondance sur le champ de données facilement. Pour essayer de travailler autour de cela, je l'ai essayé d'employer l'utilisation de DBMS_XMLGEN dans mon déclencheur, car elle permet la manipulation de nulls exactement comme je le veux traité.

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

Le problème avec cette approche est qu'elle génère une exception, car il essaie de fonctionner sur la même table que le déclencheur a été exécuté à partir.

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

Alors je suis passé à essayer d'utiliser les objets anciens et nouveaux pour obtenir les données et placez-le dans le contexte, mais je suis en cours d'exécution pour quelques accrocs avec les valeurs qui sont nulles, car ils jouent des ravages avec mon les concaténer dans la chaîne de requête.

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

Alors ma question est: Comment puis-je faire pour résoudre ce afin que je puisse voir mes éléments vides pour mon type xml

Je suis aussi ouvert aux suggestions le long du chemin sur la façon de le résoudre et sera de retour pour la vérification des demandes de clarification.

Était-ce utile?

La solution

pour générer simple ligne de XML, vous pouvez utiliser 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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top