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

news2024/11/24 16:40:46

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.

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

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

ORACLE文档中描述的是:

在这里插入图片描述

那么如果不提供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;
/

PG联想

简化一下,输入为:

<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
);

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/639310.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每天一道大厂SQL题【Day25】脉脉真题实战(一)每日活跃用户

文章目录 每天一道大厂SQL题【Day25】脉脉真题实战(一)每日活跃用户每日语录第25题&#xff1a;1. 需求列表1. 初级题: 每日活跃用户 思路分析(1) 创建表(2) 思路 答案获取加技术群讨论附表文末SQL小技巧 后记 每天一道大厂SQL题【Day25】脉脉真题实战(一)每日活跃用户 大家好…

【React】路由,Hooks

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录 路由Navigate导航组件 路由的嵌套useNavigate路由传递参数route配置抽取 路由 通过Link组件就可…

AntDB 事务机制

全局一致性 AntDB 的集群架构包括&#xff0c;一个 GTM&#xff08;Global Transaction Manager&#xff09;、多个Coordinator&#xff08;CN&#xff09;、多个 Datanode&#xff08;DN&#xff09;。其中 GTM 负责给其他的 DN 和CN 分发集群全局唯一的事务号和集群当前判断…

QT--配置Opencv

提示&#xff1a;本文为学习记录&#xff0c;若有疑问&#xff0c;请及时联系作者。 文章目录 前言一、下载已编译的opencv1..解压2..path路径 二、使用步骤1..pro文件2..h文件 总结 前言 只做第一个我&#xff0c;不做第二个谁。 一、下载已编译的opencv 适用于mingw编译器…

如何学习数据结构与算法? - 易智编译EaseEditing

学习和提升数据结构与算法的能力可以通过以下几个步骤&#xff1a; 学习基础知识&#xff1a; 了解数据结构和算法的基本概念和原理&#xff0c;包括常见的数据结构&#xff08;如数组、链表、栈、队列、树、图等&#xff09;和算法&#xff08;如排序、搜索、图算法等&#…

GreenPlum监控工具GPCC部署

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

Fiddler抓包工具之fiddler的命令行窗口用法

fiddler的命令行窗口的相关命令 在fiddler官网有QuickExec使用教程&#xff0c;地址是http://docs.telerik.com/fiddler/knowledgebase/quickexec QuickExec 命令行窗口位于fiddler左下角黑色输入框&#xff0c;如下图&#xff1a; 按ALT Q&#xff0c;将焦点快速设置到Quic…

initramfs 最全解释与制作

先提几个问题&#xff1a; 0、什么是 initrd 和 initramfs&#xff1f; 概述 现代Linux系统都使用到了一种功能比较特殊的微型系统&#xff0c;作为Linux内核初始化完成但未进入最终系统时的过渡系统&#xff0c;主要的目的是为了将最终系统载入到根文件系统上&#xff0c;辅…

这个618,网工最值得买的路由器/交换机设备

大家好&#xff0c;我是老杨。 有小友最近扎堆冒出来问我&#xff0c;企业要采购路由器/交换机&#xff0c;买啥牌子好&#xff0c;买啥型号好。 又或者是&#xff0c;家里要买家用的路由器/电脑&#xff0c;啥性价比最高&#xff1f; 我真的很想吐槽一句&#xff0c;你们再问…

敏捷软件测试常见的七个误区

敏捷软件开发是从1990年代开始逐渐引起广泛关注的一种新型软件开发方法&#xff0c;是能够应对快速变化的需求的一种软件开发能力&#xff0c;它作为一种新型的开发模式&#xff0c;被越来越多地应用到软件项目中。 敏捷软件测试指的是在敏捷软件开发过程中跟质量相关的一系列…

Appium+Python3环境搭建,其实超简单!

appium可以说是做app最火的一个自动化框架&#xff0c;它的主要优势是支持android和ios&#xff0c;另外脚本语言也是支持java和Python。略懂Python&#xff0c;所以接下来的教程是appiumpython&#xff0c;自己搭建环境的时候&#xff0c;按照某些博客安装遇到各种奇葩问题&am…

【新版】系统架构设计师 - 嵌入式技术

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 嵌入式技术考点摘要嵌入式系统嵌入式系统开发与设计交叉开发环境软硬件协同设计嵌入式软件移植低功耗设计 嵌入式硬件嵌入式微处理器人工智能芯片微处理器体系结构 嵌入式操作系统&#xff08;EOS…

大涨39.9%!连续三季度蝉联全球第三,联想服务器做对了什么?

市场调查公司IDC最新发布的2023年第一季度x86服务器全球市场追踪报告显示&#xff0c;联想集团当季实现了39.9%的大幅增长、市场份额连续三季度蝉联全球第三&#xff0c;而全球排名前五厂商中戴尔下降25.1%、HPE微涨0.6%、浪潮下降38.7%、超微&#xff08;Super Micro&#xff…

考友经验分享——考研英语怎么答题

&#xff08;注&#xff1a;我的英语一般&#xff0c;这是其他人的考研英语经验&#xff0c;仅供参考&#xff0c;要早日找到适合自己的方法&#xff01;&#xff09; 管卫东老师的《管卫东的考研英语阅读最后冲刺阅读突破——技巧与总结》&#xff0c;觉得收获不小&#xff0…

python工具方法 41 对VOC|YOLO格式的数据进行resize操作

在目标检测中,相比于yolo格式,voc格式和coco格式都使用绝对值描述boxes的size,这在多数据集融合时存在一定的缺陷。尤其是在存在超高清影像中(在数据集中存在超高清影像通常会使dataloader内存不够用,或导致数据加载卡顿),我们不能仅对图像进行resize操作(还需要同时对…

软件测试基础知识必备之浅谈单元测试

什么是单元测试&#xff1f; 单元测试是指&#xff0c;对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作&#xff0c;这里的最小可测试单元通常是指函数或者类。 单元测试都是以自动化的方式执行&#xff0c;所以在大量回归测试的场景下更能带来…

Docker consul的容器

consul服务更新和服务发现 什么是服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的&#xff0c;不保障高可用性&#xff0c;也不考虑服务的压力承载&#xff0c;服务之间调用单纯的通过接口访问。直到后来出现了多个节点的分布式架构&…

Android Studio实现简单的页面跳转(简单教程)

项目实现:(实现Android Studio 基本有两种实现方式&#xff1a;一种为.MainActivity跳转&#xff1b;第二种是Relatelayout布局跳转。 这里着重介绍第一种&#xff1a;&#xff08;首先需要建立两个XML文件&#xff0c;进行布局的相互的跳转&#xff0c;然后使用两个JAVA进行相…

一文讲透!实现一个Python+Selenium的自动化测试框架如此简单!

首先你得知道什么是Selenium&#xff1f; Selenium是一个基于浏览器的自动化测试工具&#xff0c;它提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。Selenium主要包括三部分&#xff1a;Selenium IDE、Selenium WebDriver 和Selenium Grid。 Selenium IDE&#xff1…

低代码崛起:会让程序员饭碗不保,人工智能或成其催化剂

人工智能技术目前发展的趋势如何 关于人工智能技术的评价&#xff0c;大众的评价几乎算是较为一致的&#xff0c;都认为其已成为人类有史以来最具革命性的技术之一。当然了&#xff0c;可能目前的我们还是很难想象机器自主决策所产生的影响&#xff0c;但可以肯定的是&#xff…