參照: Oracle存儲過程中使用游標來批量解析CLOB字段里面的xml字符串
背景:在寫存儲過程時,需要獲取表單提交的信息。表單信息是以xml格式的字符串存儲在colb類型的字段dataxml中,如何獲取呢?參考百度內容,寫一個function(函數),參數有xml格式字符串(dataxml值)和指定節點(nodeName),返回指定節點的值(nodeValue)。
編碼實現:
--get_xml_nodeValue實現 start
CREATE OR REPLACE FUNCTION get_xml_nodeValue(xmlStr CLOB, nodeName VARCHAR2) RETURN VARCHAR2 IS
--創建xml解析器實例xmlparser.Parser
xmlPar xmlparser.Parser := xmlparser.newParser;
--定義DOM文檔
xDoc xmldom.DOMDocument;
--定義item子節點數目變量
lenItme INTEGER;
--定義節點列表,存放item節點們
itemNodes xmldom.DOMNodeList;
--定義節點,存放單個item節點
itemNode xmldom.DOMNode;
valueReturn VARCHAR2 (100);
BEGIN
--解析xmlStr中xml字符串,並存放到xmlPar中
xmlparser.parseClob(xmlPar, xmlStr);
--將xmlPar中的數據轉存到dom文檔中
xDoc := xmlparser.getDocument(xmlPar);
--釋放解析器實例
xmlparser.freeParser(xmlPar);
--獲取所有item節點
itemNodes := xmldom.getElementsByTagName(xDoc, nodeName);
--獲取item節點的個數
lenItme := xmldom.getLength(itemNodes);
--如果無該標簽,則返回EMPTY
IF lenItme = 0 THEN
valueReturn := '';
ELSE
--獲取節點列表中的第1個item節點
itemNode := xmldom.item (itemNodes, 0);
--獲取所有子節點的值
valueReturn := xmldom.getNodeValue(xmldom.getFirstChild (itemNode));
END IF;
--釋放dom
xmldom.freeDocument(xDoc);
RETURN valueReturn;
END get_xml_nodeValue;
--get_xml_nodeValue實現 end
調用測試:
表:FORM_DATA;
字段:DATAXML,字段值:“<data><id>1</id><name>張三</name><phone>17700000000</phone><id_number>410527999909099999</id_number></data>”;
查詢1:select get_xml_nodeValue(f.dataxml, 'name') from form_data f; 結果:張三 ;
查詢2:select get_xml_nodeValue(f.dataxml, 'phone') from form_data f; 結果:17700000000 ;
查詢3:select get_xml_nodeValue(f.dataxml, 'id_number') from form_data f; 結果:410527999909099999 。
完!