在PL SQL中以嵌套XML提取XML节点值

时间:2015-02-26 15:41:51

标签: sql oracle xmltable

我有像这样的XMLTYPE

<QuestionCategory>
   <categoryId>
   </categoryid>
   <questions>
      <question>
        <questionId>1</questionId>
        <questiontext>abc</questiontext>
      </question>
      <question>
      </question>
      <question>
      </question>
   </questions>  
</QuestionCategory>

我需要从这个XML中获取问题ID并将它们插入表中。 我怎样才能做到这一点。我试过通过'问题'节点循环。

1 个答案:

答案 0 :(得分:0)

您可以使用an XMLTable从XML结构中提取关系信息行。你已经用这个标记了这个问题,所以你可能只是试图实现它。

通过简单的大纲,您可以执行以下操作:

select *
from xmltable('/QuestionCategory/questions/question'
  passing your_xmltype_value
  columns question_id number path 'questionId',
    question_text varchar2(20) path 'questiontext'
);

使问题文本变量的大小与数据一样大,当然,要与现有的表结构相匹配 - 如果你想存储文本,那就是。

如果XMLType是表格中的一列,您可以使用连接传递它:

select x.*
from your_table
cross join xmltable('/QuestionCategory/questions/question'
  passing your_table.your_xmltype_column
  columns question_id number path 'questionId',
    question_text varchar2(20) path 'questiontext'
);

例如,使用固定文档:

select *
from xmltable('/QuestionCategory/questions/question'
  passing xmltype('<QuestionCategory>
   <categoryId>
   </categoryId>
   <questions>
      <question>
        <questionId>1</questionId>
        <questiontext>abc</questiontext>
      </question>
      <question>
        <questionId>2</questionId>
        <questiontext>def</questiontext>
      </question>
      <question>
        <questionId>3</questionId>
        <questiontext>ghi</questiontext>
      </question>
   </questions>  
</QuestionCategory>')
  columns question_id number path 'questionId',
    question_text varchar2(20) path 'questiontext'
);

QUESTION_ID QUESTION_TEXT       
----------- --------------------
          1 abc                  
          2 def                  
          3 ghi                  

然后,您可以轻松地将其用作insert ... select构造的基础。