【问题标题】:Oracle Query in XML FileXML 文件中的 Oracle 查询
【发布时间】:2017-10-02 01:55:30
【问题描述】:

我希望得到您的帮助,因为我想从 XML 文件中的每条记录中提取 XML 字符串,然后我需要将选定的记录插入到 clob 字段中。非常感谢您的帮助。

注意:我在 Dep.xml 中有 xml 结构

<?xml version="1.0" encoding="UTF-8"?> <dataroot xmlns:od="urn:schemas-
microsoft-com:officedata" generated="2017-09-20T17:59:05"> 
<Dep><ID>157</ID> <ORDER>7</ORDER> <SIGS>PPQ (PRAS)</SIGS> </Dep> 
<Dep><ID>157</ID> <ORDER>7</ORDER> <SIGS>PPQ (PRAS)</SIGS> </Dep>

我想从查询中得到这个:

No. Reg.| XML
   1    | <?xml version="1.0" encoding="UTF-8"?> <Dep><ID>157</ID><ORDER>7</ORDER><SIGS>PPQ (PRAS)</SIGS></Dep>
   2    | <?xml version="1.0" encoding="UTF-8"?> <Dep><ID>7</ID><ORDER>19</ORDER><SIGS>PPT</SIGS></Dep>

之后;将注册表插入到 clob 字段中

 No. Reg.|CLOB FIELD
    1    |<?xml version="1.0" encoding="UTF-8"?> <Dep><ID>157</ID><ORDER>7</ORDER><SIGS>PPQ (PRAS)</SIGS></Dep>
    2    |<?xml version="1.0" encoding="UTF-8"?> <Dep><ID>7</ID><ORDER>19</ORDER><SIGS>PPT</SIGS></Dep>

【问题讨论】:

  • 文件dep.xml在哪里?你想如何加载文件?这是一次性的练习还是您需要构建可重用的功能?为什么dep.xml 不是格式良好的 XML 文档?为什么要将其存储在 CLOB 列中而不是 XMLType 中?

标签: xml database oracle insert clob


【解决方案1】:

例如,你可以使用xmlsequence+表函数从xml中提取所有部门,然后getClobVal将XMLType值转换为Clob:

with t as
(
select XMLTYPE(
    '<?xml version="1.0" encoding="UTF-8"?> <dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2017-09-20T17:59:05"> 
    <Dep><ID>157</ID> <ORDER>7</ORDER> <SIGS>PPQ (PRAS)</SIGS> </Dep> 
    <Dep><ID>157</ID> <ORDER>7</ORDER> <SIGS>PPQ (PRAS)</SIGS> </Dep>
    </dataroot>') as xml_
from dual
)
select rownum as "No. Reg.", 
       XMLRoot(s.column_value, VERSION '1.0" encoding="UTF-8') as XML, 
       XMLRoot(s.column_value, VERSION '1.0" encoding="UTF-8').getClobVal()  as "CLOB FIELD"
 from t, table(xmlsequence(EXTRACT(t.xml_, '/dataroot/Dep'))) s

【讨论】:

  • 您好,感谢您的回答,它可以工作,但是现在当我粘贴完整的 XML 字符串时;开发人员向我发送此错误 01704.00000“字符串文字太长”原因:字符串长度超过 4000 个字符
  • @Noé Arciniega,是的,因为您的 xml 无法转换为 VARCHAR2(默认情况下是字符串文字)。您应该将您的 XML 文件内容放入 CLOB 字段中的表中(从 YOUR_TABLE_NAME 中选择 xml_type(YOUR_CLOB_FIELD_NAME) 作为 xml_)或 XML_TYPE 列(从 YOUR_TABLE_NAME 中选择 YOUR_XMLTYPE_FIELD_NAME 作为 xml_)
【解决方案2】:

使用XMLTABLE

SQL Fiddle

Oracle 11g R2 架构设置

CREATE TABLE registries (
  id INTEGER,
  value CLOB
);

INSERT INTO registries ( id, value )
WITH xml ( value ) AS (
  SELECT '<?xml version="1.0" encoding="UTF-8"?><dataroot xmlns:od="urn:schemas-
microsoft-com:officedata" generated="2017-09-20T17:59:05"><Dep><ID>157</ID> <ORDER>7</ORDER> <SIGS>PPQ (PRAS)</SIGS></Dep> 
<Dep><ID>157</ID> <ORDER>7</ORDER> <SIGS>PPQ (PRAS)</SIGS></Dep></dataroot>'
  FROM DUAL
)
SELECT t.rn,
       XMLRoot( t.xml, VERSION '1.0" encoding="UTF-8' ).getClobVal()
FROM   xml x
       CROSS JOIN
       XMLTABLE(
         '/dataroot/Dep'
         PASSING XMLTYPE( x.value )
         COLUMNS rn FOR ORDINALITY,
                 xml XMLTYPE PATH '.'
       ) t;

查询 1

SELECT * FROM registries

Results

| ID |                                                                                                VALUE |
|----|------------------------------------------------------------------------------------------------------|
|  1 | <?xml version="1.0" encoding="UTF-8"?><Dep><ID>157</ID><ORDER>7</ORDER><SIGS>PPQ (PRAS)</SIGS></Dep> |
|  2 | <?xml version="1.0" encoding="UTF-8"?><Dep><ID>157</ID><ORDER>7</ORDER><SIGS>PPQ (PRAS)</SIGS></Dep> |

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多