问题描述
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是如何格式化/生成的。
谢谢,
贾塞克
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设置:
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
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




