Oracle XMLDOM.GetNodeValue иногда возвращает ноль - PullRequest
0 голосов
/ 08 октября 2018

У меня есть следующий код для анализа переменной CLOB, содержащей элементы XML, и сохранения ее в переменной.Код выглядит следующим образом:

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 голосов
/ 08 октября 2018

Мое предложение было бы оператором выбора, где вы используете массовый сбор для получения переменных.Я написал выбор, чтобы показать вам, что я имею в виду:

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('/*/*', вы получите тот же результат.НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...