从oracle XML类型列中提取数据

时间:2018-01-17 09:27:27

标签: xml oracle

表格中的XML就是这样的

<?xml version="1.0" encoding="UTF-8"?>
<select multiselect="false" name="c_f_2441_select_dev" phiField="true" readOnly="false" title="select_dev">
  <dataValidationRule/>
  <CFData>false</CFData>
  <suppressRules>false</suppressRules>
  <options>
    <option code="1" status="A">Sel1</option>
    <option code="2" status="A">Sel2</option>
    <option code="3" status="A">Sel3</option>
  </options>
  <groups/>
</select>

在“options”元素中有三个值'Sel1','Sel2'和'Sel3'

select xt.* 
from  ST3_ENT1_REG4.custom_field cf,
      XMLTABLE('/select'
      PASSING cf.data_model_xml
         COLUMNS 
           options   VARCHAR2(20)  PATH 'options'
          ) xt
where field_name='c_f_2441_select_dev';

以上查询连接三个值,并将输出作为“Sel1Sel2Sel3”。有没有办法可以在三个不同的行中得到这三个值。

由于

1 个答案:

答案 0 :(得分:2)

SQL Fiddle

Oracle 11g R2架构设置

CREATE TABLE custom_field ( field_name, data_model_xml ) AS
SELECT
'c_f_2441_select_dev',
XMLTYPE( '<?xml version="1.0" encoding="UTF-8"?>
<select multiselect="false" name="c_f_2441_select_dev" phiField="true" readOnly="false" title="select_dev">
  <dataValidationRule/>
  <CFData>false</CFData>
  <suppressRules>false</suppressRules>
  <options>
    <option code="1" status="A">Sel1</option>
    <option code="2" status="A">Sel2</option>
    <option code="3" status="A">Sel3</option>
  </options>
  <groups/>
</select>' ) FROM DUAL;

查询1

如果您只想要第1,第2和第3选项元素的内容:

select xt.* 
from  custom_field cf,
      XMLTABLE('/select/options'
      PASSING cf.data_model_xml
         COLUMNS 
           option1   VARCHAR2(20)  PATH 'option[1]',
           option2   VARCHAR2(20)  PATH 'option[2]',
           option3   VARCHAR2(20)  PATH 'option[3]'
          ) xt
where field_name='c_f_2441_select_dev'

<强> Results

| OPTION1 | OPTION2 | OPTION3 |
|---------|---------|---------|
|    Sel1 |    Sel2 |    Sel3 |

查询2

如果你想要code属性为1,2和3的选项元素的文本,那么:

select xt.* 
from  custom_field cf,
      XMLTABLE('/select/options'
      PASSING cf.data_model_xml
         COLUMNS 
           option1   VARCHAR2(20)  PATH 'option[@code=1]',
           option2   VARCHAR2(20)  PATH 'option[@code=2]',
           option3   VARCHAR2(20)  PATH 'option[@code=3]'
          ) xt
where field_name='c_f_2441_select_dev'

<强> Results

| OPTION1 | OPTION2 | OPTION3 |
|---------|---------|---------|
|    Sel1 |    Sel2 |    Sel3 |

查询3 - 更新 - 在单独的行中。

select xt.* 
from  custom_field cf,
      XMLTABLE(
        '/select/options/option'
        PASSING cf.data_model_xml
        COLUMNS value VARCHAR2(20) PATH 'text()'
      ) xt
where field_name='c_f_2441_select_dev'

<强> Results

| VALUE |
|-------|
|  Sel1 |
|  Sel2 |
|  Sel3 |
相关问题