我有以下代码来解析包含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
如何解决这个问题?
答案 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