暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle XML、日期/时间格式和空列的游标

askTom 2017-04-10
767

问题描述

https://livesql.oracle.com/apex/livesql/file/content_ET2CD8U5GO17VY2H0CJ8REEWL.html


11g版本2 XE,12c SE版本1,12c SE版本2

从游标转换时XML中的日期时间

嗨,克里斯,康纳,玛丽亚,

我正在与很少的同事一起从事utPLSQL v3项目,并且面临着巨大的挑战。
我想利用SQL或PL/SQL的XML方法将任何光标转换为XML但有一个陷阱。

我们的功能需要能够将任何光标转换为XMLTYPE。当输入utPLSQL代码时,光标将已经打开。

我已经意识到,Oracle正在使用在光标打开时定义的NLS会话设置将日期数据类型转换为XML元素。问题在于,会话NLS设置可以设置为任何内容 (不受框架控制),并且通常设置为松散时间,并且仅包含日期信息。有关日期/时间的不完整信息使游标到XML的信息变得松散 (有时确实很重要)。

芬兰人已经在Oracle 10g上描述了类似的困难。
https://ellebaek.wordpress.com/2011/01/27/converting-between-oracle-data-and-xml/

我已经在11g XE,12.1和12.2上对其进行了测试-看不到它的出路。

有没有办法影响日期数据类型的XML转换时使用:
-XMLSERIALIZE (光标)
-XMLTYPE.createXML (光标)
-DBMS_XMLGEN

另外,当使用XMLSERIALIZE或XMLTYPE.createXML转换为XML时,是否有将NULL列包含为空元素的选项?

我真的希望能够完全控制我的XML是如何格式化/生成的。

谢谢,
贾塞克


专家解答

您可以使用dbms_xmlgen.restartQuery重新处理查询。这将在您运行它后拾取您的新NLS设置:

declare
  c sys_refcursor;
  ctx  number;
  xdoc xmltype;
begin
  execute immediate q'[alter session set nls_date_format = 'yyyy-mm-dd']';
  open c for select sysdate from dual;
  execute immediate q'[alter session set nls_date_format = 'yyyy-mm-dd"T"hh24:mi:ss']';
  ctx := dbms_xmlgen.newContext(c);
  dbms_xmlgen.restartQuery(ctx);
  xdoc := dbms_xmlgen.getxmltype(ctx);  
  dbms_output.put_line(xdoc.getclobval());
  
  execute immediate q'[alter session set nls_date_format = 'dd-MON-yyyy']';
  dbms_xmlgen.restartQuery(ctx);
  xdoc := dbms_xmlgen.getxmltype(ctx);  
  dbms_output.put_line(xdoc.getclobval());
end;
/


 
  2017-04-11T02:51:45
 



 
  11-APR-2017
 


http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_xmlgen.htm#ARPLS69862

我不是XML专家,但看起来像XMLserailize的 “显示 | 隐藏默认值” 选项可能会帮助您显示空元素 (如果您有样式表):

http://docs.oracle.com/database/122/SQLRF/XMLSERIALIZE.htm#SQLRF06231
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论