Oracle XMLDOM.GetNodeValue有时返回null

时间:2018-10-08 09:59:37

标签: xml oracle

我有以下代码来解析包含XML元素的CLOB变量并将其存储到变量中。代码如下:

DECLARE
    myinput CLOB;
    userId VARCHAR2(100);
    xmlDoc xmldom.DOMDocument;
    xmlRootNode xmldom.DOMNode;
    xmlRowList xmldom.DOMNodeList;
    xmlRow xmldom.DOMElement;
    rowNo VARCHAR2(8);
    stfNo VARCHAR2(6);
    modC    VARCHAR2(12);
    coordTpC   VARCHAR2(4);
    coordRemark  VARCHAR2(4000);
BEGIN
    myinput := '<NewDataSet><Table1><RowNo>1</RowNo><STF_N>STF_1</STF_N><MOD_C>MOD_1</MOD_C><COORD_TP_C>COORD_1</COORD_TP_C><COORD_REMARK>REMARK_1</COORD_REMARK></Table1><Table1><RowNo>2</RowNo><STF_N>STF_2</STF_N><MOD_C>MOD_2</MOD_C><COORD_TP_C>COORD_2</COORD_TP_C><COORD_REMARK>REMARK_2</COORD_REMARK></Table1><Table1><RowNo>3</RowNo><STF_N>STF_3</STF_N><MOD_C>MOD_3</MOD_C><COORD_TP_C>COORD_3</COORD_TP_C><COORD_REMARK>REMARK_3</COORD_REMARK></Table1><Table1><RowNo>4</RowNo><STF_N>STF_4</STF_N><MOD_C>MOD_4</MOD_C><COORD_TP_C>COORD_4</COORD_TP_C><COORD_REMARK>REMARK_4</COORD_REMARK></Table1></NewDataSet>';

    xmlDoc := UI20_PKG_QETAdm.parse(myinput);
    xmlRootNode := xmldom.MAKENODE(xmldom.getDocumentElement(xmlDoc));
    xmlRowList := xmldom.GETCHILDNODES(xmlRootNode);

    FOR rowCount IN 0 .. (xmldom.GETLENGTH(xmlRowList) - 1) LOOP
        xmlRow := xmldom.makeElement(xmldom.item(xmlRowList, rowCount));
        rowNo := xmldom.GETNODEVALUE(xmldom.GETFIRSTCHILD((xmldom.item(xmldom.getElementsByTagName(xmlRow, 'RowNo'), 0))));
        stfNo := xmldom.GETNODEVALUE(xmldom.GETFIRSTCHILD((xmldom.item(xmldom.getElementsByTagName(xmlRow, 'STF_N'), ''))));
        modC := xmldom.GETNODEVALUE(xmldom.GETFIRSTCHILD((xmldom.item(xmldom.getElementsByTagName(xmlRow, 'MOD_C'), ''))));
        coordTpC := xmldom.GETNODEVALUE(xmldom.GETFIRSTCHILD((xmldom.item(xmldom.getElementsByTagName(xmlRow, 'COORD_TP_C'), ''))));
        coordRemark := xmldom.GETNODEVALUE(xmldom.GETFIRSTCHILD((xmldom.item(xmldom.getElementsByTagName(xmlRow, 'COORD_REMARK'), ''))));

        DBMS_OUTPUT.PUT_LINE('rowNo ' || rowNo);
        DBMS_OUTPUT.PUT_LINE('stfNo ' || stfNo);
        DBMS_OUTPUT.PUT_LINE('modC ' || modC);
        DBMS_OUTPUT.PUT_LINE('coordTpC ' || coordTpC);
        DBMS_OUTPUT.PUT_LINE('coordRemark ' || coordRemark);
    END LOOP;
END;

但是我对所有rowNo,stfNo,modC,coordTpC,coordRemark都一无所获。在某些情况下,我的SP可以读取该值,这很奇怪,但是在以后的某个时候,它将抱怨该值为NULL。可能导致这种情况的因素有哪些?

我尝试使用OracleSQLDeveloper,这是我从DBMS_OUTPUT.PUT_LINE命令获得的输出

rowNo 1
stfNo 
modC 
coordTpC 
coordRemark 
rowNo 2
stfNo 
modC 
coordTpC 
coordRemark 
rowNo 3
stfNo 
modC 
coordTpC 
coordRemark 
rowNo 4
stfNo 
modC 
coordTpC 
coordRemark 

如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我的建议是选择语句,您可以在其中使用批量收集来获取变量。我写了选择书以向您展示我的意思:

with the as (select xmltype('<NewDataSet><Table1><RowNo>1</RowNo><STF_N>STF_1</STF_N><MOD_C>MOD_1</MOD_C><COORD_TP_C>COORD_1</COORD_TP_C><COORD_REMARK>REMARK_1</COORD_REMARK></Table1><Table1><RowNo>2</RowNo><STF_N>STF_2</STF_N><MOD_C>MOD_2</MOD_C><COORD_TP_C>COORD_2</COORD_TP_C><COORD_REMARK>REMARK_2</COORD_REMARK></Table1><Table1><RowNo>3</RowNo><STF_N>STF_3</STF_N><MOD_C>MOD_3</MOD_C><COORD_TP_C>COORD_3</COORD_TP_C><COORD_REMARK>REMARK_3</COORD_REMARK></Table1><Table1><RowNo>4</RowNo><STF_N>STF_4</STF_N><MOD_C>MOD_4</MOD_C><COORD_TP_C>COORD_4</COORD_TP_C><COORD_REMARK>REMARK_4</COORD_REMARK></Table1></NewDataSet>') xml_ from dual) 
select tt.*
    from the t,
    xmltable('/NewDataSet/Table1'
        PASSING t.xml_ 
        columns 
            rowNo varchar2(10) path 'RowNo', 
            stfNo varchar2(10) path 'STF_N',
            modC varchar2(10) path 'MOD_C',
            coordTpC varchar2(10) path 'COORD_TP_C',
            coordRemark VARCHAR2(10) path 'COORD_REMARK'
    ) tt;

结果:

"ROWNO","STFNO","MODC" ,"COORDTPC","COORDREMARK"
"1"    ,"STF_1","MOD_1","COORD_1" ,"REMARK_1"
"2"    ,"STF_2","MOD_2","COORD_2" ,"REMARK_2"
"3"    ,"STF_3","MOD_3","COORD_3" ,"REMARK_3"
"4"    ,"STF_4","MOD_4","COORD_4" ,"REMARK_4"

如果您需要更多输入,请告诉我。 HTH

编辑:要回答以下问题。是的,不需要硬编码。这是标准的XQuery。如果将xmltable('/NewDataSet/Table1'替换为xmltable('/*/*',则会得到相同的结果。 HTH