Aprés une migration de 10gR2 vers 11gR2, une application utilisant les packages DBMS_XMLQUERY pour générer des documents xml est en erreur. Le format des dates a changé, qu’a fait le DBA ?

Un examen des paramètres NLS ne révèle pas de différences entre les deux environnements, au niveau database. La documentation sur le sujet est identique en version 11.2 et 10.2, comme vous pouvez le constater.

S’est posé alors à moi la question suivante : de quoi dépend le résultat ? Y a-t-il une dépendance au NLS_DATE_FORMAT de l’instance ou de la session ?

Pour cela, une fonction de validation fut écrite :

create or replace function xmldate return clob as
ctxhdl dbms_xmlquery.ctxtype;
begin
ctxhdl:=dbms_xmlquery.newcontext('select sysdate from dual'); 
return(dbms_xmlquery.getxml(ctxhdl));
end;
/

Cette fonction fut testé avec la commande suivante : select xmldate from dual;
On constate rapidement que le xml généré n’est pas dépendant du NLS_DATE_FORMAT.

Test 1 :

alter session set NLS_DATE_FORMAT='DD-MON-RR HH12:MI:SS';select '11.2.0.1',sysdate , xmldate from dual;
 alter session set succeeded.
 
'11.2.0.1' SYSDATE                   XMLDATE                                       
---------- ------------------------- -----------------------------------------------
11.2.0.1   02-DEC-10 01:13:00                                                                        
                                
 2010-12-02 13:13:00           

                               

Test 2 :

alter session set NLS_DATE_FORMAT='YYYYMMDD HH24:MI:SS';select '11.2.0.1',sysdate , xmldate from dual;
alter session set succeeded.
'11.2.0.1' SYSDATE                   XMLDATE                                    
---------- ------------------------- --------------------------------------------
11.2.0.1   20101202 13:13:44                              
                                                                                             
                                                                                     
                                                          2010-12-02 13:13:44 

Si ce n’est le format de date de la session, serait-ce la version ?

Version Résultat  
10.2.0.4 12/2/2010 13:37
11.1.0.7 12/2/2010 13:44
12.2.0.1 2010-12-02 13:13:00

On constate un changement de comportement en version 12.2.0.1. Est-ce un bug ?
Le support Oracle nous a rappelé qu’une fonction existait pour definir le format dont nous avions besoin. 🙂

Ajoutez la ligne suivante dans le code de la fonction xmldate et le format sera toujours le même.

dbms_xmlquery.setdateformat(ctxhdl, ‘MM/dd/yyyy HH:mm’);

Heureusement qu’il y a des bonnes pratiques… 🙂
Bon XML !