在Oracle存储过程中搜索XML变量

时间:2013-11-11 22:57:26

标签: oracle stored-procedures

我正在尝试识别XML字符串中的“节点”。我对Oracle XML Functions没有任何经验。 XML字符串是使用XMLElement和XMLAgg函数在Stroed过程中生成的。如何识别节点RESULT.NAME的值?

我已在存储过程中声明了一个变量并尝试了以下操作,但存储过程无法编译。它给我一个错误,说“语句被忽略”     vRepResults:= XMLResults.EXTRACT('ZAVACOR_RESULTS / ORDERS / SAMPLE / TEST / RESULT / REPORTED_RESULT / text()')。getstringval();

此字符串存储在变量中,而不是表中,因此我不确定是否可以使用XQuery函数。我已经粘贴了下面的示例XML:

<ZAVACOR_RESULTS>
    <ORDERS>
        <X_EXTERNAL_ID>508106</X_EXTERNAL_ID>
        <X_ZAV_PROTOCOL></X_ZAV_PROTOCOL>
        <SAMPLE>
            <LABEL_ID>352453611</LABEL_ID>
            <STATUS>I</STATUS>
            <TEST>
                <ANALYSIS>_GLUCOSE_SO1_ENZ_001</ANALYSIS>
                <STATUS>I</STATUS>
                <RESULT>
                    <NAME>GLUCOSE</NAME>
                    <REPORTED_RESULT>
                        <REPORTED_VALUE>3</REPORTED_VALUE>
                    </REPORTED_RESULT>
                </RESULT> 
            </TEST>
        </SAMPLE>
        </ORDERS>
</ZAVACOR_RESULTS> 

1 个答案:

答案 0 :(得分:1)

下面的代码提取标记内的值。我不确定你的代码有什么问题,你能提供更多吗?如果愿意,可以声明vRepResultsXMLResults变量以及创建XMLResults的方式。

DECLARE
  v_name VARCHAR2(200);
  v_xml_str VARCHAR2(2000);
BEGIN
  v_xml_str := 
  '<ZAVACOR_RESULTS>
    <ORDERS>
        <X_EXTERNAL_ID>508106</X_EXTERNAL_ID>
        <X_ZAV_PROTOCOL></X_ZAV_PROTOCOL>
        <SAMPLE>
            <LABEL_ID>352453611</LABEL_ID>
            <STATUS>I</STATUS>
            <TEST>
                <ANALYSIS>_GLUCOSE_SO1_ENZ_001</ANALYSIS>
                <STATUS>I</STATUS>
                <RESULT>
                    <NAME>GLUCOSE</NAME>
                    <REPORTED_RESULT>
                        <REPORTED_VALUE>3</REPORTED_VALUE>
                    </REPORTED_RESULT>
                </RESULT> 
            </TEST>
        </SAMPLE>
    </ORDERS>
  </ZAVACOR_RESULTS>';

  v_name := xmltype(v_xml_str).extract('/ZAVACOR_RESULTS/ORDERS/SAMPLE/TEST/RESULT/NAME/text()').getStringVal();

  dbms_output.put_line(v_name);
END;

输出:

GLUCOSE