XML到Oracle数据库列映射

我正在处理我们得到的xml消息。我必须读取xml并将其存储在4个不同的表中。

处理这个问题的最好方法是什么?可以说,如果XML模式已更改,那么可能会添加新列或者可能删除或重命名列等。

我们怎样才能做到这种松散耦合。对XML或数据库的任何更改都不需要更改代码?

谢谢,

0
额外 编辑
意见: 1
@tbone。我们从Tibco EMS读取XML。然后首先将xml消息存储在clob字段中。稍后我们检索XML并解析它,并且必须从XML中提取值并存储在4个不同的表中。
额外 作者 Naveen Chakravarthy,
我们计划使用数据库列名和表名进行XPath映射。但是在C#中,我们如何才能实现可扩展性,以便将来对XML或数据库的更改不需要更改代码。而且在将来我们可能需要解析不同的XML,即来自其他XML提供者。我们可能会从多个提供程序中获取不同模式的XML。
额外 作者 Naveen Chakravarthy,
你如何使用它存储在数据库后的XML?仅用于审计目的?你真的解析XML和商店关系?
额外 作者 tbone,

2 答案

不确定您打算如何使用曾经存储在Oracle中的XML,但如果仅仅为了审计目的而存储,则可以将XML存储在CLOB字段以及版本号和某些日期中。在单独的参考表中,将xml版本号与其dtd(以及创建/修改的日期)相关联。

0
额外
我们从Tibco EMS读取XML。然后首先将xml消息存储在clob字段中。稍后我们检索XML并解析它,并且必须从XML中提取值并存储在4个不同的表中。
额外 作者 Naveen Chakravarthy,

如果您使用的是Oracle 11G,则可以创建XMLTYPE变量 在PL/SQL过程中,然后您可以使用extract()函数 只检索想要作为字段的XML文档的各个部分。

在声明一个XMLTYPE类型的PL/SQL变量之后, 使用XMLTYPE.CREATEXML()函数来创建一个XMLTYPE变量。

V_INPUT_XML  := XMLTYPE.CREATEXML(V_TAB.INPUT_MESSAGE);

extract()PL/SQL函数返回一个XMLTYPE,我有 使用getclobval()将XMLTYPE转换为VARCHAR。

--V_OUTPUT_XML is set by a result of the extract() function 
--on an XMLTYPE
V_OUTPUT_STR := v_output_xml.getclobval();

至少在这一点上,你只需要改变你的PL/SQL就行了 指向您设置更改的字段的路径;改变 XML字段之外的文档(只要它们不 影响XPATH的字段)不应该要求更改 PL/SQL ..

0
额外
@A B目前我们的数据库是10g。规划11g,但不知道什么时候会发生。我们计划使用C#(LINQ to XML)解析,而不是使用Oracle XML功能。
额外 作者 Naveen Chakravarthy,