2015-03-19 3 views
0

У меня есть проблема с форматом даты, когда преобразование из объекта в XML, потому что не ISO8601PL/SQL тип Преобразование объекта в XML Дата не ISO8601

Пример:

CREATE OR REPLACE TYPE APPS.MYOBJECT IS OBJECT (
MYDATE_1 DATE, 
MYDATE_2 DATE); 



DECLARE 
    v_myobject MYOBJECT; 
    v_xml XMLTYPE; 
BEGIN 
    v_myobject:=new MYOBJECT(SYSDATE,SYSDATE); 
    v_xml:=XMLTYPE(v_myobject); 
    DBMS_OUTPUT.put_line('XML='||v_xml.getstringval); 
END; 

выход этого:

XML=<MYOBJECT><MYDATE_1>19-MAR-15</MYDATE_1><MYDATE_2>19-MAR-15</MYDATE_2></MYOBJECT> 

и я хочу Дата в формате ISO8601, как это:

XML=<MYOBJECT><MYDATE_1>2015-02-19T15:16:00Z</MYDATE_1><MYDATE_2>2015-02-19T15:16:00Z</MYDATE_2></MYOBJECT> 

Есть ли способ указать формат преобразования типа данных DATE ???

Благодаря

ответ

1

Не идеально, но в качестве обходного пути вы можете изменить свой NLS_DATE_FORMAT:

alter session set nls_date_format = 'YYYY-MM-DD HH24:MI:SS'; 

set serveroutput on 
DECLARE 
    v_myobject MYOBJECT; 
    v_xml XMLTYPE; 
BEGIN 
    v_myobject:=new MYOBJECT(SYSDATE,SYSDATE); 
    v_xml:=XMLTYPE(v_myobject); 
    DBMS_OUTPUT.put_line('XML='||v_xml.getstringval); 
END; 
/

Session altered. 
anonymous block completed 
XML=<MYOBJECT><MYDATE_1>2015-03-19 18:42:23</MYDATE_1><MYDATE_2>2015-03-19 18:42:23</MYDATE_2></MYOBJECT> 

Вы можете включать в себя фиксированный T и Z, если нужны те, используя вместо этого:

alter session set nls_date_format = 'YYYY-MM-DD"T"HH24:MI:SS"Z"'; 

Или dbms_xmlqueryseems to handle dates closer to what you expect, так что вы можете сделать это:

-- just to check we are not just picking up the previous value! 
alter session set nls_date_format = 'DD/MM/YYYY'; 
DECLARE 
    v_xml XMLTYPE; 
    v_ctx dbms_xmlquery.ctxhandle; 
BEGIN 
    v_ctx := dbms_xmlquery.newcontext('select MYOBJECT(SYSDATE,SYSDATE) MYOBJECT from dual'); 
    dbms_xmlquery.setrowtag(v_ctx, null); 
    dbms_xmlquery.setrowsettag(v_ctx, null); 
    v_xml := XMLTYPE(dbms_xmlquery.getxml(v_ctx)); 
    dbms_xmlquery.closecontext (v_ctx); 

    DBMS_OUTPUT.put_line('XML='||v_xml.getstringval); 
END; 
/

Session altered. 
anonymous block completed 
XML=<?xml version = '1.0'?> 
<MYOBJECT> 
    <MYDATE_1>2015-03-19 19:07:41</MYDATE_1> 
    <MYDATE_2>2015-03-19 19:07:41</MYDATE_2> 
</MYOBJECT> 

Но это предполагает, что объект не нужен для чего-либо еще внутри блока. И не имеет T и Z, если они важны.

+0

Я не знаком с объектами в PL/SQL, но не будет 'TO_CHAR (sysdate, 'format is here here)' 'работа тоже? –

+0

@ Mr.Llama - тип данных поля объекта - это дата, хотя, по крайней мере, в этом примере. Вместо этого использование строкового поля может работать, но зависит от того, для чего используется тип объекта. И не уверен, что вы можете изменить поведение объекта по умолчанию «на строку»; Я не вижу, как, но я не использую объекты, поэтому я могу что-то упустить. Вы можете построить XMLType из элементов на основе полей объекта вручную, я полагаю, но это тоже большая работа. –

+0

С помощью EXECUTE IMMEDIATE 'alter session set nls_date_format =' 'YYYY-MM-DD "T" HH24: MI: SS "Z"' ''; работает нормально – Kaltresian