Oracle中xmltype类型toObject函数用法实例

这篇具有很好参考价值的文章主要介绍了Oracle中xmltype类型toObject函数用法实例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Oracle中xmltype类型toObject函数用法总结。

用法总结

【实例一】
xmltype是oracle中的type object类型。在实际使用中,可以当做xml对象来使用:

set serveroutput on

drop type person_typex;
create type person_typex is object (
    name varchar2(32),
    age number
);
/

declare
  xmltype_var xmltype;
  person_obj person_typex;
begin
  xmltype_var := xmltype('<root><NAME>John Doe</NAME><AGE>30</AGE></root>');
  xmltype_var.toObject(person_obj);

  dbms_output.put_line(person_obj.name);
  dbms_output.put_line(person_obj.age);
end;
/

执行结果

John Doe
30

PL/SQL procedure successfully completed.

【实例二】嵌套类型

注意嵌套类型对应到xml上,需要以嵌套类型的名字为根节点:参考下面例子的person字段。

set serveroutput on

drop type person_typexxx;
drop type person_typex;
create type person_typex is object (
    name varchar2(32),
    year number
);
/

create type person_typexxx is object (
    namex varchar2(32),
    person person_typex
);
/

set serveroutput on

declare
  xmltype_var xmltype;
  person_obj person_typexxx;
begin
  xmltype_var := xmltype('<a123><NAMEX>John Doe</NAMEX><PERSON><NAME>John Doe</NAME><YEAR>30</YEAR></PERSON></a123>');
  xmltype_var.toObject(person_obj);
end;
/

toObject函数实际将xmltype类型变量中的值,输出到自定义类型中。

那么这里最关键的是如何将xml的字段 mapping 到自定义类型中。

ORACLE文档中描述的是:

Oracle中xmltype类型toObject函数用法实例

那么如果不提供schema的话,cannonical映射规则到底如何?文档中没有进一步描述。

下面做一些验证,这里总结下:

  1. 首先,必须是合法的XML类型。
  2. xml中的每一列都必须匹配到自定义类型中。不允许出现多余的列、重复的列。
  3. 顺序不能乱,指的是xml中可以缺少一些字段,但字段的出现顺序必须和自定义类型一致。
    • 例如:<a123><NAME>John Doe</NAME><YEAR>30</YEAR></a123>
    • 自定类型:name varchar2(32), age number, year number 是可以匹配的。
    • 但如果:<a123><YEAR>30</YEAR><NAME>John Doe</NAME></a123> 是不能匹配的。

验证过程

位置不匹配?不支持;
多一列?不支持;
位置反了?不支持;

declare
  xmltype_var xmltype;
  person_obj person_typex;
begin
  xmltype_var := xmltype('<r1><NAME>John Doe</NAME><AA>a</AA><AGE>30</AGE></r1>');
  xmltype_var.toObject(person_obj);

  dbms_output.put_line(person_obj.name);
  dbms_output.put_line(person_obj.age);
end;
/

ORA-19031: XML element or attribute AA does not match any in type SYS.PERSON_TYPEX


缺后一列?支持;
缺前一列?支持;


set serveroutput on
declare
  xmltype_var xmltype;
  person_obj person_typex;
begin
  xmltype_var := xmltype('<r1><NAME>John Doe</NAME></r1>');
  xmltype_var.toObject(person_obj);

  dbms_output.put_line(person_obj.name);
  dbms_output.put_line(person_obj.age);
end;
/

数据类型不对?不支持

declare
  xmltype_var xmltype;
  person_obj person_typex;
begin
  xmltype_var := xmltype('<r1><NAME>John Doe</NAME><AGE>aaa</AGE></r1>');
  xmltype_var.toObject(person_obj);

  dbms_output.put_line(person_obj.name);
  dbms_output.put_line(person_obj.age);
end;
/

ORA-01722: invalid number


xml两层?不支持

declare
  xmltype_var xmltype;
  person_obj person_typex;
begin
  xmltype_var := xmltype('<outter><root><NAME>John Doe</NAME><AGE>30</AGE></root></outter');
  xmltype_var.toObject(person_obj);

  dbms_output.put_line(person_obj.name);
  dbms_output.put_line(person_obj.age);
end;
/

ORA-31011: XML parsing failed
ORA-19202: Error occurred in XML processing


xml根节点是任意值?支持

declare
  xmltype_var xmltype;
  person_obj person_typex;
begin
  xmltype_var := xmltype('<a123><NAME>John Doe</NAME><AGE>30</AGE></a123>');
  xmltype_var.toObject(person_obj);

  dbms_output.put_line(person_obj.name);
  dbms_output.put_line(person_obj.age);
end;
/

简单类型Postgresql替代方法

简化一下,输入为:

<a123><NAME>John Doe</NAME><YEAR>30</YEAR></a123>

输出元组

{NAME = 'John Doe', YEAR = 30}

在PostgreSQL中,使用xmltable函数可以实现类似效果:

select * from 
xmltable(
  '/a123' 
  passing '<a123><name>John Doe</name><YEAR>30</YEAR></a123>' 
  columns 
    name text, 
    "YEAR" int
);

Oracle中xmltype类型toObject函数用法实例

复合类型Postgresql替代方法

测试1:无法展开

drop type ctype01;
create type ctype01 as (name text, year int);
select * from 
xmltable(
  '/a123' 
  passing '<a123><person><name>John Doe</name><year>30</year></person></a123>' 
  columns 
    person ctype01
);

结果

ERROR:  malformed record literal: "John Doe30"
DETAIL:  Missing left parenthesis.

测试2:没有展开

展开明显是没实现的。

record只能从xml读取括号的行格式。

drop type ctype01;
create type ctype01 as (a int, b int);

select * from 
xmltable(
  '/a123' 
  passing '<a123><person>(100, 200)</person></a123>'
  columns 
    person ctype01
);

结果

  person   
-----------
 (100,200)

测试3

select * from 
xmltable(
  '/a123'
  passing '<a123><name>John Doe</name><year>30</year></a123>' 
  columns 
    person ctype01,
    year int,
    name text
);

结果

 person | year |   name   
--------+------+----------
        |   30 | John Doe

测试4:table_to_xml导出表(有复合类型)结构

drop type i_type;
create type i_type as (i1 int, i2 int);

drop type o_type;
create type o_type as (o1 int,  o2 i_type);

create table tbl_x01 (a int, b o_type);

insert into tbl_x01 values (1, (1, (100,200)::i_type)::o_type);
insert into tbl_x01 values (2, row(2, (200,300)::i_type));
insert into tbl_x01 values (3, (3, (300,400)));

postgres=# select * from tbl_x01;
 a |        b        
---+-----------------
 1 | (1,"(100,200)")
 2 | (2,"(200,300)")
 3 | (3,"(300,400)")

使用table_to_xml导出,会展开内层结构吗:不会。文章来源地址https://www.toymoban.com/news/detail-490617.html

postgres=# select table_to_xml('tbl_x01', false, false, '');
                             table_to_xml                              
-----------------------------------------------------------------------
 <tbl_x005F_x01 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">+
                                                                      +
 <row>                                                                +
   <a>1</a>                                                           +
   <b>(1,"(100,200)")</b>                                             +
 </row>                                                               +
                                                                      +
 <row>                                                                +
   <a>2</a>                                                           +
   <b>(2,"(200,300)")</b>                                             +
 </row>                                                               +
                                                                      +
 <row>                                                                +
   <a>3</a>                                                           +
   <b>(3,"(300,400)")</b>                                             +
 </row>                                                               +
                                                                      +
 </tbl_x005F_x01>                                                     +
 
(1 row)

结论:不支持复合类型使用xmltable展开。

到了这里,关于Oracle中xmltype类型toObject函数用法实例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python的join函数的用法及实例

    目录 1.join函数的语法及用法 (1)语法:\\\'sep\\\'.join(sep_object) (2)用法:连接任意数量的字符串(包括要连接的元素字符串、元组、列表、字典),用新的目标分隔符连接,返回新的字符串。 2.join函数的实例 (1)对象为字符串 (2)对象为元组 (3)对象为列表 (4)对象为字

    2024年01月23日
    浏览(41)
  • python的自定义函数的用法和实例

    目录 1.自定义函数的语法和用法 (1)引入 (2)语法 (3)用法:用于自定义目标函数语法。 (4)调用函数 ①语法 ②解释 2.实例 (1)简单的用法 (2)与input函数、while语句结合使用 python语言调用的求和sum()、replace等函数是已经定义好的函数,而我们想要调用自己想要的函

    2024年02月08日
    浏览(47)
  • SQL的from_unixtime函数的用法实例

    目录 1.from_unixtime的语法及用法 (1)语法:from_unixtime(timestamp ,date_format) (2)用法:将时间戳转为指定日期格式。 (3)常见的日期格式 2.实例 即from_unixtime(时间戳 ,日期格式 参数说明 timestamp :时间戳,可为一串数字,也可为字段。 date_format:时间格式,不填默认为%Y-%m-%d

    2023年04月21日
    浏览(37)
  • SQL的substring函数及其用法实例——MYSQL另一种截取目标字符的函数

    目录 1.substring()的语法和用法实例 (1)两个参数的语法和用法实例 ①语法:substring(string ,index)|substring(string from index) ②用法实例: 从指定字符串的某序数开始获取字符 (2)三个参数的语法和用法实例 ①语法:substring(string ,index,len)|substring(string from index for len) ②用法实

    2023年04月08日
    浏览(74)
  • 【实例】POSTGRE SQL如何用age函数实现两个日期之间的差值计算用法及代码示例

    【实例】POSTGRE SQL如何用age函数实现两个日期之间的差值计算用法及代码示例 工作中遇到需要计算两个日期之间的月份差值、天数差值,百度到的众多内容自己通过实践整理后,将最终的计算结果分享给大家 例: 用到的函数:age(end_date,start_date) age函数常用来计算年龄,计算

    2024年02月04日
    浏览(62)
  • JavaScript Es6_2笔记 (深入对象 + 内置构造函数 + 包装类型)+包含实例方法

    了解面向对象编程的基础概念及构造函数的作用,体会 JavaScript 一切皆对象的语言特征,掌握常见的对象属性和方法的使用。 了解面向对象编程中的一般概念 能够基于构造函数创建对象 理解 JavaScript 中一切皆对象的语言特征 理解引用对象类型值存储的的

    2024年02月12日
    浏览(46)
  • python Format()函数的用法___实例详解(一)(全,例多)___各种格式化替换,format对齐打印

    (格式化替换,替换,列表字典替换,类格式化, 魔法函数格式化,对齐及填充格式化,format对齐打印) 本篇目录内容: 📘  一、format() 函数的语法 📘  二、format() 函数基本用法 📘  三、用对齐及填充的方式格式化 📘  四、用format函数实现对齐打印 📘  五、其他内容待

    2024年02月07日
    浏览(83)
  • send()函数的用法;MSG_NOSIGNAL什么含义?有什么作用?以及flags中参数类型有哪些各自又起到什么作用?

    目录  1.send()函数的基本用法(入门级): 2.MSG_NOSIGNAL什么含义?有什么作用? 3.send()函数中第4个flags中参数类型有哪些各自又起到什么作用? send() 函数是一个用于在 TCP/IP 网络上发送数据的系统调用函数。它通常在客户端和服务器端程序中被使用。 send() 函数的语法如下: 其

    2024年02月07日
    浏览(43)
  • oracle unpivot用法

    Oracle UNPIVOT函数是将列旋转为行的一种方式。UNPIVOT函数可以将多个列转换为对应的行,以便进行聚合或插入操作。UNPIVOT函数可以将多个列转换为对应的行,以便进行聚合或插入操作。下面是使用UNPIVOT函数的示例: 假设我们有一个表,其中包含以下列: ID Name Age Gender 我们希

    2024年02月16日
    浏览(36)
  • @XmlType,@XmlRootElement,@XmlAttribute的作用与区别

    @XmlType、@XmlRootElement 和 @XmlAttribute 都是 Java 标准库中 javax.xml.bind.annotation 包提供的注解,用于在使用 JAXB(Java Architecture for XML Binding)或其他 XML 绑定技术时,控制 Java 类与 XML 数据之间的映射关系。 它们各自有不同的作用和用途: @XmlType 注解用于控制类或枚举类型的映射,

    2024年02月11日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包