Я сталкивался с различными методами при синтаксическом анализе XML в процедурах PL / SQL, таких как
Первый способ:
CURSOR datahold_xml(student_xmldoc IN xmltype) IS
SELECT extractvalue(value(t), '/Student/@Enrolled') Enrolled,
extractvalue(value(t), '/Student/SID') StudentID,
FROM TABLE(xmlsequence(extract(student_xmldoc , '/Student'))) t;
FOR tempresult_xml IN datahold_xml(student_xmldoc => l_xml) LOOP
IF UPPER(tempresult_xml.Enrolled) = UPPER('TRUE') THEN
/* Update Employee Information*/
UPDATE STUDENTTABLE st
SET st.firstname = tempresult_xml.FirstName,
st.lastname = tempresult_xml.LastName
WHERE st.SID= tempresult_xml.StudentID;
ELSE
/* Do Insert Operation*/
INSERT INTO STUDENTTABLE (SID,FIRSTNAME,LASTNAME,STATUS)
VALUES
(STUDENT_SEQ.NEXTVAL,tempresult_xml.FirstName, tempresult_xml.LastName,'A');
END IF;
END LOOP;
Другой использует XSL-процессор как
indoc := '<Student Enrolled="TRUE">
<SID>1</SID>
</Student>
<Student Enrolled="FALSE">
<SID>1</SID>
<FirstName>James</FirstName>
<LName>Cameron</LName>
</Student>';
indomdoc := dbms_xmldom.newDomDocument(indoc);
l_nl := dbms_xslprocessor.selectNodes(dbms_xmldom.makeNode(indomdoc),
'//STUDENT[@Enrolled="TRUE"]');
/* Loop to Update Student Information */
FOR cur_stu IN 0 .. dbms_xmldom.getLength(l_nl) - 1 LOOP
l_n := dbms_xmldom.item(l_nl, cur_stu);
stu_tab.extend;
stu_tab(stu_tab.first).FIRSTNAME := dbms_xslprocessor.valueOf(l_n,
'FirstName/text()');
stu_tab(stu_tab.first).LASTNAME := dbms_xslprocessor.valueOf(l_n,
'LName/text()');
stu_tab(stu_tab.first).SID := dbms_xslprocessor.valueOf(l_n,
'ID/text()');
/* Update Student Information*/
UPDATE STUDENTTABLE st
SET st.firstname = stu_tab(1).FIRSTNAME,
st.lastname = stu_tab(1).LASTNAME
WHERE es.SID= stu_tab(1).SID;
END LOOP;
Какой из вышеперечисленных методов дает лучшую производительность, используя курсоры или процессор xsl и DOM.
Пожалуйста, дайте мне знать, если есть какие-либо другие лучшие решения для анализа XML.
Я новичок в ORACLE и, следовательно, в процессе обучения ... Хотел попробовать несколько методов и хотел бы узнать, какой из них лучший.
Любая помощь будет принята с благодарностью.
Спасибо, Самир.